1

Nb: я неправильно задал этот вопрос при stackoverflow

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

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

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

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

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

2 ответа2

1

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

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

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

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

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

1

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .