ffmpeg: วิธีเลือกรูปแบบเฉพาะของเฟรมจากสตรีมได้อย่างไร


1

ใครสามารถช่วยฉันแปลงวิดีโอสตรีม 30 fps เป็น 24 fps ได้หรือไม่?

วัสดุดั้งเดิมเป็นภาพยนตร์ ดูเหมือนว่าจะถูกถ่ายใน 24 fps เนื่องจากสตรีมดูเหมือนจะประกอบด้วยชุดของ 4 เฟรมตามด้วยซ้ำหนึ่งเฟรม 4 เฟรม, 1 ล่อ, 4 เฟรม, 1 ล่อ, 4 เฟรม, 1 ล่อ, ฯลฯ ทำ 24 เฟรมต่อวินาทีและ 6 ซ้ำต่อวินาที

เมื่อฉันขอให้ ffmpeg แปลงวัสดุนี้เป็น 24 fps สิ่งแปลก ๆ เกิดขึ้น

เมื่อฉันแปลงคลิปวิดีโอ 20 วินาที 3 นาทีเป็นภาพยนตร์เป็น MPEG1 ที่วิดีโอที่ 24 fps (โดยใช้ flag -r 24) ฉันจะได้ภาพยนตร์ที่ราบรื่นยกเว้นหนึ่งในเฟรมแรกที่ซ้ำกัน อย่างไรก็ตามเมื่อฉันพยายามคัดลอกคลิปเดียวกันเป็นครั้งแรกในไฟล์แยกต่างหากจากนั้นลองแปลงมันเป็น mpeg2video ฉันได้รับการเคลื่อนไหวแบบ staccato ในไม่กี่เฟรมจากนั้นจึงเป็น dupe จากนั้นจึงมีเฟรมเพิ่มเติม dupe ฯลฯ เป็นต้น . ด้วยการสุ่มตัวเลขของเฟรมระหว่างคู่ ดังนั้น - คลิปเดียวกัน แต่ราบรื่นในกรณีแรกและ staccato ในวินาที!

อย่างไรก็ตามเมื่อฉันใช้ ffmpeg เพื่อแปลงไฟล์เดียวกันเป็น x264 ฉันได้รับการเคลื่อนไหวแบบ Staccato แบบเดียวกันประมาณ 30 เฟรมจากนั้นการเคลื่อนไหวจะราบรื่นโดยสิ้นเชิง!

เกิดอะไรขึ้นที่นี่?

มีวิธีบอก ffmpeg ให้ใช้เฉพาะ 4 เฟรมจากนั้นจึงข้ามหนึ่งและวนลูปทั้งหมดนี้ผ่านภาพยนตร์หรือไม่?

ขอบคุณ.

คำตอบ:


0

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

สำหรับอดีต

ffmpeg -i in.mp4 -vf select='mod(n+1,5)',setpts=N/24/TB out.mp4

สำหรับหลัง, mpdecimate ตัวกรองอาจมีประโยชน์

ffmpeg -i in.mp4 -vf mpdecimate,setpts=N/24/TB out.mp4

ที่น่าตื่นตาตื่นใจ! ขอบคุณ. ฉันจะไปทำงานทดลองกับมันและรายงาน ฉันจะถามว่ามีวิธีการลดลงทุกเฟรมที่ 5 หรืออีกวิธีหนึ่งคือขอให้ ffmpeg เลือกเฟรมตามตัวเลขในไฟล์ข้อความ แต่ mpdecimate นี้ฟังดูดีมากถ้าฉันสามารถทำงานได้ ฉันจะลองพารามิเตอร์ที่แนะนำของคุณก่อน ... ขอบคุณอีกครั้ง ...
Hunnicatt

ขอบคุณ Mulvya! ฉันลองทั้งคำสั่งที่แนะนำและดูเหมือนว่าจะทำงานได้อย่างไร้ที่ติ! พวกเขาทำงานเมื่อฉันแปลงไฟล์จากจุดเริ่มต้น แต่เมื่อฉันพยายามแปลงจาก timepoint ที่เฉพาะเจาะจงล่วงหน้าในภาพยนตร์คำสั่ง select = ยังคงมี dupes ซึ่งต้องเป็นเพราะ framepoint ที่ฉันระบุไม่สามารถหารด้วย 5 ได้อย่างแน่นอน ดังนั้นเพื่อให้ทำงานได้ฉันเดาว่าฉันจะต้องบอก ffmpeg ให้ข้ามเฟรม 1-4 ก่อนที่จะใช้เมธอด select = 'mod (n + 1,5)' แต่ไม่ว่าสิ่งที่ฉันต้องการจะทำในตอนแรกได้ผล! และวิธีการของ mpdecimate นั้นทำงานได้ทั้งสองกรณี ขอบคุณมาก! เป็นอย่างมาก.
Hunnicatt

อืมฉันพยายามทำสิ่งที่คุณแนะนำและดูเหมือนว่าจะใช้งานได้และวิดีโอราบรื่นอย่างสมบูรณ์แบบโดยไม่มีเฟรมซ้ำกันดูเหมือนว่า แต่ตอนนี้เมื่อฉันดูภาพยนตร์ทั้งเรื่อง เสียงหลังจากไม่กี่นาที ฉันไม่เข้าใจ
Hunnicatt

เมื่อฉันใช้ตัวกรอง select = ไม่ว่าฉันจะใช้ -r 24 หรือ -r 25 (ซึ่งเป็นเป้าหมายสุดท้ายของฉัน fps) มันจะไม่ซิงค์ แต่เมื่อฉันไม่ใช้แฟล็ก -r และปล่อยให้มันอยู่ ที่ 30 fps มันก็จะหายไปแม้ว่าการส่งออกจะดูเหมือนกับอินพุตด้วย 4 เฟรม 1 ซ้ำ ฯลฯ ฯลฯ ! อย่างไรก็ตามเมื่อฉันไม่ได้ใช้ตัวกรอง select = และใช้แฟล็ก -r 24 เท่านั้นการซิงโครไนซ์จะยังคงอยู่ คุณมีความคิดเกี่ยวกับสิ่งที่อาจเป็นปัญหาหรือไม่
Hunnicatt

สำหรับเอาต์พุต 25 fps ให้ไปกับ ffmpeg -i in.mp4 -vf mpdecimate -r 25 out.mp4. หนึ่งเฟรมควรทำซ้ำในแต่ละวินาที - ไม่สามารถช่วยได้
Gyan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.