หากต้องการทำงานอย่างถูกต้องอันดับแรกให้แปลงวิดีโอเป็นบิตสตรีม RAW YUV (หากยังไม่พร้อม) โดย:
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
ขั้นตอนถัดไป: select
ตัวกรองใช้นิพจน์ซึ่งn
เป็นหมายเลขเฟรม
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv
ในการffmpeg
ไม่มีเฟรมที่ซ้ำกันคุณต้องบังคับครึ่งหนึ่งของอัตราเฟรมของอินพุตของคุณดังนั้นคุณจึงตั้งค่า "2" เป็นอินพุตและ "1" เป็นเอาต์พุต อย่าลืมแทนที่ WxH ด้วยขนาดจริงของคลิปของคุณเนื่องจากบิตสตรีมแบบดิบไม่มีส่วนหัวที่นำข้อมูลนี้ไปใช้
แทนที่จะเป็นข้างต้นความเป็นไปได้อีกอย่างก็คือการเพิ่มsetpts
ตัวกรองเพื่อตั้งค่าการประทับเวลาใหม่สำหรับเอาต์พุต แต่ระวังเพราะมันลดลงเฟรมไม่ถูกต้อง ที่นี่ 25 คืออัตราเฟรมเอาต์พุตจริงที่คุณต้องการ:
ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv
แน่นอนว่าคุณสามารถเลือกรูปแบบพิกเซลอื่น (อย่างใดอย่างหนึ่งffmpeg -pix_fmts
) ตรวจสอบให้แน่ใจว่าเมื่ออ่านไฟล์คุณรู้ขนาดพิกเซลและรูปแบบพิกเซล:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …