- Meta รัน FFmpeg หลายหมื่นล้านครั้งต่อวัน และสามารถเปลี่ยนผ่านจากเวอร์ชันฟอร์กภายในองค์กรไปสู่ upstream FFmpeg ได้ทั้งหมดสำเร็จ
- เพื่อปิดช่องว่างของความสามารถระหว่างฟอร์กภายในกับเวอร์ชันโอเพนซอร์ส Meta ได้ร่วมมือกับ FFlabs และ VideoLAN เพื่อนำความสามารถ การเข้ารหัสแบบขนานหลายเลน และเมตริกวัดคุณภาพแบบเรียลไทม์ขึ้นไปพัฒนาใน upstream
- รองรับ การอัปโหลดวิดีโอกว่า 1 พันล้านรายการต่อวัน และทำการเข้ารหัสหลายความละเอียดและหลายโคเดกสำหรับการเล่นแบบ DASH ด้วยคำสั่ง FFmpeg บรรทัดเดียว
- โครงสร้างการทำเธรดที่มีประสิทธิภาพ ซึ่งถูกพัฒนาใน FFmpeg เวอร์ชัน 6.0~8.0 อิงจากแนวทางการออกแบบของ Meta และช่วยเพิ่มประสิทธิภาพการเข้ารหัสให้กับผู้ใช้ทุกคน
- ผสานรวม MSVP (Meta Scalable Video Processor) ซึ่งเป็น ASIC ที่ Meta ออกแบบเอง ผ่าน standard hardware API ของ FFmpeg เพื่อให้ซอฟต์แวร์และฮาร์ดแวร์ไปป์ไลน์มีความสอดคล้องกัน
- เสริมทั้งประสบการณ์วิดีโอรูปแบบใหม่และความเสถียรของแพลตฟอร์ม Meta ไปพร้อมกัน ผ่าน การลงทุนอย่างต่อเนื่อง กับ FFmpeg ที่พัฒนามานานกว่า 25 ปี
บทบาทของ FFmpeg และความท้าทายของ Meta
- FFmpeg เป็น เครื่องมือประมวลผลสื่อมาตรฐานของอุตสาหกรรม ที่รองรับโคเดกเสียงและวิดีโอ รวมถึงคอนเทนเนอร์ฟอร์แมตที่หลากหลาย และสามารถแก้ไขหรือแปลงสื่อผ่านฟิลเตอร์เชนที่ซับซ้อนได้
- Meta รันไบนารี ffmpeg (CLI หลัก) และ ffprobe (ยูทิลิตีสำหรับตรวจสอบคุณสมบัติของไฟล์สื่อ) หลายหมื่นล้านครั้งต่อวัน และยังมีความต้องการเพิ่มเติมที่เกินกว่าการประมวลผลไฟล์ทีละไฟล์
- ตลอดช่วงเวลายาวนาน Meta พึ่งพาฟอร์กภายในองค์กรและพัฒนาความสามารถที่ upstream ยังไม่มีในเวลานั้นเอง เช่น การเข้ารหัสหลายเลนบนพื้นฐานของเธรด และการคำนวณเมตริกคุณภาพแบบเรียลไทม์
การแยกทางของฟอร์กภายในและความจำเป็นในการกลับไปใช้ upstream
- เมื่อเวลาผ่านไป ฟอร์กภายในเริ่ม แยกออกจาก upstream FFmpeg อย่างมาก ทำให้ช่องว่างของชุดความสามารถขยายตัวขึ้นเรื่อย ๆ
- ขณะเดียวกัน FFmpeg เวอร์ชันใหม่ก็เพิ่มการรองรับโคเดกและฟอร์แมตไฟล์ใหม่ ๆ พร้อมทั้ง ปรับปรุงเสถียรภาพ ทำให้จำเป็นต้องรองรับเวอร์ชันโอเพนซอร์สล่าสุดควบคู่กันไป เพื่อรับมือกับคอนเทนต์วิดีโอหลากหลายที่ผู้ใช้อัปโหลดเข้ามาโดยไม่สะดุด
- เมื่อการรีเบสการเปลี่ยนแปลงภายในทำให้ ป้องกัน regression ได้ยากขึ้น Meta จึงร่วมมือกับนักพัฒนา FFmpeg, FFlabs และ VideoLAN เพื่อเปลี่ยนไปสู่แนวทางที่เลิกใช้ฟอร์กภายในทั้งหมด และใช้เฉพาะเวอร์ชัน upstream
การสร้างทรานส์โค้ดดิ้งหลายเลนอย่างมีประสิทธิภาพ (VOD และไลฟ์สตรีมมิง)
- เมื่อผู้ใช้อัปโหลดวิดีโอ ระบบจะสร้างชุดการเข้ารหัสหลายแบบสำหรับการเล่น DASH (Dynamic Adaptive Streaming over HTTP) โดยมีการเข้ารหัสที่ต่างกันทั้งด้านความละเอียด โคเดก เฟรมเรต และระดับคุณภาพ
- ตัวเล่นวิดีโอในแอปสามารถ สลับการเข้ารหัสแบบเรียลไทม์ ตามสัญญาณอย่างสภาพเครือข่ายได้
- วิธีที่ง่ายที่สุดคือประมวลผลแต่ละเลนแยกกันด้วยคำสั่ง FFmpeg คนละบรรทัดตามลำดับ แต่แม้จะรันขนานกัน แต่ละโปรเซสก็ยังทำ งานซ้ำซ้อน เช่น การถอดรหัสซ้ำ และโอเวอร์เฮดจากการเริ่มโปรเซส ทำให้ไม่มีประสิทธิภาพ
- หากใช้คำสั่ง FFmpeg บรรทัดเดียวเพื่อถอดรหัสเฟรมเพียงครั้งเดียว แล้วส่งต่อไปยังตัวเข้ารหัสของแต่ละเอาต์พุต ก็จะ ตัดการถอดรหัสซ้ำ และลดโอเวอร์เฮดจากการเริ่มโปรเซสได้
- เนื่องจากต้องรองรับการอัปโหลดวิดีโอ มากกว่า 1 พันล้านรายการต่อวัน การลดงานคำนวณต่อโปรเซสจึงแปลเป็นการเพิ่มประสิทธิภาพอย่างมีนัยสำคัญในภาพรวม
- ฟอร์กภายในของ Meta ยังเพิ่มการปรับแต่งสำหรับ การเข้ารหัสวิดีโอแบบขนาน: FFmpeg แบบเดิมเมื่อใช้หลายตัวเข้ารหัสจะทำงานแบบอนุกรมเป็นรายเฟรม แต่แนวทางนี้ทำให้ทุกอินสแตนซ์ของตัวเข้ารหัสทำงานแบบขนาน เพื่อให้ได้ระดับ parallelism ที่สูงกว่า
- จากผลงานของนักพัฒนา FFmpeg รวมถึง FFlabs และ VideoLAN ทำให้ตั้งแต่ FFmpeg 6.0 เริ่มมีการทำเธรดที่มีประสิทธิภาพมากขึ้น และ สมบูรณ์ใน 8.0
- ได้รับอิทธิพลโดยตรงจากการออกแบบในฟอร์กภายในของ Meta และถูกบันทึกว่าเป็น การรีแฟกเตอร์ FFmpeg ที่ซับซ้อนที่สุดในรอบหลายทศวรรษ
- ผู้ใช้ FFmpeg ทุกคนจึงได้รับประโยชน์จากการเข้ารหัสที่มีประสิทธิภาพมากขึ้น
เมตริกคุณภาพแบบเรียลไทม์ (ไลฟ์สตรีมมิง)
- เมตริกคุณภาพเชิงภาพใช้สำหรับ แสดงคุณภาพที่รับรู้ได้ของสื่อออกมาเป็นตัวเลข เพื่อวัดปริมาณการสูญเสียคุณภาพจากการบีบอัด
- เมตริกแบบ reference: เปรียบเทียบระหว่างต้นฉบับที่เข้ารหัสกับวิดีโอที่มีความเพี้ยน
- เมตริกแบบ no-reference: ประเมินคุณภาพโดยไม่ต้องมีต้นฉบับ
- FFmpeg สามารถคำนวณเมตริกคุณภาพ เช่น PSNR, SSIM และ VMAF โดยใช้ไฟล์เข้ารหัสที่มีอยู่สองชุดผ่านคำสั่งแยกหลังการเข้ารหัสเสร็จแล้ว แต่ใน ไลฟ์สตรีมมิงจำเป็นต้องคำนวณแบบเรียลไทม์
- ด้วยการ แทรกตัวถอดรหัสวิดีโอ ไว้หลังตัวเข้ารหัสวิดีโอของแต่ละเอาต์พุตเลน เพื่อให้ได้บิตแมปของเฟรมหลังผ่านการบีบอัด แล้วนำไปเทียบกับเฟรมก่อนการบีบอัด จึงสามารถคำนวณเมตริกคุณภาพของแต่ละเลนการเข้ารหัสแบบเรียลไทม์ได้ภายในคำสั่ง FFmpeg บรรทัดเดียว
- ตั้งแต่ FFmpeg 7.0 เป็นต้นไป ด้วยผลงานจากนักพัฒนา FFlabs และ VideoLAN ฟีเจอร์การถอดรหัสแบบ "in-loop" ถูกเปิดใช้งาน ทำให้ไม่จำเป็นต้องพึ่งพาฟอร์กภายในสำหรับความสามารถนี้อีกต่อไปโดยสิ้นเชิง
เกณฑ์ในการส่งโค้ดขึ้น upstream และแพตช์ที่ใช้ภายในเท่านั้น
- ความสามารถอย่างเมตริกคุณภาพแบบเรียลไทม์และการทำเธรดอย่างมีประสิทธิภาพ ช่วยเพิ่มประสิทธิภาพให้กับไปป์ไลน์ที่อิง FFmpeg หลากหลายแบบทั้งภายในและภายนอก Meta จึง ส่งกลับไปยัง upstream
- ในทางกลับกัน แพตช์ที่เฉพาะเจาะจงกับโครงสร้างพื้นฐานของ Meta มากเกินไปและยากต่อการทำให้เป็นทั่วไป จะยังคงเก็บไว้ใช้ภายใน
- FFmpeg รองรับ การถอดรหัส การเข้ารหัส และการกรองแบบเร่งด้วยฮาร์ดแวร์ ผ่าน standard API สำหรับ NVIDIA NVDEC/NVENC, AMD UVD, Intel QSV และอื่น ๆ
- MSVP (Meta Scalable Video Processor) ซึ่งเป็น ASIC สำหรับทรานส์โค้ดวิดีโอที่ Meta พัฒนาขึ้นเอง ก็ถูกเพิ่มการรองรับผ่าน standard API เดียวกัน ทำให้สามารถใช้เครื่องมือร่วมกันได้บนแพลตฟอร์มฮาร์ดแวร์ที่หลากหลาย
- MSVP ถูกใช้งานเฉพาะในโครงสร้างพื้นฐานภายในของ Meta ทำให้นักพัฒนา FFmpeg ภายนอกไม่สามารถเข้าถึงฮาร์ดแวร์เพื่อทดสอบและตรวจสอบได้ จึงยังคงเป็นแพตช์ภายใน
- เมื่อต้องรีเบสไปยัง FFmpeg เวอร์ชันล่าสุด Meta ใช้ การตรวจสอบอย่างครอบคลุม เพื่อรับประกันความทนทานและความถูกต้อง
การลงทุนอย่างต่อเนื่องกับ FFmpeg
- ด้วยความสามารถด้านการเข้ารหัสหลายเลนและเมตริกคุณภาพแบบเรียลไทม์ Meta จึง เลิกใช้ฟอร์กภายในอย่างสมบูรณ์ ในทุกไปป์ไลน์ของ VOD และไลฟ์สตรีมมิง
- standard hardware API ของ FFmpeg ช่วยให้สามารถรองรับทั้ง ASIC MSVP และไปป์ไลน์แบบซอฟต์แวร์ได้ โดยมีแรงเสียดทานน้อยที่สุด
- Meta มีแผน ลงทุนต่อเนื่อง กับ FFmpeg ที่ถูกพัฒนาอย่างแข็งขันมานานกว่า 25 ปี ผ่านความร่วมมือกับนักพัฒนาโอเพนซอร์ส เพื่อสร้างประโยชน์ให้กับ Meta ทั้งอุตสาหกรรม และผู้ใช้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เมื่อ internal fork เริ่ม ล้าสมัย มากขึ้นเรื่อย ๆ เราจึงร่วมมือกับนักพัฒนา FFmpeg เพื่อนำฟีเจอร์ที่ต้องการไปรวมไว้ใน FFmpeg อย่างเป็นทางการ
ผลคือสามารถเลิกใช้เวอร์ชันภายในได้ทั้งหมด และรันด้วยเวอร์ชัน upstream เพียงอย่างเดียว
บางคนอาจบอกว่า “น่าจะมีส่วนร่วมได้มากกว่านี้ไม่ใช่หรือ” แต่แก่นของโอเพนซอร์สคือ ทุกคนได้รับประโยชน์ร่วมกัน
เราได้รับประโยชน์จากโครงการมากมายอย่าง React, React Native เป็นต้นอยู่แล้ว
สุดท้ายโครงสร้างแบบนี้ก็ดูจะเอื้อฝ่ายที่มีอำนาจมากกว่าเท่านั้น
ถึงอย่างนั้น การที่ Meta เปิดเผยสิ่งต่าง ๆ สู่ระบบนิเวศโอเพนซอร์สจำนวนมาก ก็เป็นจุดที่ทำให้บริษัทแตกต่างจากรายอื่นในอุตสาหกรรม
คำพูดทำนองว่า “ตอนนี้ถึงได้รวมเข้ากับ upstream” ให้ความรู้สึกเหมือนพยายามกลบเกลื่อนสิ่งที่เคยทำได้ไม่ดีในอดีต
การเอาถ้อยคำแบบการตลาดมาปนในบล็อกเทคนิคเป็นอะไรที่ในมุมผู้อ่านแล้วน่ารำคาญ
หวังว่า Fabrice Bellard จะได้รับ ผลตอบแทนที่เหมาะสม ตอนเกษียณ
บริษัทจำนวนมหาศาลทำเงินได้จากซอฟต์แวร์ของเขา
เป็นเรื่องดีที่ FFmpeg เวอร์ชันใหม่รองรับ codec และ format ได้หลากหลายขึ้น แต่
ถ้าเป็นสเกลที่ Meta รันวันละหลายพันล้านครั้ง ก็อดสงสัยไม่ได้ว่าพวกเขา มีส่วนร่วมอย่างต่อเนื่อง กับการปรับปรุงเหล่านี้หรือไม่
การรันวันละหลายหมื่นล้านครั้งนี่เป็น สเกลมหาศาลจริง ๆ
ผมแค่รันงานประกอบวิดีโออัตโนมัติวันละไม่กี่พันครั้งก็เริ่มรู้สึกถึง overhead แล้ว
ฟีเจอร์
single-decode multi-outputช่วยลดเวลาในการประมวลผลลงได้ 40%โชคดีที่ราคาหน่วยความจำช่วงหลังลดลง ทำให้ ความคุ้มค่าต่อค่าใช้จ่าย ของการปรับปรุงโอเพนซอร์สดียิ่งขึ้น
แนวทางเพิ่ม parallelism ด้วยการรัน encoder instance แบบขนานก็ดูสมเหตุสมผล
แต่ผมอยากเห็นฟีเจอร์ time-axis parallelization
ถ้าแบ่งวิดีโอขาเข้าตาม keyframe แล้วเข้ารหัสแบบขนาน ก็น่าจะเพิ่มความเร็วได้โดยไม่ลดคุณภาพ
ปกติ encoder มักจัดวางแบบไดนามิกเพื่อประสิทธิภาพ จึงอาจแบ่งล่วงหน้าได้ยาก
ขอบคุณทีม Meta ที่มีส่วนช่วยกับ
ffmpegและffprobeต่อไปก็อยากให้พิจารณาสนับสนุนทางการเงินด้าน คุณภาพโค้ด เอกสาร และงานชุมชน ด้วย
ประโยคที่ว่า “internal fork เริ่มเก่าและล้าหลังขึ้นเรื่อย ๆ” นี่ โดนใจมาก
สำหรับข้อมูลเพิ่มเติม FFmpeg 8 ตอนนี้จัดการ color mapping ระหว่าง HDR และ SDR ได้สมบูรณ์แล้ว
ข่าวที่ Sovereign Tech Fund ของเยอรมนีบริจาคให้ FFmpeg น่าสนใจดี
Meta น่าจะมีทีมเฉพาะด้าน media encoding และอาจมีส่วนร่วมคิดเป็นมูลค่า มากกว่า 1 ล้านดอลลาร์ต่อปี
ดูทวีตที่เกี่ยวข้อง
ฝั่ง STF ของเยอรมนีบอกว่าสนับสนุน €157,580 ในปี 2024/2025
โชคดีที่เซิร์ฟเวอร์ FFmpeg เหล่านี้ประมวลผลแต่ คอนเทนต์เบา ๆ เลยยังพอรับไหว
ถ้าเป็นวิดีโอหนัก ๆ คง overload ไปแล้ว
โพสต์ HN เดียวกันนี้ ถูกโพสต์ไปแล้วเมื่อ 6 วันก่อน
ไม่เข้าใจว่าทำไมแค่แปะลิงก์นี้ถึงโดน downvote