ฉันจะแปลงไฟล์วิดีโอเป็นลำดับภาพได้อย่างไรเช่นหนึ่งเฟรมทุก ๆ N วินาที mplayer หรือ ffmpeg สามารถทำสิ่งนี้ได้หรือไม่? ฉันใช้ MPlayer เพื่อจับภาพหน้าจอด้วยตนเอง แต่ฉันต้องการทำให้เป็นแบบอัตโนมัติสำหรับวิดีโอขนาดยาว
ฉันจะแปลงไฟล์วิดีโอเป็นลำดับภาพได้อย่างไรเช่นหนึ่งเฟรมทุก ๆ N วินาที mplayer หรือ ffmpeg สามารถทำสิ่งนี้ได้หรือไม่? ฉันใช้ MPlayer เพื่อจับภาพหน้าจอด้วยตนเอง แต่ฉันต้องการทำให้เป็นแบบอัตโนมัติสำหรับวิดีโอขนาดยาว
คำตอบ:
มันง่ายมากกับ ffmpeg และสามารถส่งออกหนึ่งเฟรมทุก ๆ N วินาทีโดยไม่ต้องใช้สคริปต์เพิ่มเติม หากต้องการส่งออกเป็นลำดับภาพให้ใช้myimage_%04d.png
หรือคล้ายกับเอาต์พุต %0xd
บิตจะถูกแปลงเป็นศูนย์เบาะจำนวนเต็มx
ตัวเลขยาว - ตัวอย่างฉันให้ได้รับการส่งออกเป็น
myimage_0000.png
, myimage_0001.png
,myimage_0002.png
ฯลฯ ..
คุณสามารถใช้รูปแบบภาพนิ่งมากมาย png, jpeg, tga หรืออะไรก็ได้ (ดูffmpeg -formats
รายการทั้งหมด)
ตกลงตอนนี้เรารู้วิธีส่งออกภาพยนตร์เป็นลำดับรูปภาพ แต่บอกว่าเราไม่ต้องการส่งออกทุกเฟรมใช่ไหม
เคล็ดลับคือเพียงแค่เปลี่ยนอัตราเฟรมของเอาต์พุตเป็นสิ่งที่เราต้องการโดยใช้-r n
ตัวเลือกที่n
มีจำนวนเฟรมต่อวินาที 1 เฟรมต่อวินาทีจะเป็น-r 1
หนึ่งเฟรมทุก ๆ สี่วินาทีจะเป็น-r 0.25
หนึ่งเฟรมทุก ๆ สิบวินาทีจะเป็น-r 0.1
เช่นนั้น
เพื่อที่จะนำมันทั้งหมดเข้าด้วยกันนี้เป็นวิธีที่มันจะมีลักษณะที่จะบันทึกหนึ่งเฟรมของinput.mov
ทุกสี่วินาทีoutput_0000.png
, output_0001.png
ฯลฯ .:
ffmpeg -i input.mov -r 0.25 output_%04d.png
โปรดทราบว่า-r 0.25
ตัวเลือกที่จะไปหลังจาก-i input.mov
ส่วนหนึ่งเพราะการควบคุมอัตราเฟรมของเอาท์พุท หากคุณใส่ไว้ก่อนหน้าอินพุตจะถือว่าไฟล์อินพุตราวกับว่ามีอัตราเฟรมที่ระบุ
เปลี่ยน XD% ถึงตัวเลขอย่างไรก็ดีหลายคนที่คุณต้องการเช่นถ้าคำสั่งจะสร้างมากกว่า 10,000 เฟรมเปลี่ยนไป%04d
%05d
ยังใช้งานได้กับไฟล์อินพุตที่เป็นลำดับภาพ อ่านเพิ่มเติมที่นี่
ผู้ใช้ Windows : ในการใช้บรรทัดคำสั่ง%
ตัวอย่าง: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png
ใน CMD และ BAT Scripts ใช้ %%
ตัวอย่าง: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png
ดังนั้นสองครั้ง%%
ในสคริปต์และเดี่ยว%
ในบรรทัดคำสั่งแบบโต้ตอบ ทำให้มันผิดในสถานการณ์ใดสถานการณ์หนึ่งจะสร้างข้อผิดพลาด
-r
ถ้าฉันต้องการส่งออกทุกเฟรม ถ้าฉันรู้ FPS ของวิดีโอฉันเดาว่าฉันป้อนข้อมูลนั้น แต่ถ้าฉันไม่ทำล่ะ
jpegs
สำหรับการนี้เว้นแต่คุณจะแน่ใจpng
's เป็นสิ่งที่คุณต้องการ ในกรณีของฉันjpeg
แต่ละอันมีขนาดประมาณ 50kb และpng
ประมาณ 2MB
-q:v 1
เป็นตัวเลือกที่มีประโยชน์มากที่นี่ในsuperuser.com/questions/318845/ …
mplayer -vo jpeg -sstep 5 file.avi
จะบันทึกเฟรมเป็นไฟล์ jpeg ทุก 5 วินาที
อย่างไรก็ตามมันจะไม่หยุดในตอนท้ายของไฟล์มันจะยังคงผลิตสำเนาของเฟรมสุดท้าย หากต้องการหลีกเลี่ยงปัญหานี้ให้ค้นหาระยะเวลาของวิดีโอในไม่กี่วินาทีโดยใช้เครื่องเล่นอื่นหรือกับ mplayer:
mplayer -vo null -ao null -frames 0 -identify file.avi
และค้นหาบรรทัดเช่น "ID_LENGTH = 147.00"
ลบ 2 จากความยาวและใช้ค่านี้สำหรับ-endpos
ตัวเลือก ตัวอย่างเช่นสำหรับวิดีโอ 147 วินาที:
mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
ด้วยffmpeg
คุณสามารถทำสิ่งต่อไปนี้:
ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg
คำสั่งนี้สร้างภาพขนาดย่อ JPG ขนาด 320 × 240 ในวินาทีที่ 4 ของวิดีโอ ใส่ไว้ในสคริปต์ที่เปลี่ยนเวลาและชื่อไฟล์และคุณเสร็จแล้ว
ข้อมูลเพิ่มเติม: สร้างภาพขนาดย่อทุก ๆ X วินาทีของวิดีโอ
-ss position
แฟล็กเพื่อค้นหาไฟล์เพิ่มเติมแทนหรือไม่ -ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
-ss
ก่อนหน้า-i
เพื่อให้การค้นหาเกิดขึ้นก่อนที่วิดีโออินพุตจะถูกถอดรหัส สิ่งนี้ควรเร่งความเร็ว แหล่งที่มา
หากคุณหลังจากชนิดของแผ่นติดต่อและถ้าคุณกำลังทำงานร่วมกับระบบปฏิบัติการยูนิกซ์เหมือน OS คุณสามารถใช้สคริปต์ที่ซับซ้อนเรียกไปยังจุดที่แผ่นติดต่อวีดีโอ * NIXสั้น VCS
ในพื้นหลังก็ใช้ffmpeg
(โดยค่าเริ่มต้น) หรือmplayer
ดังนั้นจึงสามารถจัดการรูปแบบวิดีโอจำนวนมาก มันทำให้กระบวนการถ่ายภาพนิ่งจากภาพยนตร์โดยอัตโนมัติและจัดทำภาพเหล่านี้เป็นภาพที่มีส่วนหัวและส่วนท้าย คุณสามารถเลือกเช่นจำนวนการบันทึกที่คุณต้องการหรือความแตกต่างของเวลาระหว่างพวกเขา
สำหรับช่วงเวลา 10 นาทีการร้องขอจะเป็นเช่นนั้น:
vcs -i 10m input.avi
ตรวจสอบรายการตัวเลือก commandline ทั้งหมดสำหรับการปรับแต่งอื่น ๆ
นี่คือตัวอย่างแผ่นข้อมูลติดต่อที่นำมาจากหน้าแรก :
ด้วย VLC 1.1.0 ขึ้นไปคุณสามารถใช้ฟิลเตอร์วิดีโอฉาก:
vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit
ด้านบนบันทึก 1 จากทุก ๆ 24 เฟรม (--scene-ratio = 24) เริ่มต้นที่ 00:00:10 และสิ้นสุดที่ 00:00:11
เพิ่งทดสอบและยืนยันว่าใช้งานได้กับ VLC 2.0.3 ในการติดตั้ง Windows 8 ใหม่ (ฉันไม่มีปลั๊กอินวิดีโอหรือซอฟต์แวร์เพิ่มเติม)
เอกสารฉบับเต็ม: http://wiki.videolan.org/How_to_create_thumbnails
VirtualDubสามารถทำสิ่งนี้เพื่อคุณ
File
-> Export
->Image sequence
คุณสามารถลองสิ่งนี้ได้
จากบรรทัดคำสั่ง VLC ...
vlc "C: \ YOUR \ file \ path \ file.avi" -V image --image-out-prefix = capname --image-out-ratio = 60
file.avi เป็นวิดีโอที่คุณต้องการจับภาพ capname เป็นคำนำหน้าของรูปภาพที่บันทึกคุณอาจต้องการเล่นด้วยอัตราส่วน (60 หมายความว่าจับภาพ 1 จาก 60 ภาพ) คุณสามารถเพิ่มคำสั่งเพิ่มเติมได้เช่น - jpeg รูปแบบภาพออกจะบันทึกตัวพิมพ์ใหญ่ของคุณเป็น jpegs แทนที่จะเป็น pngs --snapshot-path ช่วยให้คุณเลือกตำแหน่งที่จะบันทึกตัวพิมพ์ใหญ่ของคุณ
คุณสามารถข้ามเฟรมได้ใน VirtualDub เพียงใช้ตัวเลือก "Decimate By" ซึ่งอยู่ที่เมนู -> เมนู Frame Rate ตัวอย่างเช่นหากคุณตั้งค่า "Decimate By 100" จากนั้นใช้ไฟล์ -> ส่งออก -> ลำดับภาพมันจะบันทึกเฉพาะทุกๆเฟรมที่ 100