2012-01-14 3 views
2

Я работаю с сетевым приложением, поэтому со временем я потеряю пакет или где начну играть, нет данных для игры. это мой исходный код:Как играть в тишину с помощью 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)

ответ

1

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

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

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

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

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