ffmpeg для разделения файла mp4 на сегменты… после первого сегмента звук рассинхронизирован

ffmpeg для разделения файла mp4 на сегменты… после первого сегмента звук рассинхронизирован

Примечание: Я неправильно понялзадал этот вопросна stackoverflow

Я использовал командную строку ffmpeg, показанную вэтот вопросдля идеального разделения файлов MKV в течение длительного времени. Теперь у меня есть несколько файлов MP4, которые я хотел бы разделить, и поначалу это, казалось, работало, но каждый последующий сегмент после первого имеет звук, не синхронизированный! И на несколько секунд.

Я пробовал принудительно устанавливать ключевые кадры (совет, который я нашел на других сайтах), но это не помогло.

Я попробовал совершенно другую программу (Avidemux), и она смогла разделить файл с правильным выводом, но это было НАМНОГО медленнее, заняв более 3 минут по сравнению с менее чем 2 секундами с ffmpeg. С Avidemux я смог определить точное положение i-frame, где я хотел разделить, поэтому, думая, что это проблема синхронизации, я попробовал именно это положение (т. е. 00:12:17.111 вместо 00:12:16 или что-то в этом роде), но это тоже не помогло.

Есть ли упущенная мной опция в ffmpeg, позволяющая правильно синхронизировать звук с видео при разделении?

Просто примечание: я использовал версию ffmpeg 2013 года. Я только что обновил ее до последней версии 2.6, но проблема осталась.

решение1

Согласно документации, флаг -ss выполняет разные функции в зависимости от того, где он находится в команде.

-ss position (вход/выход) При использовании в качестве опции ввода (перед -i) ищет позицию в этом входном файле. Обратите внимание, что в большинстве форматов невозможно выполнить точный поиск, поэтому ffmpeg будет искать ближайшую точку поиска перед позицией. При транскодировании и включении -accurate_seek (по умолчанию) этот дополнительный сегмент между точкой поиска и позицией будет декодирован и отброшен. При выполнении копирования потока или при использовании -noaccurate_seek он будет сохранен.

При использовании в качестве выходной опции (перед именем выходного файла) декодирует, но отбрасывает входные данные до тех пор, пока временные метки не достигнут заданной позиции.

позиция может быть указана либо в секундах, либо в формате чч:мм:сс[.xxx].

Итак, из вашего собственного ответа следует, что первая команда применяет логику на выходе, а вторая команда применяет ее на входе.

решение2

Я не уверен, что понимаю ПОЧЕМУ, но проблема была в порядке параметров.

В приведённом примере команда выглядит следующим образом:

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

Конечно, я использую mp4 вместо avi, но в остальном я вводил команду точно так же, как указано выше, и (с mp4) получал рассинхронизированный аудио результат. Я случайно наткнулся на это "исправление"... если я вместо этого введу команду таким образом:

ffmpeg -ss 00:30:00 -i input.mp4 -vcoded copy -acodec copy -t 00:30:00 output2.mp4

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

Связанный контент