FFmpeg เปิดตัวไปป์ไลน์ทรานส์โค้ดแบบมัลติเธรด
(ffmpeg.org)- การทรานส์โค้ดแบบมัลติเธรด ของ FFmpeg CLI ถูกเผยแพร่ในรูปแบบ “ใช้งานได้เต็มรูปแบบ” รุ่นแรก หลังใช้เวลาพัฒนาราว 2 ปีและมีคอมมิตเตรียมงานมากกว่า 700 รายการ
- เนื่องจากขอบเขตการเปลี่ยนแปลงมีขนาดใหญ่ จึงยังมีโอกาสที่บางฟีเจอร์จะเสียหาย และ การทดสอบกับการรีวิว ยังเป็นงานสำคัญก่อนการรวมจริง
-fix_sub_duration_heartbeatหลีกเลี่ยงพฤติกรรมแบบ ไม่กำหนดแน่นอน ในการทำงานแบบอะซิงก์ได้ยาก เนื่องจากมีสมมติฐานเรื่องการซิงก์ระหว่างดีโคเดอร์กับเอนโค้ดเดอร์·มัคเซอร์- โดยทั่วไปโอเวอร์เฮดจากเธรดมีขนาดเล็ก แต่ในงานที่มีปริมาณงานต่อแพ็กเก็ตน้อยมาก ต้นทุนอาจเด่นชัดกว่าประโยชน์ด้านประสิทธิภาพ
- หากคอขวดไม่ได้กระจุกอยู่ที่คอมโพเนนต์เดียว และแต่ละคอมโพเนนต์ยังไม่ได้อิ่มตัวจากการทำมัลติเธรดของตัวเองอยู่แล้ว สภาพแวดล้อมมัลติคอร์อาจช่วยเพิ่มการใช้ CPU และ เวลาประมวลผลจริง ได้อย่างมาก
ประเด็นสำคัญของแพตช์มัลติเธรดสำหรับ FFmpeg CLI
- หลังจาก พัฒนามาราว 2 ปี และมีคอมมิตเตรียมงานมากกว่า 700 รายการ เวอร์ชัน “fully functional” รุ่นแรกของ FFmpeg CLI แบบมัลติเธรดได้ถูกเผยแพร่เป็นชุดแพตช์
- เนื่องจากการเปลี่ยนแปลงมีขนาดใหญ่ จึงยังอาจมีความเสียหายที่ยังไม่ถูกค้นพบ ทำให้ต้องมี การทดสอบและการรีวิว บนกรณีใช้งานจริง
- ในกรณีทั่วไปโอเวอร์เฮดจากเธรดมีขนาดเล็ก แต่ในเวิร์กโหลดที่มี ปริมาณงานต่อแพ็กเก็ต ต่ำมาก โอเวอร์เฮดอาจมีนัยสำคัญ
- หากการทรานส์โค้ดไม่ได้ถูกครอบงำด้วยคอมโพเนนต์เดียว และแต่ละคอมโพเนนต์ยังไม่อิ่มตัวจากมัลติเธรดภายในของตัวเอง ระบบมัลติคอร์อาจช่วยปรับปรุงทั้งการใช้ CPU และเวลาในการรันได้
ข้อจำกัดในการทำงานและปัญหาที่ทราบแล้ว
- ตัวเลือก
-fix_sub_duration_heartbeatในโครงสร้างปัจจุบันตั้งอยู่บนสมมติฐานเรื่องการซิงก์ระหว่างคอมโพเนนต์ที่แยกจากกัน- โฟลว์เป้าหมายคือ การซิงก์จากเอนโค้ดเดอร์·มัคเซอร์ไปยังดีโคเดอร์
- เมื่อแต่ละคอมโพเนนต์ทำงานแบบอะซิงก์ พฤติกรรมจะกลายเป็นไม่กำหนดแน่นอนโดยพื้นฐาน
- แม้ปัจจุบันพฤติกรรมจะคาดเดาได้ยากอยู่แล้ว แต่หากรันด้วยตัวเลือกเดียวกัน ผลลัพธ์ระหว่างการรันยังคงเป็นแบบกำหนดแน่นอน
- ในแพตช์ 16/24 ตัวเลือกนี้จะถูกปิดใช้งาน และจำเป็นต้องมีแนวทางจัดการที่ดีกว่า
โครงสร้างของชุดแพตช์ 24 รายการ
- ชุดแพตช์ประกอบด้วยทั้งหมด 24 รายการ
- 01-09/24 เป็นการแก้ไขเตรียมความพร้อม และอาจถูกพุชก่อนซีรีส์ที่เหลือ
- 10-17/24 ย้ายการเข้ารหัสและการกรองไปอยู่บนเธรด และทำการเปลี่ยนแปลงเตรียมความพร้อมที่จำเป็น
- การทำเธรดในขั้นนี้เป็นเพียงเธรด “หลอก” ที่เธรดหลักรอให้เธรดอื่นทำงานเสร็จ จึงยังไม่ใช่การทำงานขนานจริง
- เนื่องจากมีโอเวอร์เฮดชั่วคราวสูง หรืออาจทำให้บางกรณีมุมเสียหาย จึงเหมาะกว่าจะพุชหลังจากชุดทั้งหมดพร้อมแล้ว
- 18/24 เป็นแพตช์เดี่ยวที่ใหญ่ที่สุด โดยเพิ่ม ตัวจัดตารางทรานส์โค้ด แต่ในจุดนั้นยังไม่ทำงานจริง
- 19-24/24 แปลงคอมโพเนนต์แต่ละตัวให้มาใช้รูปแบบการทำงานผ่านตัวจัดตาราง
- แม้จะแยกไว้เพื่อให้รีวิวได้ง่าย แต่ตอนพุชจริงควรถูกรวมเข้าด้วยกัน
- สามารถดูข้อมูลที่เกี่ยวข้องได้จากวิดีโองานนำเสนอ VDD ล่าสุดและสาขา
ffmpeg_threading- VDD talk
- ffmpeg_threading branch
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
บนเซิร์ฟเวอร์ ARM แบบ 4 คอร์ เร็วขึ้นประมาณ 2 เท่า และดูเหมือนว่า overhead จากการทำ parallelization จะไม่มากนัก
ffmpeg_threading/ffmpegใช้เวลา 7.771 วินาที ส่วนffmpegเดิมใช้ 13.841 วินาที และการใช้งาน CPU อยู่ที่ 218% กับ 114% ตามลำดับอยากรู้ว่าถ้าใช้ hardware acceleration ทั้ง video decoding และ encoding บนการ์ด NVIDIA จะเป็นอย่างไร:
ffmpeg -hwaccel cuda -i $inputFile -codec:a copy -codec:v hevc_nvenc $outputงานอื่น ๆ น่าจะมีต้นทุนด้าน performance ค่อนข้างเล็ก ดังนั้นถึงจะยินดีกับการปรับปรุงนี้ แต่คาดว่าผลกระทบจริงน่าจะค่อนข้างจำกัด
น่าจะลิงก์ไปที่ https://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/3165... แทนทวีตจะดีกว่า
สาระสำคัญของทวีตก็อยู่ที่ลิงก์นี้อยู่ดี
ถ้าจะเข้าใจเรื่องนี้ แนะนำให้ดูการนำเสนอของ Anton ที่ VideoLAN Dev Days 2023: https://www.youtube.com/watch?v=Z4DS3jiZhfo&t=1221
ทำให้นึกถึงแนวทางที่จะจัดการ property animation ได้ทรงพลังขึ้น
ทวีตลิงก์ไปที่ http://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/31655... แล้วจากตรงนั้นก็อ้างถึงโค้ดอีกทีที่ https://git.khirnov.net/libav.git/log/?h=ffmpeg_threading
สงสัยว่านี่จะถูก นำไปใช้โดยอัตโนมัติ หรือว่าต้องผสม command-line parameters ให้ซับซ้อนเอง
สงสัยว่ามี ซอฟต์แวร์ตัดต่อวิดีโอ ที่ใช้ ffmpeg หรือไม่
ครั้งหนึ่งเคยคิดจะลองทำอะไรสักอย่างที่วาดรูปทรงด้วย SVG แล้วใช้ ffmpeg หรือใส่ UI หรือแค่เพิ่มข้อความ แต่ก็ไม่ได้เริ่มทำ
Avidemux ให้ความรู้สึกคล้าย ๆ แบบนั้นอยู่บ้าง และข้างในของ ffmpeg ก็ค่อนข้างดิบ ไม่ได้ถูกออกแบบมาให้เข้าถึงจาก GUI ดังนั้น editor ที่ใช้เป็นฐานน่าจะอืด แปลก และดูแลรักษายาก
แต่ editor แบบ modular ที่สร้าง preview ด้วยตัวอธิบายคำสั่งหรือ pipeline viewer น่าจะเป็นไปได้
ffmpeg ทรงพลัง แต่การที่ใช้งานผ่าน command line เท่านั้นก็เป็นสิ่งที่กีดกันผู้ใช้บางส่วนอยู่ ก่อนหน้านี้เคยเขียนสคริปต์ Python ที่รับคลิปจำนวนสุ่มแล้วใช้ฟิลเตอร์
xstackทำเป็น mosaic ซึ่งไม่ง่ายเลยhttps://vsdb.top/
https://www.vapoursynth.com/
สำหรับซอฟต์แวร์ niche ที่อิง ffmpeg เคยเห็น losslesscut: https://github.com/mifi/lossless-cut
Staxrip ก็ใหญ่เช่นกัน: https://github.com/staxrip/staxrip
แต่ editor ที่ “ครบวงจร” นั้นไม่ค่อยแน่ใจ
ถ้างาน transcoding เล็ก ๆ ที่ทำสำหรับ Plex เร็วขึ้นก็คงดี
การ์ดจอไม่รองรับ hardware transcoding เลยคาดหวังกับเรื่องนี้
กำลังหาวิธีเพิ่มความเร็ว transcoding อยู่ วิธีหนึ่งคือ GPU acceleration อีกวิธีคือเพิ่มจำนวน thread
แต่การหาจำนวน thread ที่เหมาะสมที่สุดนั้นยาก
แต่ถ้าทำได้ GPU acceleration จะดีกว่ามาก
สงสัยว่าในการ deploy ffmpeg ขนาดใหญ่ ข้อกำหนดด้านไลเซนส์ เป็นอย่างไร กรณีไหนต้องมีค่าใช้จ่าย?
http://ffmpeg.org/legal.html
กล่าวคือใช้ฟรี แต่ถ้าใช้บางโมดูล อาจมีปัญหาเมื่อนำไปผสมกับโค้ด proprietary
ดีใจที่เห็น FFmpeg ดีขึ้น หวังว่าจะได้เห็นการรองรับ Dolby AC4 เร็ว ๆ นี้