Twitch มีโพสต์เกี่ยวกับเรื่องนี้ พวกเขาอธิบายว่าพวกเขาตัดสินใจใช้โปรแกรมของตนเองด้วยเหตุผลหลายประการ หนึ่งในนั้นคือ ffmpeg ไม่อนุญาตให้คุณเรียกใช้อินสแตนซ์ x264 ที่แตกต่างกันในเธรดที่แตกต่างกัน แต่แทนที่จะอุทิศเธรดที่ระบุทั้งหมดให้เป็นหนึ่งเฟรมในหนึ่งเอาต์พุตก่อนที่จะย้ายไปยังเอาต์พุตถัดไป
หากคุณไม่ได้ทำการสตรีมแบบเรียลไทม์คุณจะมีความหรูหรามากกว่า วิธีการ 'ถูกต้อง' นั้นอาจจะเข้ารหัสที่ความละเอียดเดียวโดยมีขนาด GOP ที่ระบุด้วย -g แล้วเข้ารหัสความละเอียดอื่น ๆ เพื่อบังคับให้ใช้คีย์เฟรมในที่เดียวกัน
หากคุณต้องการทำเช่นนั้นคุณอาจใช้ ffprobe เพื่อรับเวลาเฟรมเวิร์กจากนั้นใช้เชลล์สคริปต์หรือภาษาการเขียนโปรแกรมจริงเพื่อแปลงให้เป็นคำสั่ง ffmpeg
แต่สำหรับเนื้อหาส่วนใหญ่มีความแตกต่างกันเล็กน้อยระหว่างการมีหนึ่งเฟรมหลักทุก 5 วินาทีและสองเฟรมหลักทุก 5 วินาที (หนึ่งถูกบังคับและอีกหนึ่งจาก Scenecut) นี่คือขนาดเฉลี่ยของเฟรม I เทียบกับขนาดของเฟรม P และเฟรม B ถ้าคุณใช้ x264 ด้วยการตั้งค่าทั่วไป (เหตุผลเดียวที่ฉันคิดว่าคุณควรทำทุกอย่างเพื่อส่งผลกระทบต่อสิ่งเหล่านี้คือถ้าคุณตั้งค่า -qmin เป็นวิธีที่ไม่ดีในการป้องกัน x264 จากการใช้บิตเรตกับเนื้อหาง่าย ๆ ฉันคิดว่า) และรับผลลัพธ์เช่นขนาดเฟรมเฉลี่ย 46 kB, P-frame 24 kB, B-frame 17 kB (ครึ่งบ่อยเท่า P-frames) จากนั้นเพิ่ม I-frame ทุกวินาทีที่ 30 เฟรมต่อวินาที เพิ่มขึ้นเพียง 3% ในขนาดไฟล์ ความแตกต่างระหว่าง h264 และ h263 อาจประกอบด้วยการลดลง 3% แต่สิ่งเดียวไม่สำคัญมาก
สำหรับเนื้อหาประเภทอื่นขนาดเฟรมจะแตกต่างกัน เพื่อความเป็นธรรมนี่เป็นเรื่องเกี่ยวกับความซับซ้อนทางโลกและไม่ใช่ความซับซ้อนเชิงพื้นที่ดังนั้นจึงไม่ใช่แค่เนื้อหาที่ง่ายเทียบกับเนื้อหาที่ยาก แต่โดยทั่วไปเว็บไซต์สตรีมวิดีโอจะมีขีด จำกัด บิตเรตและเนื้อหาที่มี I-frames ค่อนข้างใหญ่จะเป็นเนื้อหาที่ง่ายซึ่งจะถูกเข้ารหัสด้วยคุณภาพสูงไม่ว่าจะมีคีย์เฟรมเพิ่มจำนวนเท่าใด มันสิ้นเปลือง แต่ขยะนี้มักจะไม่ถูกสังเกต กรณีที่สิ้นเปลืองมากที่สุดน่าจะเป็นวิดีโอที่เป็นเพียงภาพนิ่งที่มาพร้อมกับเพลงโดยที่แต่ละคีย์เฟรมเหมือนกันทุกประการ
สิ่งหนึ่งที่ฉันไม่แน่ใจว่าเป็นอย่างไรคีย์บังคับเฟรมโต้ตอบกับตัว จำกัด อัตราที่กำหนดด้วย -maxrate และ -bufsize ฉันคิดว่าแม้ YouTube จะมีปัญหาเมื่อเร็ว ๆ นี้การกำหนดการตั้งค่าบัฟเฟอร์อย่างถูกต้องเพื่อให้มีคุณภาพที่สม่ำเสมอ หากคุณเพียงแค่ใช้การตั้งค่าบิตเรตเฉลี่ยที่สามารถเห็นได้ในบางเว็บไซต์ (เนื่องจากคุณสามารถตรวจสอบตัวเลือกของ x264 ในส่วนหัว / mov atom? ด้วยโปรแกรมแก้ไข hex) ดังนั้นรูปแบบบัฟเฟอร์ไม่เป็นปัญหา แต่ถ้าคุณ การให้บริการเนื้อหาที่ผู้ใช้สร้างขึ้นบิตเรตโดยเฉลี่ยสนับสนุนให้ผู้ใช้เพิ่มหน้าจอสีดำในตอนท้ายของวิดีโอ
ตัวเลือก -g ของ Ffmpeg หรือตัวเลือกตัวเข้ารหัสอื่น ๆ ที่คุณใช้นั้นจะถูกจับคู่กับตัวเลือกเฉพาะตัวเข้ารหัส ดังนั้น '-x264-params keyint = GOPSIZE' จึงเท่ากับ '-g GOPSIZE'
ปัญหาหนึ่งในการใช้การตรวจจับฉากคือถ้าคุณต้องการคีย์เฟรมใกล้ตัวเลขที่ระบุด้วยเหตุผลใดก็ตาม หากคุณระบุคีย์เฟรมในทุกๆ 5 วินาทีและใช้การตรวจจับฉากและมีการเปลี่ยนแปลงฉากที่ 4.5 ควรตรวจพบ แต่เฟรมหลักถัดไปจะเป็น 9.5 หากเวลาเพิ่มขึ้นเรื่อย ๆ เช่นนี้คุณสามารถจบลงด้วยคีย์เฟรมที่ 42.5, 47.5, 52.5 ฯลฯ แทน 40, 45, 50, 55 ตรงกันข้ามถ้ามีฉากเปลี่ยนที่ 5.5 ก็จะมี คีย์เฟรมที่ 5 และ 5.5 จะเร็วเกินไปสำหรับอีกเฟรมหนึ่ง Ffmpeg ไม่อนุญาตให้คุณระบุ "สร้างเฟรมหลักที่นี่หากไม่มีการเปลี่ยนแปลงฉากภายใน 30 เฟรมถัดไป" คนที่เข้าใจ C สามารถเพิ่มตัวเลือกนั้นได้
สำหรับวิดีโอที่มีอัตราเฟรมผันแปรเมื่อคุณไม่ได้สตรีมแบบสดเช่น Twitch คุณควรใช้การเปลี่ยนแปลงฉากโดยไม่ต้องแปลงเป็นเฟรมเรทคงที่อย่างถาวร หากคุณใช้ฟิลเตอร์ 'select' ใน ffmpeg และใช้ค่าคงที่ 'scene' ในนิพจน์จากนั้น debug output (-v debug หรือกด '+' หลายครั้งขณะเข้ารหัส) จะแสดงหมายเลขเปลี่ยนฉาก สิ่งนี้อาจแตกต่างจากและไม่มีประโยชน์เท่าจำนวนที่ใช้โดย x264 แต่ก็ยังมีประโยชน์
จากนั้นขั้นตอนอาจจะทำวิดีโอทดสอบสำหรับการเปลี่ยนแปลงเฟรมหลักเท่านั้น แต่อาจใช้สำหรับข้อมูลการควบคุมอัตราหากใช้ 2-pass (ไม่แน่ใจว่าข้อมูลที่สร้างขึ้นมีประโยชน์สำหรับความละเอียดและการตั้งค่าที่แตกต่างกันหรือไม่ข้อมูล macroblock-tree จะไม่ถูกแปลง) เป็นวิดีโอที่มีอัตราเฟรมคงที่ แต่ดูข้อผิดพลาดนี้เกี่ยวกับการพูดติดอ่างเอาต์พุต เพื่อใช้ตัวกรอง fps เพื่อวัตถุประสงค์อื่น เรียกใช้ผ่าน x264 ด้วยการตั้งค่าคีย์เฟรมและ GOP ที่คุณต้องการ
จากนั้นใช้เวลาเฟรมภาพเหล่านี้กับวิดีโออัตราเฟรมตัวแปรดั้งเดิม
หากคุณอนุญาตเนื้อหาที่ผู้ใช้สร้างขึ้นอย่างบ้าคลั่งโดยมีช่องว่าง 20 วินาทีระหว่างเฟรมดังนั้นสำหรับการเข้ารหัสอัตราเฟรมตัวแปรคุณสามารถแยกเอาท์พุทใช้ฟิลเตอร์ fps ใช้ตัวกรองที่เลือก (อาจสร้างนิพจน์ที่ยาวมาก ๆ ทุกครั้งที่คีย์เฟรม) ... หรือบางทีคุณอาจใช้วิดีโอทดสอบเป็นอินพุตและถอดรหัสเฉพาะคีย์เฟรมถ้าตัวเลือก ffmpeg นั้นทำงานหรือใช้ฟิลเตอร์ที่เลือกเพื่อเลือกคีย์เฟรม จากนั้นปรับขนาดให้เป็นขนาดที่ถูกต้อง (แม้จะมีตัวกรอง scale2ref สำหรับเรื่องนี้) และวางทับวิดีโอต้นฉบับไว้บน จากนั้นใช้ฟิลเตอร์ interleave เพื่อรวมคีย์เฟรมหลักแบบบังคับตามที่กำหนดไว้กับวิดีโอต้นฉบับ หากผลลัพธ์ในสองเฟรมที่ห่างกัน 0.001 วินาทีที่ตัวกรอง interleave ไม่ได้ป้องกันให้แก้ไขปัญหานี้ด้วยตัวคุณเองด้วยตัวกรองที่เลือกอีกตัว การจัดการกับข้อ จำกัด ของบัฟเฟอร์เฟรมสำหรับตัวกรอง interleave อาจเป็นปัญหาหลักที่นี่ สิ่งเหล่านี้สามารถใช้งานได้: ใช้ตัวกรองบางชนิดเพื่อบัฟเฟอร์กระแสหนาแน่น (ตัวกรอง Fifo?); อ้างถึงไฟล์อินพุตหลาย ๆ ครั้งดังนั้นจึงถอดรหัสได้มากกว่าหนึ่งครั้งและเฟรมไม่จำเป็นต้องเก็บไว้ ใช้ตัวกรอง 'streamselect' ซึ่งฉันไม่เคยทำในช่วงเวลาของเฟรมหลัก ปรับปรุงตัวกรอง interleave โดยเปลี่ยนพฤติกรรมเริ่มต้นหรือเพิ่มตัวเลือกในการส่งออกเฟรมที่เก่าแก่ที่สุดในบัฟเฟอร์แทนการวางเฟรม ซึ่งฉันไม่เคยทำในช่วงเวลาของเฟรมหลัก; ปรับปรุงตัวกรอง interleave โดยเปลี่ยนพฤติกรรมเริ่มต้นหรือเพิ่มตัวเลือกในการส่งออกเฟรมที่เก่าแก่ที่สุดในบัฟเฟอร์แทนการวางเฟรม ซึ่งฉันไม่เคยทำในช่วงเวลาของเฟรมหลัก; ปรับปรุงตัวกรอง interleave โดยเปลี่ยนพฤติกรรมเริ่มต้นหรือเพิ่มตัวเลือกในการส่งออกเฟรมที่เก่าแก่ที่สุดในบัฟเฟอร์แทนการวางเฟรม