A única ferramenta de linha de comando do Linux que eu encontrei até agora, que pode cortar no quadro exato (ou, com precisão), é melt
( sudo apt-get install melt
).
Digamos que você tenha inputvid.mp4
- primeiro verifique suas configurações de codificação com o say ffmpeg
(aqui, eu apenas digo que quero codificá-lo novamente para -f mp4
, mas como o arquivo /dev/null
para que a saída seja descartada; eu redireciono o stderr para que eu possa fazer a grep - observe no meio , o comando solicita e você deve responder y
com ENTER, para que o processo prossiga e despeje as informações úteis; isso é com o ffmpeg 3.3.3 no 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, para que possamos ver ffmpeg
escolhas libx264
e aac
codificadores para este vídeo; então podemos inserir isso para melt
:
melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264
.... e melt
cortará com a peça entre os quadros 7235 e 7349 em um novo arquivo cut.mp4
. Em seguida, para verificar se os cut.mp4
loops estão corretos, use melt
novamente para reproduzi-lo duas vezes - e reproduza-o em uma janela SDL:
melt cut.mp4 cut.mp4 -consumer sdl
... e aqui está o que ffmpeg
vê para este arquivo:
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
As configurações de codificação de vídeo cut.mp4
parecem idênticas, inputvid.mp4
exceto a taxa de bits do vídeo alterada de 389 kb / s para 526 kb / s, e também as configurações de codificação de áudio são praticamente as mesmas, exceto a taxa de amostragem alterada de 44100 para 48000 Hz; embora isso possa ser regulado com:
melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k
... no entanto, mesmo com isso, a taxa de bits final do vídeo para mim acaba com 337 kb / s. Ainda assim, os cortes fazem um loop fino (e isso inclui áudio) quando reproduzidos em um loop, então acho que isso é realmente preciso do quadro ...