使用 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 音频流音量低的主要内容,如果未能解决你的问题,请参考以下文章
如何将 FFMPEG AV_CODEC_ID_PCM_S16BE 音频数据馈送到 AudioQueue
使用 CoreAudio 中的 AudioQueue 从网络播放原始 pcm
CoreAudio AudioQueue PCM 速度快且不稳定