Справочная информация: я использую FFMPEG для объединения аудио и видео потока в объединенный поток MPEGTS по сети. Видео поступает в формате h264 с камеры Raspberry Pi, звук поступает в формате ogg vorbis, закодированном со звуковой карты через локальный поток TCP. Один процесс FFMPEG заботится о кодировании аудио как AAC и объединении аудио / видео.
команда
raspivid --nopreview --ev 10 -ih -t 0 -rot 180 -w 720 -h 480 -fps 30 -b $BITRATE -g $KEYFRAME_PERIOD -pf baseline -o - | ffmpeg -r 30 -i - -i tcp://127.0.0.1:3000 -vcodec copy -acodec libfdk_aac -b:a 64k -ac 2 -filter:a "atempo=0.9945" -f mpegts tcp://192.168.42.2:6000
Проблема: у меня была проблема с синхронизацией аудио и видео с течением времени. Первоначальную разницу во времени я исправил, настроив драйвер звуковой карты, однако со временем потоки все еще могут очень медленно не синхронизироваться: звук воспроизводится немного быстрее, чем видео. Включение его в конечном итоге вызывает буферизацию воспроизведения для повторной выборки аудио, что приводит к увеличению задержки видео.
Причиной такого смещения темпа, вероятно, является то, что звуковая карта работает на собственных часах, немного отличающихся от тактовых сигналов Raspberry Pi. Мне удалось уменьшить эту проблему, используя аудио фильтр atempo . Тем не менее, учитывая, что это может длиться от нескольких часов до нескольких дней, это неадекватно, так как частота кварцевых часов будет меняться.
Вопрос: Учитывая, что звук поступает в виде аудиопотока, мне было интересно, есть ли способ автоматически регулировать темп, чтобы поддерживать постоянным время буферизованного аудиосэмпла? Что-то, что заставляет FFMPEG поддерживать стабильный аудиопоток, постоянно удерживая в буфере по x секунд, замедляя воспроизведение, если оно догоняет буфер. Темп является ключевым моментом здесь: если темп не изменяется, это приведет к проблемам во время воспроизведения, когда аудио и видео объединяются.
Я не могу использовать стандартные методы синхронизации, потому что поток h264 не имеет временных меток, а временные метки ogg-потока имеют проблему с темпом.
Любые намеки на решение этой проблемы приветствуются.
-re
флаг в ffmpeg-re
Не следует использовать с реальными устройствами захвата или живыми входными потоками (где это может привести к потере пакетов)»-af aresample=async=1
вместо atempo. Этот фильтр обрезает или дополняет выходной аудиосигнал, если между двумя временными метками слишком много или два аудиопакета.