как воспроизвести тишину, используя AudioQueueEnqueueBuffer ... с kAudioFormatMPEG4AAC_HE (VBR) - PullRequest
2 голосов
/ 14 января 2012

Я работаю с сетевым приложением, поэтому в какой-то момент я потеряю пакет или там, где у меня началось воспроизведение, нет данных для воспроизведения. это мой исходный код:

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 Ответ

1 голос
/ 13 января 2014

Вопрос задан мной 2 года назад, на самом деле у меня есть решение.

Решение состоит в том, что запись пакета тишины с использованием инструментов записи.

Сначала найдите инструмент записи иустановите параметры записи в AAC_HE.Тогда начинай запись и молчи.Сохраните файл.

Когда ваше приложение запустится, загрузите файл в память и используйте его, когда нет данных для воспроизведения.

Так как аудио-очередь представляет собой API в режиме pull-режима, это не подходит, еслимы получаем данные через сеть.Open AL - это API в push-режиме, но он поддерживает только несжатый формат, поэтому, возможно, нам следует декодировать сжатые данные с использованием Core-Audio, а затем воспроизводить их с использованием Open AL.

...