我正在使用网络应用程序,所以有些我会丢失数据包或我开始播放,没有数据可供播放。 这是我的源代码:
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)播放静音帧
答案 0 :(得分:1)
2年前我问过这个问题,我实际上得到了一个解决方案。
解决方案是使用录音工具录制静音包。
首先找到录音工具并将录音参数设置为AAC_HE。然后开始录音并保持安静。保存文件。
当你的应用程序启动时,将文件加载到内存中,并在没有数据播放时使用它。
由于音频队列是拉模式api,因此我们通过网络获取数据是不合适的。 Open AL是推模式api,但它只支持未压缩格式,因此我们可能需要使用core-audio解码压缩数据,然后使用Open AL进行播放。