2015-10-12 5 views
1

Отказ Новое в AVAudioRecorderIOS: Получить аудио из AVAudioRecorder

Что я делаю Я работаю над приложением, которое использует микрофон iPhone, чтобы записывать звук. После записи звука мне нужно преобразовать звук (должен быть AVAsset, правильно?) В NSData для отправки на наш сервер.

В чем проблема Проблема заключается в том, что я не уверен, как «получить» аудио, которое должно быть записано с помощью AVAudioRecorder. AVAudioRecorder имеет метод делегирования, который называется - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag. Я бы ожидал, что на самом деле AVAsset, содержащий аудио, передаваемый из этого метода делегата, но это не так. То, что он дает, это объект aRecorder, который имеет свойство .url. Когда я NSLog url из пройденного aRecorder, он появляется. На самом деле я могу NSLog длину файла в коде ниже:

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag 
{ 
    DLog (@"audioRecorderDidFinishRecording:successfully: %@",aRecorder); 

    AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:aRecorder.url options:nil]; 
    CMTime audioDuration = audioAsset.duration; 
    float audioDurationSeconds = CMTimeGetSeconds(audioDuration); 

    NSLog(@"asset length = %f", audioDurationSeconds); //Logs 7.051 seconds, so I know it's "there". 

    self.audioURL = aRecorder.url; 
} 

Проблема Когда я прохожу self.audioURL к следующему ViewController-х self.mediaURL и попытаться захватить файл из AssetLibrary (аналогично тому, как я делал раньше), актив не возвращается из AssetLibrary (несмотря на то, когда я po self.mediaURL это действительно регистрирует правильный URL:.

if (self.mediaURL) { 

      ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init]; 
      [assetLibrary assetForURL:self.mediaURL resultBlock:^(ALAsset *asset) { 

       if (asset) { 
        // This block does NOT get called... 

        ALAssetRepresentation *rep = [asset defaultRepresentation]; 
        Byte *buffer = (Byte*)malloc((long)rep.size); 
        NSUInteger buffered =[rep getBytes:buffer fromOffset:0.0 length:(long)rep.size error:nil]; 

        NSMutableData *body = [[NSMutableData alloc] init]; 
        body = [NSMutableData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; 

        [dataToSendToServer setObject:body forKey:@"audioData"]; 
       } 

      } failureBlock:^(NSError *error) { 

       NSLog(@"FAILED TO ACCESS AUDIO FROM URL: %@!", self.mediaURL); 
      }]; 

     } 

     else { 

      NSLog(@"NO AUDIO DATA!"); 
     } 
} 

Потому что я новичок в AVAudioRecorder, возможно, я просто не проектированием этого потока правильно Может кто-нибудь помочь меня в получении электропривода al аудиоданных.

Спасибо!

ответ

0

AVAudioRecorder записывает в файл, а не в библиотеку активов.

Таким образом, вы можете просто прочитать данные из этого файла.

+0

Где находится этот файл, хранящийся в устройстве? И с 'self.audioURL', который я просматриваю, позволит мне получить доступ к фактическому файлу из любого места (из любого приложения на устройстве)? –

+0

Вы решили местоположение файла, когда вы ввели AVAudioRecorder. Да, вы можете получить к нему доступ в своем приложении –

+0

Так что я могу сделать что-то вроде 'NSData * audioData = [NSData dataWithContentsOfURL: self.mediaURL];' и это все, что мне нужно сделать, чтобы преобразовать его в NSData? –

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