2011-11-16 66 views
3

我想在截取iOS設備揚聲器的過程中「截取」音頻數據。我相信這可以使用remoteIO音頻單元和回調來完成。在下面的playbackCallback中,ioData實際上是否包含任何音頻數據?RemoteBudio音頻單元回放回調中的AudioBufferList內容

static OSStatus playbackCallback(void *inRefCon, 
           AudioUnitRenderActionFlags *ioActionFlags, 
           const AudioTimeStamp *inTimeStamp, 
           UInt32 inBusNumber, 
           UInt32 inNumberFrames, 
           AudioBufferList *ioData) { ... } 

我很困惑,因爲約ioData登錄信息似乎暗示它包含音頻數據...

// if (ioData->mNumberBuffers > 0) 
AudioBuffer buffer = ioData->mBuffers[0]; 
NSLog(@"buffer.mNumberChannels: %ld", buffer.mNumberChannels); // prints 2 
NSLog(@"buffer.mDataByteSize : %ld", buffer.mDataByteSize); // prints 4096 

但是從ioData的內容創建CMSampleBufferRef並使用它寫入CoreAudioFile AVAssetWriter會生成一個靜默文件。輸出文件的長度似乎很好(幾秒鐘),但在Audacity中打開文件顯示了一條扁平線。

在閱讀大量SO帖子並試驗了很多remoteIO音頻單元示例代碼後,我開始懷疑ioData是否包含應該在playbackCallback中填充的預大小但空的緩衝區。

回答

6

playCallback中的ioData緩衝區是回調應放置要播放的音頻樣本的位置。緩衝區不包含在通往揚聲器的途中截獲的其他音頻。

相關問題