วิธีแยกภาพหน้าจอ 1 ภาพสำหรับวิดีโอด้วย ffmpeg ในเวลาที่กำหนด


109

มีบทช่วยสอนและสิ่งต่างๆมากมายที่แสดงวิธีแยกภาพหน้าจอหลายภาพจากวิดีโอโดยใช้ ffmpeg คุณตั้งค่า -r และคุณสามารถเริ่มจำนวนหนึ่งใน.

แต่ฉันต้องการภาพหน้าจอ 1 ภาพที่พูด 01:23:45 นิ้วหรือ 1 ภาพหน้าจอที่ 86% ใน

ทั้งหมดนี้เป็นไปได้ด้วยffmpegthumbnailerแต่เป็นการพึ่งพาอื่นที่ฉันไม่ต้องการขึ้นอยู่กับ ฉันต้องการที่จะทำกับ ffmpeg

คำตอบ:


210

ใช้-ssตัวเลือก:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • สำหรับเอาต์พุต JPEG ใช้-q:vเพื่อควบคุมคุณภาพเอาต์พุต Full range คือสเกลเชิงเส้น 1-31 ซึ่งค่าที่ต่ำกว่าจะส่งผลให้คุณภาพสูงขึ้น 2-5 เป็นช่วงที่ดีที่จะลอง

  • เลือกตัวกรองให้วิธีทางเลือกสำหรับความต้องการที่ซับซ้อนมากขึ้นเช่นการเลือกเฉพาะบางประเภทกรอบหรือ 1 ต่อ 100 ฯลฯ

  • การวาง-ssก่อนการป้อนข้อมูลจะเร็วขึ้น ดูFFmpeg Wiki: การค้นหาและข้อความที่ตัดตอนมาจากffmpegเอกสารเครื่องมือ cli :

-ss ตำแหน่ง (อินพุต / เอาต์พุต)

เมื่อใช้เป็นตัวเลือกอินพุต (ก่อนหน้า-i) ให้ค้นหาไฟล์อินพุตนี้เพื่อวางตำแหน่ง โปรดสังเกตว่าในรูปแบบส่วนใหญ่จะไม่สามารถค้นหาได้อย่างแน่นอนดังนั้นffmpegจะค้นหาจุดค้นหาที่ใกล้ที่สุดก่อนตำแหน่ง เมื่อทำการแปลงและ-accurate_seekเปิดใช้งาน (ค่าเริ่มต้น) เซ็กเมนต์พิเศษระหว่างจุดค้นหาและตำแหน่งนี้จะถูกถอดรหัสและละทิ้ง เมื่อทำการสตรีมคัดลอกหรือใช้เมื่อ -noaccurate_seekใดก็จะถูกเก็บรักษาไว้

เมื่อใช้เป็นอ็อพชันเอาต์พุต (ก่อนชื่อไฟล์เอาต์พุต) จะถอดรหัส แต่จะละทิ้งอินพุตจนกว่าการประทับเวลาจะถึงตำแหน่ง

ตำแหน่งอาจเป็นวินาทีหรือในhh:mm:ss[.xxx]รูปแบบก็ได้


2
เร็วกว่านี้มาก ขอบคุณมาก. การใส่ -ss ก่อนสร้างความแตกต่างอย่างมาก
Peter Bengtsson

มีวิธีใดบ้างที่จะได้รับเฟรมที่ n หลังจากเวลาที่กำหนด?
dorien

@GuntherPiez ฉันไม่เห็นการกล่าวถึงที่ใดเลยเกี่ยวกับสิ่งประดิษฐ์ที่เป็นไปได้
Stefan Reich

2
โปรดทราบว่าvframesล้าสมัยใน (อย่างน้อย) เวอร์ชัน 4.2.2 ตามคู่มือ "[ vframes] เป็นนามแฝงที่ล้าสมัยสำหรับ" -frames:v"ซึ่งคุณควรใช้แทน"
Synexis

ทำงานได้อย่างสมบูรณ์แบบและรวดเร็ว
Smeterlink

37

FFMpeg สามารถทำได้โดยค้นหาการประทับเวลาที่กำหนดและแยกหนึ่งเฟรมเป็นรูปภาพดูตัวอย่างเช่น:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg

มาอธิบายตัวเลือก:

-i input file           the path to the input file
-ss 01:23:45            seek the position to the specified timestamp
-vframes 1              only handle one video frame
output.jpg              output filename, should have a well-known extension

-ssพารามิเตอร์ยอมรับค่าในรูปแบบHH:MM:SS[.xxx]หรือเป็นจำนวนในไม่กี่วินาที หากคุณต้องการเปอร์เซ็นต์คุณต้องคำนวณระยะเวลาของวิดีโอล่วงหน้า


ดูเหมือนจะทำงานตามที่คาดไว้ ฉันกำลังเปรียบเทียบว่านี่เป็นความเร็วเดียวกับการใช้ ffmpegthumbnailer หรือไม่
Peter Bengtsson

ใช่วิธีนี้ช้ามาก ดูpeterbe.com/plog/fastest-way-to-take-screencaps-out-of-videos
Peter Bengtsson

7
ลองใช้ตัวเลือก -ss ก่อน -i เนื่องจากจะข้ามส่วนการถอดรหัสของไปป์ไลน์ ซึ่งอาจทำให้กระบวนการนี้เร็วขึ้น
SirDarius

1
มีวิธีใดบ้างในการส่งออกเป็น PNG ไปยังสตรีมแทนที่จะเป็นไฟล์
Nicke

1
@NickeManarin ใช่ ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg.. โปรดสังเกตว่าฉันยังใส่-ssตัวเลือก "ค้นหา" ไว้หน้าไฟล์อินพุตในบรรทัดคำสั่งตามที่คนอื่นแนะนำ
Glenn Slayden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.