2013-04-04 101 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 !!