2013-04-04 110 views
0

家伙将遭受音频帽:音频队列(高采样率)时锁定屏幕

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

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

而且为了保持播放行为,同时锁住屏幕,我没有以下两件事情:

1)添加UIBackGroundMode在info.plist中

2)使用AVAudioSession设置 “AVAudioSessionCategoryPlayback”

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

但是,声音变得颤抖,显着的音频c AP。

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

1在32000),音频帽可以被检测

2)37500,音频帽太重告诉音频

3)41000声音,声音是完全终止

有谁知道什么是对发生这个问题?

看来iOS在处理音频队列数据时降低了其采样率,而它转向屏幕锁定模式?

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

回答

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 !!