2012-07-12 78 views
0

我想使用該編碼AUGraph的輸出作爲AAC(在iOS 5.1上)。圖的基本拓撲結構如下所示:將kAudioUnitProperty_StreamFormat設置爲AAC時,AudioUnitSetProperty會失敗,並顯示-10868

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

我要搶AAC編碼的數據,因爲它是通過PostRenderCallback打pcm2aac,然後通過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轉換甚至有可能的還是我必須用其他方法進行動態轉換?

回答

0

我不認爲你需要pcm2aac和aac2pcm節點。您只需在混音器節點上安裝渲染回調,然後使用ExtAudioFileWriteAsync將輸出保存爲AAC即可。

+0

謝謝您對我們的回答,但我並不需要寫一個文件,而是一個UDP流內(我現在澄清了在問題中)。 – user1512263 2012-07-13 08:50:38

+0

在這種情況下,您可能會通過包裝使用自定義回調的AudioFile來將ExtAudioFile強制轉換爲合規性,但這可能不值得爲此付出代價。 – sbooth 2012-07-14 12:22:38

相關問題