【问题标题】:AudioUnitSetProperty fails with -10868 when setting kAudioUnitProperty_StreamFormat to AAC将 kAudioUnitProperty_StreamFormat 设置为 AAC 时,AudioUnitSetProperty 失败并显示 -10868
【发布时间】:2012-07-12 16:10:07
【问题描述】:

我想使用 将 AUGraph 的输出编码为 AAC(在 iOS 5.1 上)。图的基本拓扑如下所示:

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

我想在播放时通过 pcm2aac 上的 PostRenderCallback 获取 AAC 编码的数据,然后通过 UDP 将其发送到我们的服务器应用程序。

据我了解,此用例的首选 AudioUnit 是 kAudioUnitType_FormatConverter,但是当我想为 aac2pcm 设置 ASBD 输入属性时,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 进行,还是我必须使用其他方法进行实时转换?

【问题讨论】:

    标签: ios core-audio audiounit aac


    【解决方案1】:

    我认为您不需要 pcm2aac 和 aac2pcm 节点。您可以在混音器节点上安装一个渲染回调并使用 ExtAudioFileWriteAsync 将输出保存为 AAC。

    【讨论】:

    • 感谢您的回答,但我不需要写入文件,而是写入 UDP-Stream(我现在在问题中澄清了这一点)。
    • 在这种情况下,您可能能够通过包装使用自定义回调的 AudioFile 来强制 ExtAudioFile 合规,但这可能不值得麻烦。
    【解决方案2】:

    参考 AUComponent.h

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

    因此您无法通过 kAudioUnitSubType_AUConverter 将 pcm 转码为 aac。

    你应该使用 AudioConverter,这里是参考 URL https://developer.apple.com/library/ios/samplecode/iPhoneACFileConvertTest/Introduction/Intro.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多