2016-07-12 13 views
3

Я пытаюсь воспроизвести AVAudioFile с помощью AVAudioEngine. Код во многом принимается и адаптируется к онлайн-видеороликам Apple Developer, но воспроизведение отсутствует. Проводили некоторое время, проходя через форумы, но ничто, кажется, не проливает свет на него.AVAudioFile не воспроизводится в AVAudioEngine

У меня есть два метода. Первый вызывает стандартный диалог открытия файла, открывает аудиофайл, выделяет объект AVAudioBuffer (который я буду использовать позже) и заполняет его аудиоданными. Второй настраивает объекты AVAudioEngine и AVAudioPlayerNode, подключает все и воспроизводит файл. Ниже перечислены два метода.

- (IBAction)getSoundFileAudioData:(id)sender { 


    NSOpenPanel* openPanel = [NSOpenPanel openPanel]; 

    openPanel.title = @"Choose a .caf file"; 
    openPanel.showsResizeIndicator = YES; 
    openPanel.showsHiddenFiles = NO; 
    openPanel.canChooseDirectories = NO; 
    openPanel.canCreateDirectories = YES; 
    openPanel.allowsMultipleSelection = NO; 
    openPanel.allowedFileTypes = @[@"caf"]; 

    [openPanel beginWithCompletionHandler:^(NSInteger result){ 
     if (result == NSFileHandlingPanelOKButton) { 
     NSURL* theAudioFileURL = [[openPanel URLs] objectAtIndex:0]; 

     // Open the document. 

     theAudioFile = [[AVAudioFile alloc] initForReading:theAudioFileURL error:nil]; 

     AVAudioFormat *format = theAudioFile.processingFormat; 
     AVAudioFrameCount capacity = (AVAudioFrameCount)theAudioFile.length; 

     theAudioBuffer = [[AVAudioPCMBuffer alloc] 
      initWithPCMFormat:format frameCapacity:capacity]; 
     NSError *error; 
     if (![theAudioFile readIntoBuffer:theAudioBuffer error:&error]) { 

      NSLog(@"problem filling buffer"); 

     } 
     else 
      playOrigSoundFileButton.enabled = true;    

    } 

}];} 





- (IBAction)playSoundFileAudioData:(id)sender { 



    AVAudioEngine *engine = [[AVAudioEngine alloc] init]; // set up the audio engine 

    AVAudioPlayerNode *player = [[AVAudioPlayerNode alloc] init]; // set up a player node 

    [engine attachNode:player]; // attach player node to engine 

    AVAudioMixerNode *mixer = [engine mainMixerNode]; 
    [engine connect:player to:mixer format:theAudioFile.processingFormat]; // connect player node to mixer 
    [engine connect:player to:mixer format:[mixer outputFormatForBus:0]]; // connect player node to mixer 

    NSError *error; 

    if (![engine startAndReturnError:&error]) { 
     NSLog(@"Problem starting engine "); 
    } 
    else { 

     [player scheduleFile:theAudioFile atTime: nil completionHandler:nil]; 
     [player play]; 
    } 

} 

Я проверил, что выполняются функции, что звуковой движок запущен, и аудиофайл был прочитан. Я также пробовал с различными форматами аудио файлов, как моно, так и стерео. Есть идеи?

Я запускаю Xcode 7.3.1.

+0

Просто заметил, что я оставил в лишней линии в методе playSoundFileAudioData (одна из двух линий, начиная «двигатель подключения:» Тем не менее,. удаление 0 из них не решает проблемы. – aseago

ответ

3

объявить AVAudioPlayerNode *player как глобальные

см эту ссылку Can't play file from documents in AVAudioPlayer

+0

Большое спасибо, Rahul - решил проблему! – aseago

+0

Полезно знать. Принять ответ было бы хорошо –

+0

Извините, Rahul. Флажок не показывался на моем iPad по какой-либо причине . Готово – aseago