ทุกวัน ผู้ชมหลายล้านคนดูวิดีโอบนอินเทอร์เน็ต แต่เพื่อให้วิดีโอใช้งานได้ ไม่เพียงแต่ต้องอัปโหลดไปยังเซิร์ฟเวอร์เท่านั้น แต่ยังต้องประมวลผลด้วย ยิ่งสิ่งนี้เกิดขึ้นเร็วเท่าไรก็ยิ่งดีต่อบริการและผู้ใช้เท่านั้น
ฉันชื่อ Askar Kamalov เมื่อปีที่แล้วฉันเข้าร่วมทีมเทคโนโลยีวิดีโอ Yandex วันนี้ฉันจะเล่าสั้น ๆ ให้กับผู้อ่าน Habr เกี่ยวกับวิธีการที่กระบวนการเข้ารหัสแบบขนานทำให้เราสามารถเร่งการส่งวิดีโอไปยังผู้ใช้ได้อย่างมาก
โพสต์นี้จะเป็นที่สนใจของผู้ที่ไม่เคยคิดมาก่อนว่าจะเกิดอะไรขึ้นภายใต้บริการวิดีโอ ในความคิดเห็นคุณสามารถถามคำถามและแนะนำหัวข้อสำหรับโพสต์ในอนาคต
คำไม่กี่คำเกี่ยวกับงานนั้นเอง ยานเดกซ์ไม่เพียงช่วยให้คุณค้นหาวิดีโอบนเว็บไซต์อื่น แต่ยังจัดเก็บวิดีโอสำหรับบริการของตัวเองด้วย ไม่ว่าจะเป็นรายการต้นฉบับหรือการแข่งขันกีฬาที่ออกอากาศ ภาพยนตร์บน KinoPoisk หรือวิดีโอบน Zen และ News ทั้งหมดนี้จะถูกอัปโหลดไปยังเซิร์ฟเวอร์ของเรา เพื่อให้ผู้ใช้สามารถรับชมวิดีโอได้ จะต้องเตรียม: แปลงเป็นรูปแบบที่ต้องการ สร้างตัวอย่าง หรือแม้แต่ดำเนินการผ่านเทคโนโลยี
การเข้ารหัสตามลำดับ
ดังนั้นความสุขของผู้ใช้จึงขึ้นอยู่กับว่าวิดีโอจะใช้งานได้เร็วแค่ไหน และสิ่งนี้ถูกกำหนดโดยความเร็วในการแปลงรหัสเป็นหลัก เมื่อไม่มีข้อกำหนดที่เข้มงวดสำหรับความเร็วในการอัพโหลดวิดีโอ ก็ไม่มีปัญหา คุณใช้ไฟล์เดียวที่แบ่งแยกไม่ได้ แปลงและอัปโหลด ในช่วงเริ่มต้นของการเดินทาง เราทำงานดังนี้:
ไคลเอนต์อัปโหลดวิดีโอไปยังที่เก็บข้อมูล ส่วนประกอบตัววิเคราะห์จะรวบรวมข้อมูลเมตาและถ่ายโอนวิดีโอไปยังส่วนประกอบผู้ปฏิบัติงานเพื่อทำการแปลง ทุกขั้นตอนจะดำเนินการตามลำดับ ในกรณีนี้ อาจมีเซิร์ฟเวอร์เข้ารหัสได้หลายเซิร์ฟเวอร์ แต่มีเพียงเซิร์ฟเวอร์เดียวเท่านั้นที่ไม่ว่างในการประมวลผลวิดีโอใดวิดีโอหนึ่ง แผนภาพที่เรียบง่ายและโปร่งใส นี่คือจุดที่ข้อดีของมันสิ้นสุดลง รูปแบบนี้สามารถปรับขนาดได้ในแนวตั้งเท่านั้น (เนื่องจากการซื้อเซิร์ฟเวอร์ที่มีประสิทธิภาพมากกว่า)
การเข้ารหัสตามลำดับพร้อมผลลัพธ์ระดับกลาง
เพื่อให้การรอคอยอันเจ็บปวดราบรื่นขึ้น อุตสาหกรรมจึงมีตัวเลือกการเขียนโค้ดที่รวดเร็วขึ้นมา ชื่อนี้ทำให้เข้าใจผิด เพราะอันที่จริง การเขียนโค้ดแบบเต็มเกิดขึ้นตามลำดับและใช้เวลานานพอๆ กัน แต่ด้วยผลลัพธ์ระดับกลาง แนวคิดก็คือ: เตรียมและเผยแพร่วิดีโอเวอร์ชันความละเอียดต่ำโดยเร็วที่สุด และเผยแพร่เฉพาะเวอร์ชันที่มีความละเอียดสูงกว่าเท่านั้น
ในด้านหนึ่ง วิดีโอจะพร้อมใช้งานเร็วขึ้น และเป็นประโยชน์กับงานสำคัญต่างๆ แต่ในทางกลับกัน ภาพจะออกมาพร่ามัว และทำให้ผู้ชมเกิดความรำคาญ
ปรากฎว่าคุณไม่เพียงแต่ต้องประมวลผลวิดีโออย่างรวดเร็ว แต่ยังต้องรักษาคุณภาพของวิดีโอด้วย นี่คือสิ่งที่ผู้ใช้คาดหวังจากบริการวิดีโอในขณะนี้ อาจดูเหมือนว่าเพียงพอแล้วที่จะซื้อเซิร์ฟเวอร์ที่มีประสิทธิภาพสูงสุด (และอัปเกรดเซิร์ฟเวอร์ทั้งหมดในคราวเดียวเป็นประจำ) แต่นี่เป็นทางตัน เนื่องจากมีวิดีโออยู่เสมอที่จะทำให้แม้แต่ฮาร์ดแวร์ที่ทรงพลังที่สุดทำงานช้าลง
การเข้ารหัสแบบขนาน
การแบ่งปัญหาที่ซับซ้อนออกเป็นปัญหาที่ซับซ้อนน้อยกว่าและแก้ไขพร้อมกันบนเซิร์ฟเวอร์ต่างๆ จะมีประสิทธิภาพมากกว่ามาก นี่คือ MapReduce สำหรับวิดีโอ ในกรณีนี้ เราไม่ได้ถูกจำกัดด้วยประสิทธิภาพของเซิร์ฟเวอร์เดียวและสามารถปรับขนาดในแนวนอนได้ (โดยการเพิ่มเครื่องใหม่)
อย่างไรก็ตาม ความคิดในการแบ่งวิดีโอออกเป็นชิ้นเล็ก ๆ การประมวลผลแบบขนานและรวมเข้าด้วยกันนั้นไม่ใช่ความลับ คุณสามารถพบการอ้างอิงถึงแนวทางนี้ได้มากมาย (เช่น ในHabré ฉันขอแนะนำโพสต์เกี่ยวกับโครงการ
ดังนั้น ในสถาปัตยกรรมใหม่ เราได้แบ่งบล็อกคนงานเสาหินด้วยการเข้ารหัสตามลำดับออกเป็นไมโครเซอร์วิส Segmenter, Tcoder, Combiner
- Segmenter แบ่งวิดีโอออกเป็นส่วนๆ ประมาณ 10 วินาที ชิ้นส่วนประกอบด้วย GOP หนึ่งรายการขึ้นไป (
กลุ่มรูปภาพ ). GOP แต่ละรายการมีความเป็นอิสระและมีการเข้ารหัสแยกกัน เพื่อให้สามารถถอดรหัสได้โดยไม่ต้องอ้างอิงถึงเฟรมจาก GOP อื่นๆ นั่นคือสามารถเล่นชิ้นส่วนแยกจากกันได้ การแบ่งส่วนนี้ช่วยลดเวลาแฝง ช่วยให้การประมวลผลเริ่มต้นเร็วขึ้น - Tcoder ประมวลผลแต่ละส่วน รับงานจากคิว ดาวน์โหลดแฟรกเมนต์จากที่เก็บข้อมูล เข้ารหัสเป็นความละเอียดที่แตกต่างกัน (โปรดจำไว้ว่าผู้เล่นสามารถเลือกเวอร์ชันตามความเร็วการเชื่อมต่อ) จากนั้นนำผลลัพธ์กลับเข้าไปในที่เก็บข้อมูล และทำเครื่องหมายแฟรกเมนต์ว่าประมวลผลแล้ว ในฐานข้อมูล หลังจากประมวลผลแฟรกเมนต์ทั้งหมดแล้ว Tcoder จะส่งงานเพื่อสร้างผลลัพธ์สำหรับส่วนประกอบถัดไป
- Combiner รวบรวมผลลัพธ์ร่วมกัน: ดาวน์โหลดส่วนย่อยทั้งหมดที่สร้างโดย Tcoder สร้างสตรีมสำหรับความละเอียดที่แตกต่างกัน
คำไม่กี่คำเกี่ยวกับเสียง ตัวแปลงสัญญาณเสียง AAC ที่ได้รับความนิยมมากที่สุดมีคุณสมบัติที่ไม่พึงประสงค์ หากคุณเข้ารหัสชิ้นส่วนแยกกัน คุณจะไม่สามารถรวมชิ้นส่วนเหล่านั้นเข้าด้วยกันได้อย่างราบรื่น การเปลี่ยนแปลงจะสังเกตเห็นได้ชัดเจน ตัวแปลงสัญญาณวิดีโอไม่มีปัญหานี้ ตามทฤษฎีแล้ว คุณสามารถค้นหาวิธีแก้ปัญหาทางเทคนิคที่ซับซ้อนได้ แต่เกมนี้ยังไม่คุ้มที่จะเสียไป (เสียงมีน้ำหนักน้อยกว่าวิดีโออย่างมาก) ดังนั้น เฉพาะวิดีโอเท่านั้นที่ถูกเข้ารหัสแบบขนาน และแทร็กเสียงทั้งหมดได้รับการประมวลผล
ผลการวิจัย
ด้วยการประมวลผลวิดีโอแบบขนาน เราจึงลดความล่าช้าระหว่างการอัปโหลดวิดีโอถึงเราและผู้ใช้ใช้งานได้อย่างมาก ตัวอย่างเช่น ก่อนหน้านี้อาจใช้เวลาสองชั่วโมงในการสร้างเวอร์ชันเต็มที่มีคุณภาพแตกต่างกันสำหรับภาพยนตร์ FullHD ที่มีความยาวหนึ่งชั่วโมงครึ่ง ตอนนี้ทั้งหมดนี้ใช้เวลา 15 นาที ยิ่งไปกว่านั้น ด้วยการประมวลผลแบบขนาน เราจึงสร้างเวอร์ชันที่มีความละเอียดสูงได้เร็วกว่าเวอร์ชันที่มีความละเอียดต่ำด้วยแนวทางผลลัพธ์ระดับกลางแบบเก่า
และอีกอย่างหนึ่ง ด้วยแนวทางแบบเก่า อาจมีเซิร์ฟเวอร์ไม่เพียงพอหรือไม่ได้ใช้งานโดยไม่มีงานใดๆ การเข้ารหัสแบบขนานช่วยให้คุณเพิ่มส่วนแบ่งการรีไซเคิลเหล็กได้ ขณะนี้คลัสเตอร์เซิร์ฟเวอร์มากกว่าพันเซิร์ฟเวอร์ของเรามักยุ่งอยู่กับบางสิ่งบางอย่างอยู่เสมอ
ในความเป็นจริงยังมีช่องว่างสำหรับการปรับปรุง ตัวอย่างเช่น เราสามารถประหยัดเวลาได้มากหากเราเริ่มประมวลผลส่วนย่อยของวิดีโอก่อนที่จะมาถึงเราทั้งหมด อย่างที่พวกเขาพูดกันอีกมากมายที่จะมา
เขียนความคิดเห็นว่างานใดในสาขาการทำงานกับวิดีโอที่คุณต้องการอ่าน
ลิงก์ที่เป็นประโยชน์เกี่ยวกับประสบการณ์ของเพื่อนร่วมงานในอุตสาหกรรม
SVE: การประมวลผลวิดีโอแบบกระจายในระดับ Facebook ลดความซับซ้อนของนวัตกรรมสื่อที่ Netflix ด้วย Archer บล็อกเทคโนโลยี Netflix
ที่มา: will.com