2016-03-16 6 views
0

У меня есть приложение, которое помещает пакеты в AudioQueue, и оно отлично работает. Проблема в том, что у меня задержка в сети, и я не могу своевременно передавать пакеты в AudioQueue.IOS AudioQueue не играет, когда пакеты очереди в очереди

Все приложение работает хорошо, и enqueueBuffer не возвращает никаких ошибок, но AudioQueue отбрасывает пакеты (поэтому у меня нет звука), потому что они слишком стары.

Могу ли я заставить AudioQueue воспроизводить эти аудиопакеты ?, или, по крайней мере, знать, что пакеты отбрасываются ?. Потому что, если я это знаю, я могу сделать Pause-Play, чтобы перезапустить очередь ... (не очень хорошее решение, но у меня нет ничего лучшего)

Поскольку задержка может быть очень большой, я не могу использовать большой буфер, поскольку это minimice ошибку, но не решить ее

большое спасибо

ответ

0

Вы находитесь на правильном пути. Вы можете обрабатывать задержки в сети, обнаруживая в своей процедуре обратного вызова, когда вы достигли конца вашего сетевого буфера, а затем приостанавливаете AudioQueue. Позже перезапустите очередь, как только достаточно буферизированных пакетов. Ваш код будет выглядеть следующим образом

if playerState.packetsRead == playerState.packetsWritten { 
    playerState.isPlaying = false 
    AudioQueuePause(aq) 
} 

И в сетевом коде

if (playerState.packetsWritten >= playerState.packetsRead + kNumPacketsToBuffer) { 
    if !playerState.isPlaying { 
     playerState.isPlaying = true 

     for buffer in playerState.buffers { 
      audioCallback(playerState, aq: playerState.queue, buffer: buffer) 
     } 

     AudioQueueStart(playerState.queue, nil) 
    } 
} 

Кроме того, необходимо будет обновить свой код так, чтобы каждый раз, когда вы получаете пакет из сети, playerState.packetsWritten увеличивается, и аналогично для playerState.packetsRead, когда вы добавляете пакет в очередь аудио. Оптимальное число для kNumPacketsToBuffer зависит от кодека и условий сети. Я бы рекомендовал использовать 256 для AAC и настроить вверх/вниз на основе производительности.

+0

Большое спасибо. Это очень полезная информация. Было бы здорово, если бы я мог заставить играть все пакеты (не отбрасывая вообще). Но, по крайней мере, это хорошая идея. – WotG

+0

Приостановка очереди не приведет к отбрасыванию пакетов. Audio Queue поддерживает внутреннюю временную шкалу (которую вы можете получить с помощью «AudioQueueGetCurrentTime:»), которая продолжает продвигаться даже в отсутствие любых воспроизводимых пакетов. Когда вы вставляете буфер с пакетами старше текущего времени, эти пакеты отбрасываются. Приостановка очереди также приостанавливает временную шкалу, поэтому, если вы приостанавливаете работу перед запуском пакетов, возобновите воспроизведение после получения пакетов с задержкой, эти пакеты не будут считаться старыми и будут воспроизведены правильно. – RobHsieh