ffmpeg: тишина и зависание при.seek, возможно, связаны с mjpeg потоком

Вопрос или проблема

Дан файл 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. Рассмотрим подробно возможные причины возникновения зависаний при перемотке и отсутствием звука в ваших выходных файлах.

Проблема с зависаниями и отсутствием звука

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

  2. Выбор потоков и кодирование: При использовании -map необходимо учитывать, как различные потоки взаимодействуют друг с другом. Когда вы используете несколько входных файлов (как в случае с -i f.mkv -i f.mkv), FFmpeg может пытаться синхронизировать потоки, что и приводит к проблемам с воспроизведением и зависаниям из-за множества пересечений и изменений алгоритмов обработки.

  3. Проблемы при сдвиге с помощью -itsoffset: Предполагается, что использование -itsoffset доложено корректно, чтобы задержать аудиопоток. Но включение MJPEG-потока может создавать дополнительные временные метки, complicating синхронизацию между различными потоками. При этом, если MJPEG-стрим имеет большую нагрузку, он может замедлять обработку остальными потоками.

Возможные решения

  1. Альтернативные параметры кодирования: Попробуйте использовать параметры кодирования, которые могут помочь избежать зависаний при перемотке. Например, вы можете использовать флаг -movflags faststart, который может помочь улучшить начало воспроизведения. Также рассмотрите использование параметров -g (группа кадров) для управления частотой ключевых кадров, что может уменьшить зависание при перемотке.

  2. Задержка аудио: Если вы хотите применить задержку только к аудиодорожке, попробуйте выполнить это без второго входного файла. Например:

    ffmpeg -itsoffset 2 -i f.mkv -map 0:v -map 0:a -c copy -to 0:5:0 t0.mkv

    Это позволит обрабатывать груз только одного файла и избежать сложной синхронизации между потоками.

  3. Проверка MJPEG: Убедитесь, что MJPEG-поток действительно необходим для проекта. Если он не нужен, проще убрать его из контейнера. Для этого можно использовать:

    ffmpeg -i f.mkv -map 0:v -map 0:a -map 0:s -c copy -to 0:5:0 t0.mkv
  4. Работа с временными метками: Параметры, такие как -use_wallclock_as_timestamps, могут быть полезны, если возникли проблемы с временными метками. Попробуйте добавить этот параметр при выводе, если возникают проблемы с синхронизацией.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...