Das einzige Linux-Kommandozeilen-Tool, das ich bisher gefunden habe und das bildgenau (oder bildgenau) schneiden kann, ist melt
( sudo apt-get install melt
).
Angenommen, Sie haben eine inputvid.mp4
- überprüfen Sie zuerst die Codierungseinstellungen mit say ffmpeg
(hier sage ich nur, dass ich sie erneut codieren möchte -f mp4
, aber da die Datei /dev/null
so verworfen wird, leite ich stderr um, damit ich sie durchgehen kann - notieren Sie sich in der Mitte y
Wenn der Befehl dazu auffordert und Sie mit der EINGABETASTE antworten , fährt der Prozess fort und gibt die nützlichen Informationen aus (dies ist mit ffmpeg 3.3.3 unter 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
Ok, wir können also eine ffmpeg
Auswahl libx264
und aac
Encoder für dieses Video sehen. dann können wir dies eingeben für melt
:
melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264
.... und melt
schneidet mit dem Stück zwischen den Frames 7235 und 7349 in eine neue Datei cut.mp4
. Um zu überprüfen, ob die cut.mp4
Schleifen korrekt sind, geben Sie melt
sie noch einmal zweimal wieder - und spielen Sie sie in einem SDL-Fenster ab:
melt cut.mp4 cut.mp4 -consumer sdl
... und hier ist was ffmpeg
für diese Datei zu sehen:
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
Die Einstellungen für cut.mp4
die Videokodierung scheinen mit inputvid.mp4
Ausnahme der Änderung der Videobitrate von 389 kb / s auf 526 kb / s identisch zu sein , und auch die Einstellungen für die Audiokodierung sind nahezu identisch, außer dass die Abtastrate von 44100 auf 48000 Hz geändert wurde. das kann man aber regeln mit:
melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k
... die endgültige Video-Bitrate beträgt für mich jedoch 337 kb / s. Trotzdem sind die Schnitte bei der Wiedergabe in einer Schleife in Ordnung (und das schließt auch Audio ein), also denke ich, dass dies tatsächlich bildgenau ist ...