2013-08-04 3 views
1

Я пытаюсь загрузить записанный звуковой файл, который уже находится в формате m4a, на веб-сервер.Загрузка звукового файла на сервер

Вот код, который нуждается в коррекции:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Disable Stop/Play button when application launches 
    [stopButton setEnabled:NO]; 
    [playButton setEnabled:NO]; 

    // Set the audio file 
    pathComponents = [NSArray arrayWithObjects: 
           [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], 
           @"MyAudioMemo.m4a", 
           nil]; 
    outputFileURL = [NSURL fileURLWithPathComponents:pathComponents]; 

    // Setup audio session 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 

    // Define the recorder setting 
    NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; 

    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 

    // Initiate and prepare the recorder 
    recorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSetting error:nil]; 
    recorder.delegate = self; 
    recorder.meteringEnabled = YES; 
    [recorder prepareToRecord]; 
} 

- (IBAction)recordPauseTapped:(id)sender { 
    // Stop the audio player before recording 
    if (player.playing) { 
     [player stop]; 
    } 

    if (!recorder.recording) { 
     AVAudioSession *session = [AVAudioSession sharedInstance]; 
     [session setActive:YES error:nil]; 

     // Start recording 
     [recorder record]; 
     [recordPauseButton setTitle:@"Pause" forState:UIControlStateNormal]; 

    } else { 

     // Pause recording 
     [recorder pause]; 
     [recordPauseButton setTitle:@"Record" forState:UIControlStateNormal]; 
    } 

    [stopButton setEnabled:YES]; 
    [playButton setEnabled:NO]; 
} 

- (IBAction)playTapped:(id)sender { 
    if (!recorder.recording){ 
     player = [[AVAudioPlayer alloc] initWithContentsOfURL:recorder.url error:nil]; 
     [player setDelegate:self]; 
     [player play]; 
    } 
} 

-(IBAction)uploadSound { 

    NSURL *theURL = [NSURL URLWithString:outputFileURL]; 
    NSData *theData = [NSData dataWithContentsOfURL:[NSURL URLWithString:theURL]]; 

    NSString *urlString = @"http://drewgarcia23.3owl.com/upload.php"; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:urlString]]; 
    [request setHTTPMethod:@"POST"]; 

    NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; 

    NSMutableData *body = [NSMutableData data]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\".mov\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[NSData dataWithData:theData]]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request setHTTPBody:body]; 

    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

    NSLog(@"%@", returnString); 
} 

Все отлично работает для загрузки на сервер, за исключением. Я получаю эту ошибку:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURL length]: unrecognized selector sent to instance 0x7a9a590'

Он должен сделать с этим кодом в IBActionuploadSound:

NSURL *theURL = [NSURL URLWithString:outputFileURL]; 
NSData *theData = [NSData dataWithContentsOfURL:[NSURL URLWithString:theURL]]; 

Любые идеи?

+0

Как в стороне, я бы не рекомендовал делать синхронный сетевой запрос в основной очереди. (Ваше приложение может перестать отвечать на запросы, если сетевой запрос обрабатывается, и если он занимает слишком много времени, в крайних случаях сторожевой процесс может даже убить ваше приложение.) Я бы предложил некоторую форму асинхронного процесса загрузки сети (например, 'sendAsynchronousRequest') , – Rob

ответ

0

Одна из проблем заключается в том, что вы вызываете URLWithString, передавая его NSURL, но он ожидает NSString.

Для примера рассмотрим следующие строки:

NSURL *theURL = [NSURL URLWithString:outputFileURL]; 
NSData *theData = [NSData dataWithContentsOfURL:[NSURL URLWithString:theURL]]; 

Есть две проблемы. Во-первых, в первой строке outputFileURL уже является NSURL, поэтому нет смысла звонить URLWithString при создании объекта theURL. outputFileURL уже является NSURL, поэтому преобразование не требуется. Во-вторых, у вас есть другой избыточный вызов URLWithString во второй строке, где вы принимаете theURL, что уже является NSURL (или было бы, если бы первая строка преуспела).

Вы не нуждаетесь ни в одном из этих двух звонков URLWithString. Это, вероятно, следует просто:

NSData *theData = [NSData dataWithContentsOfURL:outputFileURL]; 

Вы должны вызывать только URLWithString, когда вы пытаетесь преобразовать NSString к NSURL. Но вы никогда не называете это, если у вас уже есть объект NSURL.

+1

Чувак ... Большое вам спасибо. Это сработало. – drewg23

Смежные вопросы