Точно вырезать видео файлы из командной строки

22

У меня проблемы с поиском приложения cli, которое может взять видеофайл (желательно avi, mkv и mp4) и вырезать очень короткие клипы (2-6 секунд) с точностью до времени. Я пробовал ffmpeg , mencoder , avidemux и mp4box, но все они вырезаны на ключевых кадрах, которые создают более 6 секундных клипов. Есть ли инструмент, который перекодирует входной файл и сокращает точное время или неточно, повторно кодирует, а затем точно вырезает?

curmil
источник
Вам, вероятно, придется перекодировать, прежде чем вырезать, чтобы сделать это правильно. Вероятно, вы могли бы ускорить процесс, сначала вырезав окружающие ключевые кадры и только перекодировав фрагменты.
Нифл
4
Какую команду FFmpeg вы пробовали? Я полагаю, если вы декодируете видео до (то есть размещаете -ssпараметр после -i ), оно должно быть более точным.
slhck
1
Трюк с FFmpeg сработал! Я не осознавал, что заказ так важен. Это то же самое для любого другого инструмента?
Curmil

Ответы:

23

Резка видео с ffmpeg

Вы можете точно вырезать видео с FFmpeg. С версии 2.5 это очень просто. Это, например, сократит 10 секунд, начиная с 0 минут, 3 секунд и 123 миллисекунд.

ffmpeg -ss 00:00:03.123 -i input.mp4 -t 10 -c:v libx264 -c:a copy out.mp4

Положение и время могут быть в секундах или в hh:mm:ss[.xxx]форме.

Обратите внимание, что в этих примерах видео будет перекодировано с использованием кодера x264 ; аудио скопировано.

Вы также можете использовать -toвместо, -tчтобы указать конечную точку вместо продолжительности. В этом случае, однако, -toэто эквивалентно -t, так как, помещая -ssперед -i, ffmpeg сначала будет искать эту точку, а затем начнет выводить.

Смотрите также статью в поиске вики.


Точная резка для старых ffmpegверсий

Если у вас более старая версия ffmpeg, то для точного поиска вам нужно разместить -ssпосле -i, что делает процесс кодирования немного медленнее, потому что сначала нужно декодировать все видео:

ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a copy out.mp4

Здесь -toи -tведут себя по-другому. -t 10создаст клип длиной десять секунд, а -to 10клип длиной семь секунд.

slhck
источник
Вместо того, чтобы -c:v libx264 -c:a libfaacдумать, мы можем использовать -acodec copy -vcodec copyкоманду ffmpeg, которая просто обнаруживает и использует те же кодеки, что и исходный файл. Кто-нибудь может подтвердить?
Baodad
2
@Baodad Вы можете, но это не будет точно вырезать. При копировании видео / аудио битовых потоков ffmpeg должен начинаться с ключевого кадра, который может быть помещен в каждую секунду или даже дальше друг от друга.
Slhck
Как преодолеть ошибку «Неизвестный кодировщик« libfaac »»?
Даг
@Doug Выберите другой кодировщик, например -c:a aac -strict experimental. Это самое простое решение.
Slhck
1

Единственный инструмент командной строки Linux, который я нашел, который может вырезать с точным кадром (или, с точностью до кадра), это melt( sudo apt-get install melt).

Скажем, у вас есть inputvid.mp4- сначала проверьте его настройки кодирования с помощью say ffmpeg(здесь, я просто говорю, что хочу снова закодировать его -f mp4, но как файл, /dev/nullтак что вывод отбрасывается; я перенаправляю stderr, чтобы я мог просмотреть его - обратите внимание на середину , команда запрашивает, и вы должны ответить yс помощью ENTER, чтобы процесс продолжил и выгрузил полезную информацию (это с ffmpeg 3.3.3 на Ubuntu 14):

ffmpeg -i inputvid.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x360 [SAR 1:1 DAR 16:9], 389 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p(progressive), 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

Итак, мы можем видеть ffmpegвыбор libx264и aacкодировщики для этого видео; тогда мы можем ввести это для melt:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264

.... и meltбудет разрезан на части между кадрами 7235 и 7349 в новый файл cut.mp4. Затем, чтобы проверить cut.mp4правильность циклов, используйте meltснова, чтобы воспроизвести его дважды - и воспроизвести в окне SDL:

melt cut.mp4 cut.mp4 -consumer sdl

... и вот что ffmpegвидит этот файл:

ffmpeg -i cut.mp4 -f mp4 /dev/null 2>&1 | grep 'Stream\|encoder'    encoder         : Lavf54.20.4
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 526 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 182 kb/s (default)
y
File '/dev/null' already exists. Overwrite ? [y/N] Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
    encoder         : Lavf57.71.100
    Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x360 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 24k tbn, 23.98 tbc (default)
      encoder         : Lavc57.89.100 libx264
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s (default)
      encoder         : Lavc57.89.100 aac

Настройки кодирования видео для, cut.mp4кажется, идентичны, за inputvid.mp4исключением того, что битрейт видео изменен с 389 кбит / с до 526 кбит / с, а также настройки кодирования аудио почти одинаковы, за исключением того, что частота дискретизации изменилась с 44100 до 48000 Гц; хотя это можно регулировать с помощью:

melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k

... однако, даже с этим, окончательный битрейт видео для меня заканчивается 337 кбит / с. Тем не менее, цикл обрезки прекрасно (и включает в себя аудио) при воспроизведении в цикле, так что я думаю, что это действительно с точностью до кадра ...

sdaau
источник
1
meltперекодирует видео и использует библиотеки FFmpeg внизу. Если вы разрешите перекодирование, ffmpeg может выдать тот же результат.
Гьян
Спасибо @Gyan - не знал об этом (особенно это касается meltбиблиотек FFmpeg), приятно знать!
Сдау
melt выглядит проще в использовании, чем ffmpeg, все, что нам нужно, это способ указать время, особенно время в часах, минутах, секундах или часах, минутах, секундах, мс, которое преобразует их в нужный кадр.
Бароп
0

Как сказал Баодад в комментариях (я пишу, потому что это не так легко найти, если вы быстро читаете), лучший способ - автоматически определять аудио / видео кодировщики с помощью ffmpeg, поэтому:

ffmpeg -ss 00:05:17.18 -i in.mp4 -t 00:06:29.10 -acodec copy -vcodec copy out.mp4 
  • начало @ 00: 05: 17.18
  • input = in.mp4
  • остановка @ 00: 06: 29.10
  • выход = out.mp4
Жиль Квено
источник
2
Это не перекодирует и не обеспечивает точность кадра.
Андреа Лаззаротто