Ios 音频队列(采样率高)在锁定屏幕时会出现音频上限

Ios 音频队列(采样率高)在锁定屏幕时会出现音频上限,ios,background,audio-streaming,multitasking,Ios,Background,Audio Streaming,Multitasking,伙计们: 今天,我正在调试我的流媒体互联网广播应用程序 我使用音频队列服务播放从FFMPEG解码的PCM缓冲区 为了在锁定屏幕时保持播放行为,我做了以下两件事: 1) 在info.plist中添加UIBackGroundMode 2) 使用AVAudioSession设置“AVAudioSessionCategoryPlayback” 在这些操作之后,我在iPhone上运行了这个应用程序,当我按下屏幕锁定键进入睡眠模式时,它会一直播放声音 然而,声音变得颤抖,明显的音频上限 我用不同的采样率测试

伙计们:

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

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

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

1) 在info.plist中添加UIBackGroundMode

2) 使用AVAudioSession设置“AVAudioSessionCategoryPlayback”

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

然而,声音变得颤抖,明显的音频上限

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

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

2) 37500时,音频盖太重,无法显示音频声音

3) 41000时,音频完全终止

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

当iOS转到屏幕锁定模式时,它似乎降低了处理音频队列数据的采样率


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

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

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

“如果在屏幕关闭时运行音频缓冲区,那么音频缓冲区的大小必须足够大。”

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

        ...
    }
在这次调整之后,我再次运行了我的应用程序,它确实工作了!当我锁定屏幕时,音频声音稳定,没有任何音频间隙

谢谢你,弗里茨·门泽