Как учесть разницу во времени при потоковом кодировании в реальном времени FFMPEG?

0

Справочная информация: я использую 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-потока имеют проблему с темпом.

Любые намеки на решение этой проблемы приветствуются.

Берже
источник
1
Я не уверен, что это решит это за вас, попробуйте добавить -reфлаг в ffmpeg
szatmary
Хотя в документах сказано: « -re Не следует использовать с реальными устройствами захвата или живыми входными потоками (где это может привести к потере пакетов)»
Gyan
Если часы аудио источника ошибочны, то нет никакого общего возможного решения ffmpeg. Иногда X входящих сэмплов могут представлять Y секунд звука в реальном времени, а иногда Z. То, что вы можете попробовать, если проблема не в звуковых часах, это -af aresample=async=1вместо atempo. Этот фильтр обрезает или дополняет выходной аудиосигнал, если между двумя временными метками слишком много или два аудиопакета.
Gyan
Спасибо, Мульвя, к сожалению, это не сработало. Судя по документации ресэмплера ffmpeg, это, вероятно, связано с отсутствием временных меток в видеопотоке h264. Я использовал -re раньше при потоковой передаче видеофайлов, но он не работает для потока tcp. Самое близкое, что я могу получить в теории, - это иногда сбрасывать аудиопоток на «последний сэмпл», но это тоже немного расплывчато, и я полагаю, что ffmpeg действительно ничего для этого не имеет.
Берже