0

伙计们:

今天,我正在调试我的流媒体网络广播应用程序。

我使用音频队列服务播放从 FFMPEG 解码的 PCM 缓冲区。

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

1)在info.plist中添加UIBackGroundMode

2)使用 AVAudioSession 设置“AVAudioSessionCategoryPlayback”

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

但是,声音变得不稳定,具有显着的音频上限。

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

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

2)在 37500,音频帽太重,无法分辨音频声音

3)在41000,音频完全终止

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

似乎iOS在切换到屏幕锁定模式时降低了处理音频队列数据的采样率?

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

4

1 回答 1

0

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

屏幕锁定时iOS背景音频停止

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

“事实证明,如果它应该在屏幕关闭时运行,音频缓冲区的大小必须足够大”

因此,我通过在每个缓冲区处理周期增加发送到音频队列的数据包数量来调整我的代码(最初为 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

        ...
    }

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

谢谢,弗里茨门泽!!

于 2013-04-06T12:30:12.490 回答