Công cụ dòng lệnh Linux duy nhất tôi tìm thấy cho đến nay, có thể cắt ở khung chính xác (hoặc, với độ chính xác của khung), là melt
( sudo apt-get install melt
).
Giả sử bạn có inputvid.mp4
- trước tiên hãy kiểm tra cài đặt mã hóa của nó bằng cách nói ffmpeg
(ở đây, tôi chỉ nói rằng tôi muốn mã hóa lại -f mp4
, nhưng vì tệp /dev/null
bị loại bỏ, tôi chuyển hướng stderr để tôi có thể grep qua nó - ghi chú ở giữa , lệnh sẽ nhắc và bạn nên trả lời y
bằng ENTER, vì vậy quá trình tiến hành và bỏ thông tin hữu ích, đây là với ffmpeg 3.3.3 trên 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, vì vậy chúng ta có thể thấy các ffmpeg
lựa chọn libx264
và aac
bộ mã hóa cho video này; sau đó chúng ta có thể nhập cái này vào cho melt
:
melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac vcodec=libx264
.... và melt
sẽ cắt với phần giữa khung 7235 và 7349 thành một tệp mới , cut.mp4
. Sau đó, để kiểm tra xem cut.mp4
các vòng lặp có chính xác không, sử dụng melt
lại để phát lại hai lần - và phát nó vào cửa sổ SDL:
melt cut.mp4 cut.mp4 -consumer sdl
... và đây là những gì ffmpeg
nhìn thấy cho tập tin này:
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
Các cài đặt mã hóa video cut.mp4
dường như giống hệt với inputvid.mp4
ngoại trừ bitrate video đã thay đổi từ 389 kb / s thành 526 kb / s, và các cài đặt mã hóa âm thanh cũng gần giống nhau, ngoại trừ tốc độ lấy mẫu thay đổi từ 44100 thành 48000 Hz; mặc dù điều đó có thể được quy định với:
melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k
... tuy nhiên, ngay cả với điều này, tốc độ bit video cuối cùng đối với tôi kết thúc là 336 kb / s. Tuy nhiên, vòng lặp cắt tốt (và bao gồm âm thanh) khi được phát trong một vòng lặp, vì vậy tôi đoán đây thực sự là khung hình chính xác ...