2013-07-11 64 views
2

最近我遇到了下一個問題。 我使用CoreAudio AudioUnit(RemoteI/O)在iOS應用程序中播放/錄製聲音流。進入音頻單元的聲音流是2聲道LPCM,16位有符號整數,交錯(我也配置了一個輸出記錄流,它基本上是相同的,但每個分組和幀只有一個聲道和2個字節)。CoreAudio Audio Unit只播放一路立體聲音頻

我已經配置我的輸入ASBD如下(我沒有得到任何錯誤,當我把它當我初始化單位):

ASBD.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; 
ASBD.mBytesPerPacket = 4; 
ASBD.mFramesPerPacket = 1; 
ASBD.mBytesPerFrame = 4; 
ASBD.mChannelsPerFrame = 2; 
ASBD.mBitsPerChannel = 16; 

在我的渲染回調函數,我得到AudioBufferList一個緩衝區(我的理解,因爲音頻流是交織的)。

我有一個樣本立體聲文件,用於測試哪個是100%立體聲和2個明顯的通道。我將它翻譯成與ASBD相對應的流並饋送到音頻單元。

當我播放示例文件時,我只聽到左聲道。

我將不勝感激任何想法,爲什麼發生這種情況。如果需要,我可以發佈更多的代碼。

更新:我已經嘗試設置

ASBD.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsNonInterleaved; 
ASBD.mBytesPerPacket = 2; 
ASBD.mFramesPerPacket = 1; 
ASBD.mBytesPerFrame = 2; 
ASBD.mChannelsPerFrame = 2; 
ASBD.mBitsPerChannel = 16; 

ASBD和我有緩衝名單有兩個緩衝器。我將我的數據流解交錯爲2個通道(1個通道用於1個緩衝區)並獲得相同的結果。我嘗試在iPad上使用耳機和揚聲器(我知道揚聲器是單聲道的)。

+0

你介意發佈你的源代碼嗎?你是如何將你的信息流交流到2個頻道的? – Surz

回答

1

好的。因此,我檢查了我的代碼,發現我使用VoiceProcessingIO音頻單元(而不是RemoteIO,它在問題中),這對我的應用程序基本上是正確的,因爲文檔中提到「語音處理I/O單元(子類型kAudioUnitSubType_VoiceProcessingIO)遠程I/O單元的特性,並增加了雙向雙工通信的回聲抑制,還增加了自動增益校正,語音處理質量調整和靜音功能當我將音頻單元類型更改爲RemoteIO I'我立即得到了立體聲播放。我不必更改流屬性。

基本上VoiceProcessingIO音頻單元下降到單聲道而忽視流屬性。

我已經在Apple Developer論壇上發佈了關於使用VoiceProcessingIO音頻單元進行立體聲輸出的問題,但尚未得到任何答案。

對於我來說,爲了做一些像回聲消除這樣的信號處理,對於我來說倒是很合乎邏輯,因爲iOS設備只能錄製沒有特定外部附件的單聲道聲音。雖然這在Apple文檔中沒有任何記載。我還遇到過一位聲稱立體聲在iOS5.0之前爲VoiceProcessingIO AU工作的人。

無論如何感謝您的關注。任何其他意見,將不勝感激。

+0

我有同樣的問題..我有一個立體聲文件是100%立體聲與2個明顯的渠道。 當我播放示例文件時,我只聽到一個聲道。 你能告訴我我需要寫哪些代碼才能播放單聲道立體聲嗎?謝謝 –

+0

你可以看看這個問題。在評論中有一個鏈接到源代碼。 http://stackoverflow.com/questions/10823322/control-mono-playback-output-with-core-audio – user1264176