CoreAudio音频单元只播放一个声道的立体声音频



最近我遇到了下一个问题。我使用CoreAudioAudioUnit(RemoteI/O)在iOS应用程序中播放/录制声音流。

进入音频单元的声音流是2通道LPCM,16位,带符号整数,交错(我还配置了一个输出记录流,它基本上相同,但只有一个通道,每个数据包和帧2个字节)。

我已经将我的输入ASBD配置如下(当我设置它和初始化单元时,我不会出错):

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

在我的render回调函数中,我得到了一个缓冲区的AudioBufferList(据我所知,因为音频流是交错的)。

我有一个用于测试的立体声文件样本,它是100%立体声的,有两个明显的通道。我把它翻译成对应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上试用了耳机和扬声器(我知道扬声器是单声道的)。

好的。因此,我检查了我的代码,发现我使用的是VoiceProcessingIO音频单元(而不是问题中的RemoteIO),这对我的应用程序来说基本上是正确的,因为文档中写着"语音处理I/O单元(子类型kAudioUnitSubType_VoiceProcessingIO)具有远程I/O单元的特性,并为双向双工通信添加了回声抑制。它还增加了自动增益校正、语音处理质量调整和静音"

当我将音频单元类型更改为RemoteIO时,我立即获得了立体声播放。我不必更改流属性。

基本上,VoiceProcessingIO音频单元降为单声道,并忽略流属性。

我在苹果开发者论坛上发布了一个关于使用VoiceProcessingIO音频单元立体声输出的问题,但还没有得到任何答案。

对我来说,为了进行回声消除等信号处理而改用单声道似乎很合乎逻辑,因为iOS设备在没有特定外部附件的情况下只能录制单声道声音。尽管这在苹果文档中没有任何记录。我也遇到过一个家伙的帖子,他声称立体声在iOS5.0之前适用于VoiceProcessingIO AU。

不管怎样,谢谢你的关注。如对此事有任何其他意见,我们将不胜感激。

最新更新