锁定屏幕时,音频队列(具有高采样率)将遭受音频上限

时间:2013-04-04 16:39:57

标签: ios background audio-streaming multitasking

专家:

今天,我正在调试我的流媒体互联网广播应用。

我使用Audio Queue Service播放从FFMPEG解码的PCM缓冲区。

为了在锁定屏幕时保持播放行为,我做了两件事:

1)在info.plist中添加UIBackGroundMode

2)使用AVAudioSession设置“AVAudioSessionCategoryPlayback”

完成这些操作后,我在iPhone上运行应用程序,当我按下屏幕锁定键进入睡眠模式时,它确实继续播放声音

然而,由于音频上限很大,声音变得不稳定。

我测试了不同采样率的音频流(屏幕锁定模式):

1)在32000处,可以检测到音频上限

2)在37500,音频上限太重,无法分辨音频

3)在41000,音频完全终止

有人知道这个问题会发生什么吗?

在转向屏幕锁定模式时,似乎iOS会降低处理音频队列数据的采样率吗?

屏幕锁定时,我应该配置一些东西以保持iPhone的采样率吗?

1 个答案:

答案 0 :(得分:0)

我用Fritz Menzer的启示和他以前的问题解决了这个问题。

iOS background audio stops when screen is locked

他用一个重要的总结回答了他自己的问题:

“事实证明,如果屏幕关闭时音频缓冲区大小必须足够大”

因此,我通过增加每个缓冲区处理周期发送到音频队列的数据包来调整我的代码(最初为1,我将其调整为16)。请参阅以下代码:

    static OSStatus AqCreateAudioQueue(AQPlayerState *pAqData)
    {
        OSStatus result;
        bool isFormatVBR;

        result = AudioQueueNewOutput(&(pAqData->mDataFormat),
                                     HandleOutputBuffer,
                                     pAqData,
                                     CFRunLoopGetCurrent(),
                                     kCFRunLoopCommonModes,
                                     0,
                                     &(pAqData->mQueue));

        pAqData->bufferByteSize = AUDIO_BUFFER_SIZE;
        //pAqData->mNumPacketsToRead = 1; 
        //one packet in each buffer-handling cycle is not enough
        pAqData->mNumPacketsToRead = PACKETS_TO_READ;
        //I defined PACKETS_TO_READ as 16

        ...
    }

经过这次调整,我再次运行我的应用程序,它确实有效!我锁定屏幕时音频声音稳定,没有任何音频间隙。

谢谢,Fritz Menzer !!