Единственный инструмент командной строки 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 кбит / с. Тем не менее, цикл обрезки прекрасно (и включает в себя аудио) при воспроизведении в цикле, так что я думаю, что это действительно с точностью до кадра ...