2012-01-14 49 views
2

我正在使用網絡應用程序,所以有些時候我會丟失數據包,或者我已經開始播放,沒有播放數據。 這是我的源代碼:如何使用AudioQueueEnqueueBuffer播放靜音...與kAudioFormatMPEG4AAC_HE(VBR)

struct AQPlayerState *pAqData = (struct AQPlayerState *) m_aqData ; 
UInt32 numBytesReadFromFile = 0 ; 
UInt32 numPackets = 0 ; 
char * pdata = (char *)inBuffer->mAudioData ; 
for (int i = 0 ; i < pAqData->mNumPacketsToRead ; ++i) 
{ 
    unsigned int uiRead =GetOneFrame(pdata, pAqData->bufferByteSize - numBytesReadFromFile) ; 
    if (uiRead == 0) 
     break ; 

    AudioStreamPacketDescription * packetDescs = pAqData->mPacketDescs + i ; 
    packetDescs->mDataByteSize = uiRead ; 
    packetDescs->mStartOffset = numBytesReadFromFile ; 
    packetDescs->mVariableFramesInPacket = 0 ; 
    numBytesReadFromFile += uiRead ; 
    pdata += uiRead ; 
    ++numPackets ; 
} 
if (numPackets > 0) 
{ 
    inBuffer->mAudioDataByteSize = numBytesReadFromFile ; 
    OSStatus state = AudioQueueEnqueueBuffer (pAqData->mQueue, inBuffer, (pAqData->mPacketDescs ? numPackets : 0), pAqData->mPacketDescs) ; 
    NSLog(@"HandleOutputBuffer packet count:%lu, res:%lu", numPackets, state) ; 
} 
else 
{ 
    inBuffer->mAudioDataByteSize = 0 ; 
    (*(pAqData->mPacketDescs)).mDataByteSize = 0 ; 
    (*(pAqData->mPacketDescs)).mStartOffset = 0 ; 
    (*(pAqData->mPacketDescs)).mVariableFramesInPacket = 0 ; 
    OSStatus state = AudioQueueEnqueueBuffer (pAqData->mQueue, inBuffer, 0, nil) ; 
    NSLog(@"no packet: enqueuebuffer res:%ld", state) ; 
} 

但如果這些是沒有包,我得到一個錯誤kAudioQueueErr_BufferEmpty,所以我只是想知道怎麼玩靜音幀與aac_he型(VBR)

回答

1

的問題是我2年前問的,我已經得到了一個解決方案。

解決方案是使用錄製工具錄製靜音數據包。

首先找到一個錄音工具並將錄音參數設置爲AAC_HE。然後開始錄音並保持安靜。保存文件。

當您的應用程序啓動時,將文件加載到內存中,並在沒有要播放的數據時使用它。

由於音頻隊列是拉模式的API,如果我們通過網絡獲取數據是不合適的。 Open AL是一個push模式的api,但它只支持未壓縮的格式,所以也許我們應該使用核心音頻解碼壓縮的數據,然後使用Open AL進行播放。

相關問題