Ошибка AudioUnitSetProperty с -10868 при установке kAudioUnitProperty_StreamFormat на AAC

Я хочу использовать для кодирования вывода AUGraph как AAC (в iOS 5.1). Базовая топология графа выглядит так:

inputs --> MixerUnit --> pcm2aac --> aac2pcm --> RemoteIO

Я хочу получить данные в кодировке AAC, когда они воспроизводятся через PostRenderCallback на pcm2aac, а затем отправить их через UDP в наше серверное приложение.

Насколько я понимаю, переход к AudioUnit для этого варианта использования — kAudioUnitType_FormatConverter, но когда я хочу установить входное свойство ASBD для aac2pcm, AudioUnitSetProperty завершается ошибкой с -10868 (она также завершается ошибкой, когда я устанавливаю вывод pcm2acc с тем же ошибка).

AudioComponentDescription converterUnitDescription;
converterUnitDescription.componentType          = kAudioUnitType_FormatConverter;
converterUnitDescription.componentSubType       = kAudioUnitSubType_AUConverter;
converterUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
converterUnitDescription.componentFlags         = 0;
converterUnitDescription.componentFlagsMask     = 0;
//...
AUNode   pcm2aacNode;
AUNode   aac2pcmNode;
//...
result =    AUGraphAddNode (
                            processingGraph,
                            &converterUnitDescription,
                            &aac2pcmNode
                            );

if (noErr != result) {[self printErrorMessage: @"AUGraphNewNode failed for Converter unit" withStatus: result]; return;}
//...
result = AUGraphOpen (processingGraph);

if (noErr != result) {[self printErrorMessage: @"AUGraphOpen" withStatus: result]; return;}

//...
AudioUnit aac2pcmUnit;
AudioUnit pcm2aacUnit;
//...
result =    AUGraphNodeInfo (
                             processingGraph,
                             aac2pcmNode,
                             NULL,
                             &aac2pcmUnit
                             );

if (noErr != result) {[self printErrorMessage: @"AUGraphNodeInfo (aac2pcm)" withStatus: result]; return;}

//...
NSLog (@"Setting stream format for input aac2pcm  bus");
result = AudioUnitSetProperty (aac2pcmUnit,
                               kAudioUnitProperty_StreamFormat,
                               kAudioUnitScope_Input,
                               0,
                               &aacStreamFormat,
                               sizeof (aacStreamFormat)
                               );

if (noErr != result) {[self printErrorMessage: @"AudioUnitSetProperty (input aac2pcm stream format)" withStatus: result];return;}
// returns -10868

где aacStreamFormat

memset(&aacStreamFormat, 0, sizeof(aacStreamFormat));/
UInt32 size = sizeof(aacStreamFormat);
aacStreamFormat.mFormatID          = kAudioFormatMPEG4AAC;
aacStreamFormat.mChannelsPerFrame  = 2;   
aacStreamFormat.mFormatFlags       = kMPEG4Object_AAC_Main;
aacStreamFormat.mSampleRate        = graphSampleRate; //44100
AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &aacStreamFormat);

Возможны ли такие преобразования с AUGraph или мне нужно использовать другие методы для преобразования в реальном времени?


person user1512263    schedule 12.07.2012    source источник


Ответы (2)


Я не думаю, что вам нужны узлы pcm2aac и aac2pcm. Вы можете просто установить обратный вызов рендеринга на узле микшера и использовать ExtAudioFileWriteAsync для сохранения вывода в виде AAC.

person sbooth    schedule 13.07.2012
comment
Спасибо за наш ответ, но мне нужно писать не в файл, а в UDP-поток (я уточнил это сейчас в вопросе). - person user1512263; 13.07.2012
comment
В этом случае вы можете подгонять ExtAudioFile к соответствию, обернув AudioFile, который использует пользовательские обратные вызовы, но это, вероятно, не будет стоить хлопот. - person sbooth; 14.07.2012

Ссылка на AUComponent.h

kAudioUnitSubType_AUConverter
An audio unit that uses an AudioConverter to do Linear PCM conversions 
(sample rate, bit depth, interleaving).

поэтому вы не можете перекодировать PCM в AAC с помощью kAudioUnitSubType_AUConverter.

Вместо этого вам следует использовать AudioConverter, вот URL ссылки https://developer.apple.com/library/ios/samplecode/iPhoneACFileConvertTest/Introduction/Intro.html

person Albert Liao    schedule 21.04.2014