簡單的問題。如何使用AVAudioEngine播放多聲道音頻文件(> 2聲道),以便我可以在默認雙聲道輸出(耳機/揚聲器)上聽到所有聲道。下面的代碼(剝離錯誤檢查呈現)播放該文件前兩個渠道,但我只能聽到它,當插入耳機。AVAudioEngine播放多聲道音頻
AVAudioFile *file = [[AVAudioFile alloc] initForReading:[[NSBundle mainBundle] URLForResource:@"nums6ch" withExtension:@"wav"] error:nil];
AVAudioEngine *engine = [[AVAudioEngine alloc] init];
AVAudioPlayerNode *player = [[AVAudioPlayerNode alloc] init];
AVAudioMixerNode *mixer = [[AVAudioMixerNode alloc] init];
[engine attachNode:player];
[engine attachNode:mixer];
AVAudioFormat *processingFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32 sampleRate:file.processingFormat.streamDescription->mSampleRate channels:2 interleaved:false];
[engine connect:player to:mixer format:processingFormat];
[engine connect:mixer to:engine.outputNode format:processingFormat];
[engine startAndReturnError:nil];
[player scheduleFile:file atTime:nil completionHandler:nil];
[player play];
我嘗試了很多組合與格式,從播放器 - >混頻器和混頻器 - >輸出連接,但它們要麼具有同樣的事情,上面的代碼或者更可能崩潰與兩種效果:
ERROR: [0x19c392310] AVAudioNode.mm:495: AUGetFormat: required condition is false: nil != channelLayout && channelLayout.channelCount == asbd.mChannelsPerFrame
*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: nil != channelLayout && channelLayout.channelCount == asbd.mChannelsPerFrame'
或AUSetFormat OSStatus代碼-10868(如果我沒有記錯的話這是不支持的格式)。對於任何連接使用file.processingFormat會使上面的第一個錯誤導致應用程序崩潰。此外,崩潰發生在[player play];
必須有某種方式播放它像我想要的,因爲我能夠做到這一點沒有問題使用AUGraph,但是,因爲AVAudioEngine提供了一個功能,我必須包括,我堅持下去。我用它來檢查我的代碼
多通道音頻文件可以發現here
UPDATE 好了,聽音頻耳機只可能是因爲我忘了在我的測試應用程序設置音頻會話活躍。但我仍然只聽到前兩個頻道...
請詳細說明您提到的錯誤。是不是可以使用'AVAudioPlayerNode'的'scheduleBuffer:atTime:options:completionHandler'來爲所有三個節點指定相同的'AVAudioTIme'? – Mark 2016-01-29 18:16:18
在編寫本問答時,即使您爲所有三個節點放置相同的AVAudioTime,聲音之間仍會有輕微的延遲。不知道他們是否修好了。 – Kegluneq 2016-02-01 12:23:23