ฉันจะแยกการประทับเวลาที่เกี่ยวข้องกับเฟรม ffmpeg แยกจากวิดีโอด้วยตัวเลือก -r ได้อย่างไร?


12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

เป็นคำสั่งที่ฉันใช้เพื่อแยกเฟรมและทำงานได้ตามที่คาดไว้ อย่างไรก็ตามฉันยังต้องการดูการประทับเวลาของเฟรมด้วย ที่ใดก็ตามที่มีความแม่นยำ 100 miliseconds นั้นดีพอสำหรับฉัน ffmpeg ทำสิ่งนี้ได้หรือไม่?

ให้รายละเอียดเพิ่มเติม

เมื่อฉันเรียกใช้คำสั่งข้างต้นฉันได้รับประมาณ 100 JPEGs ฉันเดาว่ามีความสอดคล้อง 1 ถึง 1 (หรือหลายต่อ 1) ระหว่าง JPEGS และเฟรมของวิดีโอเหล่านี้ ฉันต้องการทราบเวลาประทับของเฟรมที่ส่งออกเป็นรูปภาพ JPEG 'i'

นอกจากนี้ฉันลอง ffprobe แต่ฉันพบว่ามันรายงานแม้ระยะเวลาวิดีโอไม่ถูกต้อง :(


เป็นอะไร AFAIK jpeg ไม่มีข้อมูลเมตาดังกล่าว เวลาประทับ EXIF ​​นั้นเป็นcaptureเวลา
Rajib

แน่นอนว่า JPEG ไม่มีข้อมูลเมตา แต่ mp4 อาจเป็นเช่นนั้น ฉันสามารถสั่ง ffmpeg เพื่อดึงมันพร้อมกับเฟรมที่เข้ารหัสในภายหลังเป็น JPEGS และทิ้งการประทับเวลาในไฟล์ได้หรือไม่?
Srini

โปรดรวมffmpegเอาท์พุทคอนโซลที่สมบูรณ์จากคำสั่งของคุณ
llogan

ffprobe สามารถให้ข้อมูลเวลาประทับจากสตรีมวิดีโอ mp4 คุณกำลังถามว่าเฟรมอาจมีการทำซ้ำหรือลดลงแล้วการติดต่อกับ timestamps mp4 ดั้งเดิมคืออะไร? ในกรณีนี้ฉันจะสำรวจการเพิ่มการตั้งค่าคำฟุ่มเฟื่อยเพื่อดูว่าคุณสามารถรับเฟรมทีละเฟรมในระหว่างการดำเนินการ คุณช่วยขยายความหมายของ "timestamps ที่เกี่ยวข้องกับเฟรม" ได้ไหม
dstob

@dstob การประทับเวลาที่เกี่ยวข้องกับเฟรมคือการประทับเวลาการนำเสนอของอินพุตวิดีโอเช่นเมื่อแต่ละเฟรมควรแสดงให้สัมพันธ์กับจุดเริ่มต้นของวิดีโอ
slhck

คำตอบ:


13

สิ่งที่คุณสามารถทำได้คือ "จำลอง" กระบวนการเขียนภาพโดยการกรองด้วยfpsตัวกรองจากนั้นใช้ffprobeเพื่อแสดงการประทับเวลาของเฟรมที่สร้างขึ้น ซึ่งหมายความว่าที่ 25 เฟรมต่อวินาทีเฟรมที่ 50 (เช่นภาพที่ 50 ของคุณ) จะมี PTS 2.00 วินาที

คุณทำเช่นนี้:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

จะส่งออก:

0
0.04
0.08
0.12
0.16
...

นี่เป็นเวลาประทับสำหรับแต่ละภาพที่ส่งออก คุณสามารถรวมรายการของเฟรมและการประทับเวลา:

ls -1 image - *. jpeg> images.txt
ffprobe -f lavfi -i "ภาพยนตร์ = input.mp4, fps = fps = 25 [out0]" -show_frames -show_entries frame = pkt_pts_time -of csv = p = 0> frames.txt
วาง images.txt frames.txt> combination.txt

จะสร้างไฟล์ด้วย:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

โปรดทราบว่าสิ่งนี้อาจส่งผลให้เกิดบรรทัดที่ไม่เกี่ยวข้องหากมีเฟรมมากเกินไปหรือมีเอาต์พุตข้อมูลจำนวนมากเกินไป ดูเหมือนว่าจะมีความผิดพลาดเล็กน้อย


นี่เป็นเวลาประทับที่สัมพันธ์กับค่าคงที่ framerate ที่วางบนเอาต์พุตหรือการโต้ตอบของ jpegs เอาต์พุตไปยัง mp4 timestamps ดั้งเดิมที่อาจเป็น framerate และมีค่า timestamp ใด ๆ ?
dstob

เวลาประทับนี้จะขึ้นอยู่กับอัตราเฟรมเอาต์พุตที่ร้องขอ มันเกี่ยวข้องกับทั้งรูปภาพที่ส่งออกรวมถึงเฟรมวิดีโออินพุตดั้งเดิมรูปภาพเหล่านั้นมาจาก - มีฐานครั้งเดียวเท่านั้น สิ่งนี้ได้ผลเพราะเมื่อเปลี่ยน framerate แล้ว ffmpeg จะไม่เล่นวิดีโอเร็วขึ้น แต่ "ยืด" เวลานำเสนอของแต่ละเฟรมแล้วปล่อยเฟรมที่ไม่จำเป็นออกไป
slhck

เหตุใดจึงต้องมีเพียงครั้งเดียวฐานเมื่อคุณสร้างฐานเวลาออกด้วยตนเอง สิ่งนี้ไม่ได้เป็นอย่างนั้นเสมอไป แต่ในวิดีโอ 60 เฟรมต่อวินาทีแรกที่ฉันขว้างมัน ffmpeg เพิ่งสร้างฐานเวลาของตัวเองโดยไม่สนใจการประทับเวลาของอินพุต
dstob

ไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณได้รับ ffmpeg เลือกเป็น timebase ป้อนข้อมูลสิ่งที่มันจะแยกวิเคราะห์เป็น timebase แน่นอนคุณสามารถบอก ffmpeg ให้ทิ้ง timestamps ของอินพุตด้วย-vsync dropแต่นั่นเกิดขึ้นหลังจากการกรอง IIRC
slhck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.