Я попытался вырезать видео, используя время начала и окончания видео, используя следующую команду
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
в команду, т.е.
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4
Сейчас работает нормально.
linux
video
ffmpeg
video-editing
Калай
источник
источник
Ответы:
У вас, вероятно, нет ключевого кадра на отметке 3 секунды. Поскольку не ключевые кадры кодируют отличия от других кадров, им требуются все данные, начиная с предыдущего ключевого кадра.
С контейнером mp4 можно вырезать не ключевой кадр без перекодирования с использованием списка редактирования. Другими словами, если ближайший ключевой кадр до 3 с равен 0, то он скопирует видео, начинающееся с 0, и использует список редактирования, чтобы указать игроку начать воспроизведение через 3 секунды.
Если вы используете последнюю версию ffmpeg из git master, она сделает это с помощью списка редактирования при вызове с помощью предоставленной вами команды. Если это не работает для вас, то вы, вероятно, используете старую версию ffmpeg, или ваш плеер не поддерживает редактирование списков. Некоторые проигрыватели игнорируют список редактирования и всегда воспроизводят все файлы в файле от начала до конца.
Если вы хотите точно вырезать, начиная с не ключевого кадра, и хотите, чтобы он воспроизводился, начиная с нужной точки на проигрывателе, который не поддерживает списки редактирования, или хотите убедиться, что вырезанная часть фактически не находится в выходном файле (например, если он содержит конфиденциальную информацию), то вы можете сделать это путем перекодирования, чтобы ключевой кадр был точно в желаемое время начала. Перекодировка используется по умолчанию, если вы не укажете
copy
. Например:При перекодировании вы также можете включить дополнительные параметры, связанные с качеством, или конкретный кодер AAC. Для получения дополнительной информации см. Руководство по кодированию xf64 ffmpeg для видео и Руководство по кодированию AAC для аудио.
Кроме того,
-t
опция указывает продолжительность, а не время окончания. Приведенная выше команда будет кодировать 8 секунд видео, начиная с 3 секунд. Для начала в 3с и конца в 8с используйте-t 5
. Если вы используете последнюю версию FFmpeg можно также заменить-t
с-to
в вышеприведенной команде до конца в заданное время.источник
-t
/-to
и его аргумент, чтобы продолжить до конца.-ss
вводить ДО входного файла (до-i
), потому что таким образом ffmpeg будет пропускать непосредственно к месту. Тем не менее, это также установит время «ноль» для этого места, а это означает, что-to
будет указывать на неправильное время. Источник: trac.ffmpeg.org/wiki/Seekingffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
возникает проблема синхронизации аудио и видео , хотя в оригинальном файле такой проблемы нет.-async 1
.Попробуйте использовать это. Это самый быстрый и лучший способ ffmpeg, который я понял:
Эта команда обрезает ваше видео в считанные секунды!
Я объяснил это в моем блоге здесь :
Формат синхронизации: чч: мм: сс
Обратите внимание, что текущий ответ с высоким рейтингом устарел, и обрезка будет очень медленной. Для получения дополнительной информации посмотрите эту официальную статью ffmpeg .
источник
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4
. Теперь, однако, пропуск пропущен, а время окончания неверно (в моем случае).Используйте -c copy для быстрого создания. В этом случае ffmpeg не перекодирует видео, а просто обрезает его в соответствии с размером.
источник
ffmpeg -i movie.mkv -vcodec copy -acodec copy converted_movie.mp4
и наоборотБросьте все, кроме второго 3 до второго 8.
источник
setpts=PTS-STARTPTS
фильтрами цепочки после фильтра обрезки.-strict -2
раньшеcut.mp4
(в отличие от конца командной строки)?Чтобы вырезать на основе начального и конечного времени исходного видео и избежать необходимости выполнять математические операции, укажите конечное время в качестве параметра ввода и начальное время в качестве параметра вывода.
Это произведет 15-секундное сокращение с 0:45 до 1:00.
Это связано с тем, что когда
-ss
задан параметр вывода, выброшенное время по-прежнему включается в общее время, считываемое с входа, которое-t
используется для определения момента остановки. Принимая во внимание, что если-ss
задано в качестве параметра ввода , время начала ищется, а не подсчитывается , откуда и возникает путаница.Это медленнее, чем поиск, так как пропущенный сегмент все еще обрабатывается перед тем, как быть сброшенным, но это единственный способ сделать это, насколько я знаю. Если вы вырезаете изнутри большого файла, более разумно просто посчитать и использовать
-ss
для ввода.источник
Вот что я использую:
Созданные
mp4
файлы также могут быть использованы вiMovie
.Ссылка: https://www.arj.no/2018/05/18/trimvideo
Если вы хотите объединить несколько кат-сцен, вы можете использовать следующий скрипт:
источник
Используйте -to вместо -t: -to указывает время окончания, -t указывает продолжительность
источник
Несмотря на то, что я опоздал на 6 лет, но я думаю, что все ответы выше не правильно ответили на вопрос, который задает @kalai . Приведенный ниже скрипт bash обработает текстовый файл в следующем формате:
например
и перебирает файл, загружает файл, который
youtube-dl
поддерживает, вычисляет длительность междуstart_time
иend_time
и передает егоffmpeg
, так-t
как фактически является продолжительностью , а не реальнойend_time
Ударь меня, если у тебя есть вопросы.
источник