Вырезание видео на основе времени начала и окончания с помощью ffmpeg

Я попытался вырезать видео, используя время начала и окончания видео, используя следующую команду

ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4

используя приведенную выше команду, я хочу вырезать видео из 00:00:03 to 00:00:08. Но он не режет видео между этими временами, а вместо этого он режет видео с первыми 11 секундами. может ли кто-нибудь помочь мне решить эту проблему?

Edit 1:

Я попытался вырезать, используя следующую команду, которая предлагается by mark4o

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

но была показана следующая ошибка.

кодер " aac " является экспериментальным, но экспериментальные кодеки не включены

Итак, я добавил -strict -2 в команду, т. е.

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4

теперь он работает нормально.

4 ответов


вы, вероятно, не кадр в 3 секунды. Поскольку неключевые кадры кодируют отличия от других кадров, они требуют все данные, начиная с предыдущего ключевого кадра.

с контейнером mp4 можно вырезать на неключевом кадре без повторного кодирования с помощью списка редактирования. Другими словами, если ближайший ключевой кадр перед 3s находится в 0s, то он будет копировать видео, начиная с 0s и использовать список редактирования, чтобы сказать игроку, чтобы начать играть 3 секунды в.

если вы используете последние ffmpeg из git master он будет делать это с помощью списка редактирования при вызове с помощью команды, которую вы предоставили. Если это не работает для вас, вы, вероятно, либо используете более старую версию ffmpeg, либо ваш плеер не поддерживает списки редактирования. Некоторые игроки будут игнорировать список редактирования и всегда воспроизводить все носители в файле от начала до конца.

если вы хотите отрезать точно начинать на non-keyframe и хотите, чтобы он играл, начиная с нужной точки на проигрывателе, который не поддерживает списки редактирования, или хотите убедиться, что вырезанная часть на самом деле не находится в выходном файле (например, если он содержит конфиденциальную информацию), то вы можете сделать это, перекодировав так, что будет ключевой кадр точно в нужное время запуска. Повторное кодирование по умолчанию, если не указано copy. Например:

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

при повторном кодировании вы также можете включить дополнительные параметры, связанные с качеством, или конкретный кодировщик AAC. Дополнительные сведения см. В разделе пакет ffmpeg это кодирования для x264 руководство и руководство по кодированию AAC аудио.

и -t опция указывает длительность, а не время окончания. Вышеуказанная команда будет кодировать 8s видео, начиная с 3s. Чтобы начать с 3s и закончить на 8s используйте -t 5. Если вы используете текущую версию ffmpeg, вы также можете заменить -t С -to в приведенной выше команде до конца по указанное время.


попробуйте использовать эту. Это самый быстрый и лучший ffmpeg-способ, которым я это понял:

 ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4

эта команда обрезает видео в считанные секунды!

Я объяснил это в своем блоге здесь:

Я: это указывает входной файл. В этом случае, это (ввод.МР4).
-ss: используется с -i, это ищет во входном файле (input.mp4) в положение.
00:01:00: Это время, с которого начнется обрезанное видео.
- to: это указывает продолжительность от начала (00: 01:40) до конца (00:02: 12).
00:02:00: это время, когда ваше обрезанное видео закончится.
-C копировать: это опция для обрезки через потоковое копирование. (Прим.: очень быстро)

формат времени: hh: mm: ss

обратите внимание, что текущий сильно загруженный ответ устарел и обрезка будет очень медленно. Для получения дополнительной информации посмотрите на этот официальный ffmpeg статьи.


ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

использовать -C копировать Для в мгновенно. В этом случае ffmpeg не будет перекодировать видео, просто вырезать по размеру.


    ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4

отбросьте все, кроме второго 3 до второго 8.