Простой вопрос. Как воспроизвести многоканальные аудиофайлы (> 2 канала) с помощью 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];
Я пробовал много комбинаций с форматами как для player-> смесителя и mixer-> выходные соединения, но они либо результат с той же вещи, как код выше, или более вероятно, аварии либо с:
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 Ok, так что слух звук в наушниках только был, вероятно, из-за меня забыть настройки аудио сеанс активен в моем тестовом приложении. Но я до сих пор слышу только первые два канала ...
Просьба уточнить ошибки, которые вы упомянули. Невозможно ли использовать 'listBuffer' AVAudioPlayerNode': atTime: options: completeHandler' для указания того же 'AVAudioTIme' для всех трех узлов? – Mark
На момент написания этого вопроса и ответа, даже если вы поместите тот же AVAudioTime для всех трех узлов, все еще будет небольшая задержка между звуками. Не знаю, если они исправили это или нет. – Kegluneq