使用 AudioQueue 播放 PCM 音频流音量低

Posted

技术标签:

【中文标题】使用 AudioQueue 播放 PCM 音频流音量低【英文标题】:Using AudioQueue to play PCM audio stream have low volume 【发布时间】:2015-09-17 02:05:02 【问题描述】:

我在使用 AudioQueue 播放 PCM 数据时遇到问题。使用 iPhone 的扬声器时音量偏低;我什至把系统音量调到最大。但是,我使用耳机时音量很好。

我像这样将数据插入到队列中:

memcpy(mBuffers[mIndex]->mAudioData, pcmData, mBufferByteSize);
mBuffers[mIndex]->mAudioDataByteSize = mBufferByteSize;
mBuffers[mIndex]->mPacketDescriptionCount = mBufferByteSize/2;
OSStatus status = AudioQueueEnqueueBuffer(mQueue, mBuffers[mIndex], 0, NULL);
NSLog(@"fill audio queue buffer[%d]",mIndex);
if(mIndex == kNumberBuffers - 1) 
    isStartPlay = YES;
    mIndex = 0;
    AudioQueueSetParameter(mQueue, kAudioQueueParam_Volume, 1.0);
    status = AudioQueueStart(mQueue, NULL);
else 
    mIndex++;

我已经这样设置音量了:

AudioQueueSetParameter(mQueue, kAudioQueueParam_Volume, 1.0);

【问题讨论】:

【参考方案1】:

您使用的是AVAudiosessionCategoryPlayAndRecord 音频会话类别吗?如果是这样,那么您可能正在通过非常安静的接收器播放。

这种奇怪的默认行为让人想起播放和录制类别主要用于 VOIP 应用程序的日子,更奇怪的是,这些应用程序被 AppStore 禁止。

要通过普通扬声器覆盖播放,请尝试将AVAudioSessionCategoryOptionDefaultToSpeaker 添加到您的类别选项中:

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];

【讨论】:

感谢您的建议。但我没有使用任何音频会话类别,只是使用音频队列来录制和播放 PCM 音频流。所以我很困惑为什么我使用扬声器播放时音量很低,而使用耳机时不会发生这种情况。你知道吗? 也许你得到了一个默认的记录/播放和记录类别?你可以试试上面的代码还是使用AVAudioSessionCategoryPlayback进行播放? 是的,我尝试[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];,它成功了。谢谢。 被 AudioQueue 的无声输出卡住了,猜猜怎么着...用 AVAudioSession *sharedAudioSession = [AVAudioSession sharedInstance];[sharedAudioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; 初始化 AVAudioSession(不是队列!)也有助于 AudioQueue!

以上是关于使用 AudioQueue 播放 PCM 音频流音量低的主要内容,如果未能解决你的问题,请参考以下文章

使用 AudioQueue 播放断断续续的音频

如何将 FFMPEG AV_CODEC_ID_PCM_S16BE 音频数据馈送到 AudioQueue

使用 CoreAudio 中的 AudioQueue 从网络播放原始 pcm

CoreAudio AudioQueue PCM 速度快且不稳定

如何播放来自服务器的流式 PCM 数据,如 Android AudioTrack 类?

ios音频:使用audioqueue改变播放进度