FFMPEG / libx264: วิธีการระบุอัตราเฟรมตัวแปร แต่มีค่าสูงสุด?


16

แทนที่จะให้อัตราเฟรมคงที่ให้กับ FFMPEG / libx264 (-r / -framerate) ฉันต้องการระบุอัตราเฟรมตัวแปรด้วยค่าสูงสุดและอนุญาตให้ libx264 ลดอัตราเฟรมตามที่เห็นสมควร ความคิดที่นี่คือการได้รับการบีบอัดพิเศษเมื่อมีบางสิ่งบางอย่างเช่นภาพนิ่งขยาย (ซึ่งเกิดขึ้นมากในวิดีโอต้นฉบับของฉัน)

ฉันรู้ว่าเฟรม MPEG ที่คาดการณ์หรือแบบสองทิศทางจะบีบอัดได้ดีจริงๆ แต่ก็เป็นไปได้ว่าอัตราเฟรมต้นทางนั้นเล็กกว่าที่ฉันต้องการแปลงให้เป็น (อาจส่งผลให้สตรีมใหญ่กว่า!)


1
คุณบอกให้ x264 ใช้ VFR ที่ไหน (หรืออย่างไร)
slhck

นั่นคือคำถามของฉัน
Mark Gerolimatos

2
คำถามของคุณเป็นวิธีการระบุ VFR กับสูงสุด ฉันไม่ได้ตระหนักถึงวิธีการระบุการเข้ารหัส VFR เลยโดยใช้ x264 (ฉันยังไม่ได้พูดคุยเกี่ยวกับ ffmpeg ที่จุดนี้เพราะมันเป็นชั้นระหว่างแหล่งที่มาและ x264 อื่น.)
slhck

@MarkGerolimatos คุณพบคำตอบของคุณหรือไม่!
Dr.jacky

ไม่ฉันไม่เคยทำ
Mark Gerolimatos

คำตอบ:


19

ผิดหวังที่คุณไม่ได้พบคำตอบอย่างใดอย่างหนึ่งฉันจะตอบคำถามของคนอื่นอย่างน้อยเกี่ยวกับวิธีการเปิดใช้งานเอาต์พุตVFR (ไม่ใช่ V B R) จาก FFMPEG

คำตอบนั้นเป็น-vsyncตัวเลือกที่มีชื่อแปลกๆ คุณสามารถตั้งค่าให้ตัวเลือกที่แตกต่างกันน้อย แต่คนที่คุณต้องการคือ '2' vfrหรือ จากหน้าคน:

พารามิเตอร์-vsync
วิธีการซิงค์วิดีโอ สำหรับเหตุผลความเข้ากันได้ค่าเก่าสามารถระบุเป็นตัวเลขได้ ค่าที่เพิ่มใหม่จะต้องมีการระบุเป็นสตริงเสมอ

  • 0, ส่งผ่าน

    • แต่ละเฟรมจะถูกส่งผ่านด้วยการประทับเวลาของมันจาก demuxer ไปยัง muxer
  • 1, cfr

    • เฟรมจะถูกทำซ้ำและลดลงเพื่อให้ได้อัตราเฟรมคงที่ตามที่ร้องขอ
  • 2, vfr

    • เฟรมถูกส่งผ่านด้วยการประทับเวลาของพวกเขาหรือลดลงเพื่อป้องกัน 2 เฟรมจากการมีการประทับเวลาเดียวกัน
  • หล่น

    • ในฐานะ passthrough แต่ทำลายการประทับเวลาทั้งหมดทำให้ muxer สร้างการประทับเวลาใหม่ตามอัตราเฟรม
  • -1, อัตโนมัติ

    • เลือกระหว่าง 1 และ 2 ขึ้นอยู่กับความสามารถของ muxer นี่คือวิธีการเริ่มต้น

โปรดทราบว่า muxer อาจแก้ไขเวลาเพิ่มเติมได้หลังจากนี้ ตัวอย่างเช่นในกรณีที่เปิดใช้งานรูปแบบตัวเลือกAvoid_negative_ts

ด้วย -map คุณสามารถเลือกสตรีมที่ควรบันทึกเวลาสตรีม คุณสามารถปล่อยให้วิดีโอหรือเสียงไม่เปลี่ยนแปลงและซิงค์สตรีมที่เหลือไปยังสตรีมที่ไม่เปลี่ยนแปลง

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

คุณต้องรวม-vsync 2ตัวเลือกกับ-r $maxfpsตัวเลือกซึ่งแน่นอนว่าคุณจะแทนที่$maxfpsด้วยอัตราเฟรมสูงสุดที่คุณต้องการ! และมันก็ใช้ได้! มันไม่ได้ทำซ้ำเฟรมจากไฟล์ต้นฉบับ แต่มันจะดร็อปเฟรมที่ทำให้ไฟล์ไปเกินเฟรมสูงสุด!

โดยค่าเริ่มต้นดูเหมือนว่า-r $maxfpsด้วยตัวเองเพียงแค่ทำให้มันซ้ำ / วางเฟรมเพื่อให้ได้อัตราเฟรมคงที่และ-vsync 2ด้วยตัวเองทำให้มันดึงเฟรมในโดยตรงโดยไม่ส่งผลกระทบต่อค่า PTS

ฉันไม่ได้มองโลกในแง่ดีเกี่ยวกับเรื่องนี้เพราะฉันรู้แล้วว่า-r $maxfpsมันทำให้อยู่ในกรอบคงที่ ฉันคาดหวังว่าจะเกิดข้อผิดพลาดหรือเพื่อเชื่อฟังอย่างใดก็ตามที่มาก่อนหรือสุดท้ายหรืออะไรก็ตาม ความจริงที่ว่ามันเป็นสิ่งที่ฉันต้องการอย่างแน่นอนทำให้ฉันยินดีเป็นอย่างยิ่งกับนักพัฒนา FFMPEG

ฉันหวังว่าสิ่งนี้จะช่วยคุณหรือคนอื่นในภายหลังหากคุณไม่จำเป็นต้องรู้สิ่งนี้อีก


3
-copytsอาจเป็นประโยชน์เช่นกัน
rogerdpack

1

ฉันต้องการระบุอัตราเฟรมตัวแปรด้วยค่าสูงสุดและอนุญาตให้ libx264 ลดอัตราเฟรมตามที่เห็นสมควร ความคิดที่นี่คือการได้รับการบีบอัดพิเศษเมื่อมีบางสิ่งบางอย่างเช่นยังคงขยายเฟรม

ในความเข้าใจของฉันนี่อาจเป็นไปได้ในทางที่ค่อนข้างงุ่มง่าม แต่ไม่เป็นที่พึงปรารถนาด้วยเหตุผลที่ซับซ้อนและมีความซับซ้อน

แม้ว่าสตรีม x264 จะมีอัตราเฟรมอัตราเฟรมเป็นปัญหาระดับคอนเทนเนอร์มากกว่าตัวแปลงสัญญาณหนึ่ง

ในการเข้ารหัส passthrough VFR จะมีสิ่งที่สำคัญคือไฟล์ข้อความที่มีรายละเอียดว่าอัตราเฟรมอยู่ที่ใดเฟรม / ครั้งและในการเข้ารหัสแหล่งที่มาฟังก์ชันเช่น tcfile-in หรือ tcfile-out ส่งผ่านการประทับเวลาไปยังการเข้ารหัส เพื่อแมปตำแหน่งอัตราและทำให้วิดีโอมีความสอดคล้องกันจากแหล่งที่มา

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

แหล่งที่มาเป็นปัญหาเช่นกัน: แหล่งที่มาของ VFR โดยปกติแล้วจะรักษาความผันแปรของเฟรมไว้ แต่เห็นได้ชัดว่าเข้ารหัสไฟล์ CFR ที่บิตเรตตัวแปร (เป็นความคิดที่ดีบางครั้งโดยเฉพาะเมื่อต้องการเทเลคอม)

ซึ่งหมายความว่าคุณอาจจะต้องเขียนใหม่บิตเรตด้วยมือ (เช่น timestamps ฉากช้า muxed ลงในไฟล์) หรือรีสอร์ทไปสังหารกรอบ algorith เช่น dup, dedup และ exactDedup สำหรับ AviSynth หากวิดีโอของคุณมีการเคลื่อนไหวที่ต่ำมากเฟรมบางส่วน (ถึงครึ่งหนึ่ง) จะถูกส่งออกไป ปัญหาคืออัลกอรึทึมเหล่านี้ไม่ได้ก้าวหน้าและไม่ได้เลือกทางเลือกที่ดีกับวิดีโอ "ชีวิตจริง" ว่าอะไรจะช่วยให้มีการเข้ารหัสที่ดีที่สุด

นอกจากนี้การลบเฟรมที่มีสิ่งต่าง ๆ เช่นเฟรม I และ B จะลดจำนวนรายละเอียดที่มีอยู่เมื่อเวลาผ่านไปซึ่งทำให้การเคลื่อนไหวดู "Steppy" และสามารถรบกวนพารามิเตอร์วิดีโอพื้นฐานอื่น ๆ และทำให้สิ่งประดิษฐ์เช่นนามแฝง

และเนื่องจากวิธีการทำงานของตัววัดปริมาณ x264 จะลดบิตเรตอย่างไม่เป็นสัดส่วนในฉากเหล่านี้ที่มีการเคลื่อนไหวต่ำ หากคุณมีสไลด์โชว์ของภาพที่เหมือนกันจะมีการเคลื่อนไหว (หากมีเพียงธัญพืชและสิ่งประดิษฐ์อื่น ๆ ) และจะมีการสูญเสียคุณภาพซึ่งจะไม่สามารถมองเห็นได้โดยไม่ต้องเปลี่ยนบิตเรตอย่างรุนแรง

และสุดท้ายเหตุผลที่ไม่มีตัวเลือกมากมายในการทำสิ่งที่คุณต้องการก็คือ x264 นั้นดีในการจัดการบิตเรตเพียงแค่ใช้การบีบอัดชั่วคราว (บันทึกการเปลี่ยนแปลงในเฟรมบางส่วน) การไปที่อัตราเฟรม 1/2 จะไม่ลดขนาดไฟล์ลงครึ่งหนึ่ง 10% น่าจะเป็นกำไรที่คาดหวังจากการเคลื่อนไหวต่ำหรือภาพเคลื่อนไหว

ดังนั้นโดยย่อการวางบิตเรตของฉากแบบคงที่ของคุณจะทำเพียงเล็กน้อยสำหรับขนาดไฟล์ของคุณ แต่จะเพิ่มโฮสต์คุณภาพและปัญหาการซิงค์ไม่พูดถึงความเข้ากันไม่ได้กับซอฟต์แวร์ตัดต่อวิดีโอ

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

สิ่งที่ควรหลีกเลี่ยงคือการใช้เวลาในการปรับการตั้งค่าบิตเรตเป็นจำนวนมากจะช่วยเพิ่มประสิทธิภาพในการจัดการขนาดไฟล์และปรับปรุงคุณภาพวิดีโอของคุณแทนที่จะก่อให้เกิดความยุ่งยากเล็กน้อย การรักษา FPS ดั้งเดิมน่าจะเป็นความคิดที่ดีที่สุดนอกเสียจากคุณจะตั้งเป้าหมายในการออกอากาศหรือมาตรฐานสื่อ ผู้เล่นมีความสามารถในการเล่นบิตเรตตัวแปร (ต่างจากตัวแก้ไข) และยิ่งเฟรมในวิดีโอของคุณเล่นได้ราบรื่นและอาจมีขนาดไฟล์เล็กลงเนื่องจากการเปลี่ยนแปลงการเคลื่อนไหวระหว่างเฟรมขนาดเล็ก

ต่อไปนี้เป็นคอลเล็กชันลิงก์ไปยังข้อมูลมาตรฐานและการอภิปรายในฟอรัมที่จะช่วยในเรื่องการเข้ารหัสที่สับสน:

- เครื่องมือการทำลาย avisynth

- สวิตช์ fps และ -r
- x264 ทั่วไป (tcfile, fps)
- มาตรฐานไฟล์ timecode
- ระดับและโปรไฟล์
- สั้น, CFR / VFR สรุปการตั้งค่าที่ชัดเจน (ส่วน "framerate")

doom9, videohelp, & c การอภิปรายเชิงทฤษฎี
1 2 3 4 5 6 7

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.