как воспроизвести тишину с помощью 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)


person KudoCC    schedule 14.01.2012    source источник


Ответы (1)


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

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

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

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

Поскольку аудио-очередь — это API-интерфейс режима извлечения, это не подходит, если мы получаем данные через сеть. Open AL — это API-интерфейс push-mode, но он поддерживает только несжатый формат, поэтому, возможно, нам следует декодировать сжатые данные с помощью core-audio, а затем воспроизводить с помощью Open AL.

person KudoCC    schedule 13.01.2014