Вопрос или проблема
Дан файл mkv
с 4 потоками – видео hevc, аудио, субтитры и mjpeg с изображением. Я хотел бы задержать аудио, которое не синхронизировано при воспроизведении. При попытке сделать это, например, с помощью -itsoffset
, как объяснено в В ffmpeg, как задержать только аудио видео .mp4 без преобразования аудио?, я сталкиваюсь с двумя проблемами. Если я исключаю mjpeg
, во время воспроизведения у меня возникают зависания, продолжающиеся несколько секунд, при перемотке на минуту вперед (этого не происходит в оригинале). Когда я сохраняю все потоки, включая mjpeg
, я получаю тишину, в зависимости от длины выхода (иногда полную, иногда только после 3 перемоток вперед).
Например.
ffmpeg -i f.mkv -c copy -map 0 -to 0:26:0 t0.mkv
– как оригинал.
ffmpeg -i f.mkv -i f.mkv -c copy -map 0:0 -map 1:1 -map 0:2 -map 0:3 -to 0:5:0 t1.mkv
– зависает на несколько секунд при перемотке на 1 минуту вперед
ffmpeg -i f.mkv -i f.mkv -c copy -map 0:0 -map 1:1 -map 0:2 -map 0:3 -to 0:15:0 t2.mkv
– без зависаний, но тихо
Оба файла на 5 и 15 минут с двумя входами выводят Starting new cluster due to timestamp
дважды (такой строки нет, когда только один входной файл). Когда я сравниваю результирующие файлы с помощью ffmpeg -i
, я не вижу особой разницы.
Что может быть причиной таких странных результатов? Что попробовать сделать, чтобы исправить вышеперечисленное? Я хотел бы иметь воспроизведение без зависаний с звуком.
Ответ или решение
Вопрос, который вы описали, касается работы с видеофайлом MKV, содержащим несколько потоков (видео, аудио, субтитры и MJPEG), и проблем при попытках задержки аудио с помощью ffmpeg
. Рассмотрим подробно возможные причины возникновения зависаний при перемотке и отсутствием звука в ваших выходных файлах.
Проблема с зависаниями и отсутствием звука
-
Структура MKV и потоки: MKV, как контейнер, может обрабатывать различные кодеки и различные типы потоков. В вашем случае вы имеете дело не только с видеопотоком (HEVC) и аудиопотоком, но и с MJPEG-стримом, который представляет собой последовательность изображений. Это может усложнять синхронизацию аудио и других потоков.
-
Выбор потоков и кодирование: При использовании
-map
необходимо учитывать, как различные потоки взаимодействуют друг с другом. Когда вы используете несколько входных файлов (как в случае с-i f.mkv -i f.mkv
), FFmpeg может пытаться синхронизировать потоки, что и приводит к проблемам с воспроизведением и зависаниям из-за множества пересечений и изменений алгоритмов обработки. -
Проблемы при сдвиге с помощью
-itsoffset
: Предполагается, что использование-itsoffset
доложено корректно, чтобы задержать аудиопоток. Но включение MJPEG-потока может создавать дополнительные временные метки, complicating синхронизацию между различными потоками. При этом, если MJPEG-стрим имеет большую нагрузку, он может замедлять обработку остальными потоками.
Возможные решения
-
Альтернативные параметры кодирования: Попробуйте использовать параметры кодирования, которые могут помочь избежать зависаний при перемотке. Например, вы можете использовать флаг
-movflags faststart
, который может помочь улучшить начало воспроизведения. Также рассмотрите использование параметров-g
(группа кадров) для управления частотой ключевых кадров, что может уменьшить зависание при перемотке. -
Задержка аудио: Если вы хотите применить задержку только к аудиодорожке, попробуйте выполнить это без второго входного файла. Например:
ffmpeg -itsoffset 2 -i f.mkv -map 0:v -map 0:a -c copy -to 0:5:0 t0.mkv
Это позволит обрабатывать груз только одного файла и избежать сложной синхронизации между потоками.
-
Проверка MJPEG: Убедитесь, что MJPEG-поток действительно необходим для проекта. Если он не нужен, проще убрать его из контейнера. Для этого можно использовать:
ffmpeg -i f.mkv -map 0:v -map 0:a -map 0:s -c copy -to 0:5:0 t0.mkv
-
Работа с временными метками: Параметры, такие как
-use_wallclock_as_timestamps
, могут быть полезны, если возникли проблемы с временными метками. Попробуйте добавить этот параметр при выводе, если возникают проблемы с синхронизацией.
Заключение
Совмещение различных потоков, особенно MJPEG с аудио, может приводить к проблемам с производительностью и синхронизацией. Попробуйте использовать предложенные выше рекомендации и настройки, чтобы улучшить вашу ситуацию с воспроизведением и синхронизацией. Кроме того, всегда полезно тестировать различные конфигурации и параметры, чтобы найти оптимальное решение для вашего конкретного случая.