gpt4 book ai didi

ios - 如何使用 AudioQueueEnqueueBuffer 播放静音...与 kAudioFormatMPEG4AAC_HE(VBR)

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:54:01 24 4
gpt4 key购买 nike

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

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)播放静音帧

最佳答案

这个问题是我2年前问的,我已经得到了解决方案。

解决办法是用录音工具录一个静默包。

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

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

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

关于ios - 如何使用 AudioQueueEnqueueBuffer 播放静音...与 kAudioFormatMPEG4AAC_HE(VBR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com