ฉันจะแยกภาพ JPEG คุณภาพดีจากไฟล์วิดีโอ H264 ด้วย ffmpeg ได้อย่างไร


110

ขณะนี้ฉันกำลังใช้คำสั่งนี้เพื่อแยกภาพ:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_% 03d.jpeg

แต่ฉันจะปรับปรุงคุณภาพของภาพ JPEG ได้อย่างไร?


1
มีอะไรผิดปกติกับคุณภาพในปัจจุบันนอกเหนือจากที่จะไม่ "ดี"?
bjoernz

คำตอบ:


218

ใช้ -qscale:v

ใช้-qscale:v(หรือนามแฝง-q:v) เป็นตัวเลือกเอาต์พุต ช่วงที่มีประสิทธิภาพสำหรับ JPEG คือ 2-31 โดย 31 เป็นคุณภาพที่แย่ที่สุด ฉันแนะนำให้ลองใช้ค่า 2-5

ในการส่งออกชุดภาพ:

ffmpeg -i input.mp4 -qscale:v 2 output_%03d.jpg

ในการส่งออกภาพเดียวที่ระยะเวลา ~ 60 วินาที:

ffmpeg -ss 60 -i input.mp4 -qscale:v 4 -frames:v 1 output.jpg

สิ่งนี้จะใช้ได้กับอินพุตวิดีโอใด ๆ ดูด้านล่างว่าข้อมูลที่คุณป้อนคือ MJPEG หรือไม่


MJPEG

หากอินพุตของคุณเป็น MJPEG (Motion JPEG) คุณสามารถแยกภาพออกมาได้โดยไม่สูญเสียคุณภาพใด ๆ

ffmpegหรือffprobeเอาท์พุทคอนโซลสามารถบอกคุณได้ถ้าใส่ของคุณเป็น MJPEG:

$ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1 input.avi
codec_name=mjpeg

จากนั้นคุณสามารถแยกเฟรมโดยใช้mjpeg2jpegตัวกรอง bitstream :

$ ffmpeg -i input.avi -codec:v copy -bsf:v mjpeg2jpeg output_%03d.jpg

ดูด้วย


สิ่งนี้ดูเหมือนจะไม่มีผลสำหรับฉัน - qscale 1 และ 2 ทั้งคู่ให้ขนาดไฟล์ที่เหมือนกันและ (ด้วยตาเปล่าของฉัน) ดูเหมือนว่าไม่มี qscale เลย
felwithe

คุณสามารถโพสต์บรรทัดคำสั่งทั้งหมดที่คุณใช้อยู่ได้หรือไม่? นอกจากนี้โปรดโพสต์เอาต์พุตที่สมบูรณ์และไม่ได้เจียระไนจาก ffmpeg บน commandline โปรดทราบว่าการวางตำแหน่งของอ็อพชันมีความเกี่ยวข้องดังนั้น -qscale: v 2 จำเป็นต้องวางไว้หลังอ็อพชัน -i inputfile แต่ก่อนอ็อพชันไฟล์เอาต์พุตจึงจะมีผลใด ๆ
Ronald S. Bultje

1
สำหรับฉันการเพิ่ม-qmin 1 -qmax 1นอกจากนี้เพื่อ-q:v 1เพิ่มขนาดไฟล์เป็นสองเท่า และดูเหมือนว่าฉันจะเห็นการปรับปรุงเล็กน้อยเช่นกัน
สอดคล้องกับ

1
@complistic: -qmin 1 -qmax 1ส่งผลให้ไฟล์มีขนาดใหญ่ขึ้น แต่ให้ภาพที่เหมือนกันทุกประการ ฉันตรวจสอบสิ่งนี้ผ่าน photoshop 2 ชั้นและฟิลเตอร์ความแตกต่าง พิกเซลเท่ากัน
cherouvim

@Kostanos -qmin 1 -q:v 1คุณสามารถลอง
llogan

0

แสดงภาพในรูปแบบ lossless เช่น PNG:

ffmpeg.exe -i 10fps.h264 -r 10 -f image2 10fps.h264_%03d.png

จากนั้นใช้โปรแกรมอื่น (ซึ่งคุณสามารถระบุคุณภาพการสุ่มตัวอย่างและวิธี DCT ได้อย่างแม่นยำยิ่งขึ้นเช่น GIMP) เพื่อแปลง PNG ที่คุณต้องการเป็น JPEG

มันเป็นไปได้ที่จะได้รับภาพที่คมชัดขึ้นเล็กน้อยในรูปแบบ JPEG ด้วยวิธีนี้กว่าเป็นไปได้ด้วย-qmin 1 -q:v 1และแสดงผลเป็น JPEG ffmpegโดยตรงจาก


ffmpegเอาต์พุตPNG8ไฟล์ที่ใช้เพียง 256 สี (เช่นเดียวกับ GIF) ดังนั้นจึงเป็นการสูญเสียอย่างมาก
lapin

@lapin PNG ที่ฉันแยกโดยใช้วิธีนี้คือ 24 บิต (แม้สำหรับเฟรมที่มีสีน้อยกว่า 256 สีแม้ว่าสีอื่น ๆ จะมีมากกว่านั้น) นี่คือการใช้เวอร์ชัน 4.2.1 x64 บน Windows นอกจากนี้ยังเขียนนี่คือ: "ถ้าฉันดึง png ของจาก mp4 ด้วยนี้ [ ffmpegคำสั่ง] ฉันได้รับของ PNG คุณภาพสูงที่มีคุณภาพเหมือนกันกับวิดีโอต้นฉบับ." คุณใช้เวอร์ชันใดในการffmpegส่งออกPNG8ไฟล์และรูปแบบการป้อนข้อมูลของคุณคืออะไร?
Jake

อันที่จริงฉันคิดว่าคุณพูดถูกปัญหาคือidentify image.pngให้ผลลัพธ์เป็น "8 บิต" เมื่อจริงๆแล้วมันไม่ใช่ 8 บิตแชนเนลเดียว แต่เป็น 8 บิตสำหรับ R, G และ B IDK ว่าidentifyผู้ใช้ทั่วไปควรจะเข้าใจอย่างไร นั่น
lapin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.