Как заставить A/V синхронизацию, используя mkvmerge и внешние временные коды?

Фон

Я работаю над проектом, где видео и аудио представляют собой алгоритмические интерпретации исходного файла MKV, где я использую ffmpeg -ss и -t для извлечения определенной области аудио и видео в отдельные файлы. Я использую изменения сцены в видео в аудио процессе (то есть изменения аудио при смене видео сцены), поэтому синхронизация имеет решающее значение.

Звук 48 кГц, используется 512 сэмплов. Видео 23.976fps (я тоже пробовал 24).

Я сохраняю начало кадра sceneChanges в файле с точки зрения совокупных блоков:

blocksPerFrame = (48000 / 512) / 23.976
sceneOnsetBlock = sceneOnsetFrame*blocksPerFrame

Я использую эти блоки в своем аудиокоде для обработки семплов, связанных с каждой сценой, как группы.

Когда я снова объединяю аудио и видео (в настоящее время использую ffmpeg для создания mp4(v) mp3(a) в контейнере MKV), аудио и видео запускаются синхронно, но все чаще смещаются, пока не заканчиваются на ~35 секунд. Хуже всего то, что задержка звука нелинейная! Под нелинейным я подразумеваю, что, если я нанесу отставание по отношению к его местоположению во времени, я получу не линию, а то, что вы видите на рисунке ниже). Из-за этой нелинейности я не могу просто сдвинуть или масштабировать звук, чтобы подогнать его под видео. Я не могу понять причину этой нелинейно увеличивающейся задержки звука; Я дважды и трижды проверил свою математику.

Совокупное отставание от времени

Так как я знаю точное время смены сцены, я должен быть в состоянии генерировать "внешние временные коды" (из блоков выше) для mkvmerge, чтобы идеально синхронизировать вывод!

подвопросы:

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

  2. Мне не ясно, какие цифры использовать в файле временных кодов. Согласно документации mkvmerge "Для видео это ровно один кадр, для аудио это один пакет определенного типа".Так как я использую MP3, какой размер пакета? В идеале я мог бы указать размер пакета (в аудио-кодере?), Который соответствует размеру моего блока (512), чтобы все было согласованно и просто. Могу ли я сделать это с помощью ffmpeg?

Спасибо!

1 ответ

В итоге я решил причину проблемы в своем коде, поэтому мне никогда не приходилось доводить мысль до конца. В беседе с автором mkvmerge я определил следующие ответы:

  1. Лучше всего синхронизировать видео со звуком, так как некоторые проигрыватели используют временные метки аудио (временные коды) в качестве эталона, и видео легче замедлить и ускорить игрокам, чем аудио.

  2. Для аудио нет единого размера пакета. Размер пакета зависит от кодера и может даже быть разных размеров в разных частях потока. Можно было бы извлечь количество выборок в каждом пакете из заголовка MKV и использовать его для расчета длительности каждого пакета для генерации временных меток.

Другие вопросы по тегам