2015-06-12 5 views
0

Я кодирую программу воспроизведения аудио в реальном времени на iOS.Звук отключен после воспроизведения звука с аудио-очередью на iOS некоторое время

Он получает звуковые пакеты RTP от однорангового узла и помещает их в очередь аудио для воспроизведения.

Когда вы начинаете играть, звук в порядке. Но через 1 или 2 минуты звук отключен, и об ошибке от AudioQueue API нет. Функция обратного вызова продолжает вызываться нормально, ничего ненормального.

Но это просто приглушено.

Моя функция обратного вызова:

1: Loop, пока не будет достаточно данных, могут быть скопированы в буфер аудио очереди

do 
{ 
    read_bytes_enabled = g_audio_playback_buf.GetReadByteLen(); 
    if (read_bytes_enabled >= kAudioQueueBufferLength) 
    { 
     break; 
    } 
    usleep(10*1000); 
} 
while (true); 

2: Скопировать в буфер звуковых сообщений и епдиеие его. Эта функция обратного вызова работает нормально и без ошибок.

//copy to audio queue buffer 
read_bytes = kAudioQueueBufferLength; 

g_audio_playback_buf.Read((unsigned char *)inBuffer->mAudioData, read_bytes); 

WriteLog(LOG_PHONE_DEBUG, "AudioQueueBuffer(Play): copy [%d] bytes to AudioQueue buffer! Total len = %d", read_bytes, read_bytes_enabled); 

inBuffer->mAudioDataByteSize = read_bytes; 

UInt32 nPackets = read_bytes/g_audio_periodsize; // mono 

inBuffer->mPacketDescriptionCount = nPackets; 

// re-enqueue this buffer 
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL); 

ответ

0

Проблема решена.

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

поэтому следующий код должен быть изменен:

do 
{ 
    read_bytes_enabled = g_audio_playback_buf.GetReadByteLen(); 
    if (read_bytes_enabled >= kAudioQueueBufferLength) 
{ 
    break; 
} 
    usleep(10*1000); 
} 
while (true); 

изменен следующим образом:

read_bytes_enabled = g_audio_playback_buf.GetReadByteLen(); 
if (read_bytes_enabled < kAudioQueueBufferLength) 
{ 
    memset(inBuffer->mAudioData, 0x00, kAudioQueueBufferLength); 
} 
else 
{ 
    inBuffer->mAudioDataByteSize = kAudioQueueBufferLength; 
} 
... 

 Смежные вопросы

  • Нет связанных вопросов^_^