2

我正在使用网络应用程序,所以我会丢失数据包或我开始播放的地方,没有播放数据。这是我的源代码:

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)

4

1 回答 1

1

这个问题是我两年前提出的,实际上我已经得到了解决方案。

解决方案是使用记录工具记录静音数据包。

先找个录音工具,把录音参数设置为AAC_HE。然后开始录音并保持安静。保存文件。

当您的应用程序启动时,将文件加载到内存中,并在没有数据播放时使用它。

由于音频队列是一个拉模式的api,如果我们通过网络获取数据是不合适的。Open AL 是一个推送模式 api,但它只支持未压缩格式,所以也许我们应该使用 core-audio 解码压缩数据,然后使用 Open AL 播放。

于 2014-01-13T06:18:17.033 回答