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

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

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

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

Изменить 1:

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

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

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

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

поэтому я добавил -strict -2 в команду i.e.,

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

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

Ответ 1

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

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

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

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

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

При повторном кодировании вы также можете включить дополнительные параметры, связанные с качеством, или конкретный кодер AAC. Подробнее см. Ffmpeg x264 Руководство по кодированию для видео и AAC Encoding Guide для аудио.

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

Ответ 2

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

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

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

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

-i: Здесь указывается входной файл. В этом случае это (input.mp4).
-ss: Используется с -i, он ищет во входном файле (input.mp4) позицию.
00:01:00: Это время, когда начинается ваше обрезанное видео.
-to: Здесь указывается продолжительность от начала (00:01:40) до конца (00:02:12).
00:02:00: На этом видео закончится.
-c copy: Это опция для обрезки через потоковое копирование. (NB: очень быстро)

Формат времени: чч: мм: сс

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

Ответ 3

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

Используйте -c copy для совершения моментально. В этом случае ffmpeg не будет перекодировать видео, просто вырезается до соответствующего размера.

Ответ 4

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

Отбросьте все, кроме второго со второго на восьмое.

Ответ 5

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

ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg

Это приведет к 15-секундному сокращению с 0:45 до 1:00.

Это связано с тем, что, когда -ss задается как опция вывода, выброшенное время по-прежнему включается в общее время, считываемое с входа, которое -t использует, чтобы узнать, когда нужно остановиться. Принимая во внимание, что если -ss задано как опция ввода, время начала ищется, а не подсчитывается, откуда и возникает путаница.

Это медленнее, чем поиск, так как пропущенный сегмент все еще обрабатывается перед тем, как быть сброшенным, но это единственный способ сделать это, насколько я знаю. Если вы вырезаете изнутри большого файла, более разумно просто посчитать и использовать -ss для ввода.

Ответ 6

Вот что я только что использовал:

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


Созданный файл mp4 также можно использовать в iMovie.

Ссылка: https://www.arj.no/2018/05/18/trimvideo/