เครื่องมือบรรทัดคำสั่ง Linux เดียวที่ฉันพบในตอนนี้ซึ่งสามารถตัดที่เฟรมที่แน่นอน (หรือด้วยความแม่นยำของเฟรม) คือmelt
( sudo apt-get install melt
)
สมมติว่าคุณมีinputvid.mp4
- ก่อนตรวจสอบการตั้งค่าการเข้ารหัสด้วยคำพูดffmpeg
(ที่นี่ฉันแค่บอกว่าฉันต้องการเข้ารหัสอีกครั้งเพื่อ-f mp4
แต่เป็นไฟล์/dev/null
เพื่อให้การส่งออกถูกทิ้งฉันเปลี่ยนเส้นทาง stderr เพื่อให้ฉันสามารถ grep ผ่านมัน - ทราบตรงกลาง คำสั่งจะแจ้งให้และคุณควรตอบ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 kb / s เป็น 526 kb / s และการตั้งค่าการเข้ารหัสเสียงเกือบจะเหมือนกันยกเว้นอัตราการสุ่มเปลี่ยนจาก 44100 เป็น 48000 Hz; แม้ว่าที่สามารถควบคุมได้ด้วย:
melt inputvid.mp4 in=7235 out=7349 -consumer avformat:cut.mp4 acodec=aac ar=44100 ab=95k vcodec=libx264 vb=389k
... อย่างไรก็ตามถึงกระนั้นอัตราบิตสุดท้ายของวิดีโอสำหรับฉันก็จบลงที่ 337 kb / s ถึงกระนั้นการตัดลูปก็ละเอียด (และนั่นรวมถึงเสียง) เมื่อเล่นในลูปดังนั้นฉันเดาว่านี่เป็นความแม่นยำของเฟรม ...