ข้อมูลเบื้องต้นเกี่ยวกับ HTTP Live Streaming: HLS บน Android และอื่นๆ

เผยแพร่แล้ว: 2022-03-11

การสตรีมวิดีโอเป็นส่วนสำคัญของประสบการณ์อินเทอร์เน็ตสมัยใหม่ มีอยู่ทุกที่ ทั้งบนโทรศัพท์มือถือ คอมพิวเตอร์เดสก์ท็อป ทีวี และแม้กระทั่งอุปกรณ์สวมใส่ ต้องทำงานอย่างไม่มีที่ติบนอุปกรณ์และเครือข่ายทุกประเภท ไม่ว่าจะเป็นการเชื่อมต่อมือถือที่ช้า WiFi หลังไฟร์วอลล์ ฯลฯ HTTP Live Streaming (HLS) ของ Apple ถูกสร้างขึ้นโดยคำนึงถึงความท้าทายเหล่านี้

อุปกรณ์ที่ทันสมัยเกือบทั้งหมดมาพร้อมกับฮาร์ดแวร์ที่ทันสมัยซึ่งเร็วพอที่จะเล่นวิดีโอได้ ดังนั้นความเร็วและความน่าเชื่อถือของเครือข่ายจึงกลายเป็นปัญหาที่ใหญ่ที่สุด ทำไมถึงเป็นอย่างนั้น? เมื่อไม่กี่ปีที่ผ่านมา วิธีการจัดเก็บและเผยแพร่วิดีโอตามรูปแบบบัญญัติคือโปรโตคอลที่ใช้ UDP เช่น RTP สิ่งนี้พิสูจน์แล้วว่ามีปัญหาในหลาย ๆ ด้าน โดยมีเพียงไม่กี่รายการ:

  1. คุณต้องมีบริการเซิร์ฟเวอร์ (daemon) เพื่อสตรีมเนื้อหา
  2. ไฟร์วอลล์ส่วนใหญ่ได้รับการกำหนดค่าให้อนุญาตเฉพาะพอร์ตมาตรฐานและประเภทการรับส่งข้อมูลเครือข่าย เช่น http อีเมล ฯลฯ
  3. หากผู้ชมของคุณเป็นสากล คุณต้องมีสำเนาของบริการสตรีมมิ่ง daemon ที่ทำงานในภูมิภาคหลักทั้งหมด

แน่นอน คุณอาจคิดว่าปัญหาเหล่านี้แก้ไขได้ง่าย เพียงเก็บไฟล์วิดีโอ (เช่น ไฟล์ mp4) บนเซิร์ฟเวอร์ http ของคุณและใช้บริการ CDN ที่คุณชื่นชอบเพื่อให้บริการได้ทุกที่ในโลก

ที่ซึ่งการสตรีมวิดีโอแบบเก่านั้นสั้น

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

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

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

Adaptive Bitrate สตรีมมิ่ง

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

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

นั่นคือสิ่งที่การสตรีมบิตเรต Adaptive แก้ปัญหาได้

หมายเหตุ: บทแนะนำ HLS นี้จะไม่ครอบคลุมถึงการเข้ารหัส การเล่นแบบซิงโครไนซ์ และ IMSC1

HLS คืออะไร?

HTTP Live Streaming เป็นโปรโตคอลการสตรีมแบบบิตเรตที่ปรับเปลี่ยนได้ซึ่งเปิดตัวโดย Apple ในปี 2009 ใช้ไฟล์ m3u8 เพื่ออธิบายสตรีมมีเดีย และใช้ HTTP สำหรับการสื่อสารระหว่างเซิร์ฟเวอร์และไคลเอ็นต์ เป็นโปรโตคอลการสตรีมสื่อเริ่มต้นสำหรับอุปกรณ์ iOS ทั้งหมด แต่สามารถใช้ได้บน Android และเว็บเบราว์เซอร์

ภาพประกอบหน้าปก HTTP Live Streaming

โครงสร้างพื้นฐานของสตรีม HLS คือ:

  1. เพลย์ลิสต์ M3U8
  2. ไฟล์สื่อสำหรับสตรีมต่างๆ

เพลย์ลิสต์ M3U8

เริ่มต้นด้วยการตอบคำถามพื้นฐาน: ไฟล์ M3U8 คืออะไร ?

M3U (หรือ M3U8) เป็นรูปแบบไฟล์ข้อความธรรมดาที่สร้างขึ้นเพื่อจัดระเบียบคอลเลกชันของไฟล์ MP3 รูปแบบนี้ขยายสำหรับ HLS ซึ่งใช้เพื่อกำหนดสตรีมสื่อ ใน HLS มีไฟล์ m3u8 สองประเภท:

  • รายการเล่นสื่อ: มี URL ของไฟล์ที่จำเป็นสำหรับการสตรีม (เช่น ส่วนของวิดีโอต้นฉบับที่จะเล่น)
  • เพลย์ลิสต์หลัก: มี URL ไปยังเพลย์ลิสต์สื่อซึ่งจะมีวิดีโอชุดเดียวกันที่เตรียมไว้สำหรับแบนด์วิดท์ที่แตกต่างกัน

URL สตรีมสดของ M3U8 ที่เรียกว่าไม่ได้เป็นอะไรมากไปกว่า URL ไปยังไฟล์ M3U8 เช่น: https://s3-us-west-2.amazonaws.com/hls-playground/hls.m3u8

ตัวอย่างไฟล์ M3U8 สำหรับ HLS Stream

ไฟล์ M3U8 มีรายการ URL หรือเส้นทางไฟล์ในเครื่องพร้อมข้อมูลเมตาเพิ่มเติม บรรทัดข้อมูลเมตาขึ้นต้นด้วย #

ตัวอย่างนี้แสดงให้เห็นว่าไฟล์ M3U8 สำหรับสตรีม HLS แบบธรรมดามีลักษณะอย่างไร:

 #EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:11 #EXTINF:5.215111, 00000.ts #EXTINF:10.344822, 00001.ts #EXTINF:10.344822, 00002.ts #EXTINF:9.310344, 00003.ts #EXTINF:10.344822, 00004.ts ... #EXT-X-ENDLIST
  • สี่บรรทัดแรกเป็นข้อมูลเมตาส่วนกลาง (ส่วนหัว) สำหรับเพลย์ลิสต์ M3U8 นี้
  • EXT-X-VERSION เป็นเวอร์ชันของรูปแบบ M3U8 (ต้องมีอย่างน้อย 3 หากเราต้องการใช้รายการ EXTINF )
  • แท็ก EXT-X-TARGETDURATION มีระยะเวลาสูงสุดของ "กลุ่ม" ของวิดีโอแต่ละรายการ โดยทั่วไป ค่านี้จะอยู่ที่ประมาณ 10 วินาที
  • ส่วนที่เหลือของเอกสารประกอบด้วยคู่ของบรรทัดต่างๆ เช่น:
 #EXTINF:10.344822, 00001.ts

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

ไฟล์ M3U8 ที่มีไฟล์ .ts แสดงถึงรูปแบบที่ง่ายที่สุดของสตรีม HLS – เพลย์ลิสต์สื่อ

โปรดจำไว้ว่าไม่ใช่ทุกเบราว์เซอร์ที่สามารถเล่นสตรีม HLS ได้ตามค่าเริ่มต้น

เพลย์ลิสต์หลักหรือไฟล์ดัชนี M3U8

ตัวอย่าง M3U8 ก่อนหน้านี้ชี้ไปที่ชุดของชิ้นส่วน .ts ไฟล์เหล่านี้สร้างขึ้นจากไฟล์วิดีโอต้นฉบับ ซึ่งถูกปรับขนาดโดยเข้ารหัสและแบ่งออกเป็นส่วนๆ

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

M3U8 ใน HSL

HLS แก้ปัญหานี้โดยแนะนำ "เลเยอร์" อื่นของ M3U8 ไฟล์ M3U8 นี้ จะไม่มี พอยน์เตอร์ไปยังไฟล์ .ts แต่มีตัวชี้ไปยังไฟล์ M3U8 อื่นๆ ซึ่งจะมีไฟล์วิดีโอที่เตรียมไว้ล่วงหน้าสำหรับบิตเรตและความละเอียดเฉพาะ

นี่คือตัวอย่างไฟล์ M3U8:

 #EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360 https://.../640x360_1200.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=264,RESOLUTION=416x234 https://.../416x234_200.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=464,RESOLUTION=480x270 https://.../480x270_400.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1628,RESOLUTION=960x540 https://.../960x540_1500.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2628,RESOLUTION=1280x720 https://.../1280x720_2500.m3u8

เครื่องเล่นวิดีโอจะเลือกคู่ของบรรทัดเช่น:

 #EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360 https://.../640x360_1200.m3u8

สิ่งเหล่านี้เรียกว่าวิดีโอชุดเดียวกันซึ่งจัดทำขึ้นสำหรับความเร็วเครือข่ายและความละเอียดหน้าจอที่แตก ต่าง กัน ไฟล์ M3U8 เฉพาะนี้ ( 640x360_1200.m3u8 ) มีไฟล์วิดีโอของวิดีโอที่ปรับขนาดเป็น 640x360 พิกเซล และเตรียมไว้สำหรับบิตเรต 1296kbps โปรดทราบว่าอัตราบิตที่รายงานต้องคำนึงถึง ทั้งวิดีโอและสตรีมเสียง ในวิดีโอ

โดยปกติโปรแกรมเล่นวิดีโอจะเริ่มเล่นจากสตรีม รูปแบบ แรก (ในตัวอย่างก่อนหน้านี้คือ 640x360_1200.m3u8) ด้วยเหตุผลดังกล่าว คุณต้องใช้ความระมัดระวังเป็นพิเศษในการตัดสินใจว่าตัวแปรใดจะเป็นรายการแรกในรายการ ลำดับของตัวแปรอื่นๆ ไม่สำคัญ

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

หากสตรีมแรกในรายการดัชนี M3U8 ไม่ใช่สตรีมที่ดีที่สุด ไคลเอ็นต์จะต้องมีหนึ่งหรือสองรอบจนกว่าจะตกลงกับตัวแปรที่ถูกต้อง

ตอนนี้เรามี HLS สามชั้น:

  1. ไฟล์ดัชนี M3U8 (เพลย์ลิสต์หลัก) ที่มีตัวชี้ (URL) ไปยังรูปแบบต่างๆ
  2. ไฟล์ Variant M3U8 (รายการเล่นสื่อ) สำหรับการสตรีมที่แตกต่างกันสำหรับขนาดหน้าจอและความเร็วเครือข่ายที่แตกต่างกัน ประกอบด้วยตัวชี้ (URL) ไปยังไฟล์ .ts
  3. .ts ไฟล์ (chunks) ซึ่งเป็นไฟล์ไบนารีที่มีส่วนของวิดีโอ

คุณสามารถดูตัวอย่างไฟล์ดัชนี M3U8 ได้ที่นี่ (ขึ้นอยู่กับเบราว์เซอร์/ระบบปฏิบัติการของคุณอีกครั้ง)

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

  • อย่างแรกคือเตรียมไฟล์ดัชนีหลายไฟล์สำหรับเครือข่ายประเภทต่างๆ และเตรียมไคลเอนต์ล่วงหน้าเพื่อขอไฟล์ที่ถูกต้อง ลูกค้าจะต้องตรวจสอบประเภทเครือข่ายแล้วขอ เช่น http://.../index_wifi.m3u8 หรือ http://.../index_mobile.m3u8
  • คุณยังสามารถตรวจสอบให้แน่ใจว่าไคลเอ็นต์ส่งประเภทเครือข่ายโดยเป็นส่วนหนึ่งของคำขอ http (เช่น หากเชื่อมต่อกับ wifi หรือ 2G/3G/… มือถือ) แล้วเตรียมไฟล์ดัชนี M3U8 แบบไดนามิกสำหรับแต่ละคำขอ เฉพาะไฟล์ดัชนี M3U8 เท่านั้นที่ต้องการเวอร์ชันไดนามิก สตรีมเดียว (ไฟล์ตัวแปร M3U8) ยังคงสามารถจัดเก็บเป็นไฟล์สแตติกได้

กำลังเตรียมไฟล์วิดีโอสำหรับ HLS

มีสององค์ประกอบที่สำคัญของ HTTP Live Streaming ของ Apple วิธีหนึ่งคือวิธีจัดเก็บไฟล์วิดีโอ (ให้บริการผ่าน HTTP ในภายหลัง) และอีกวิธีหนึ่งคือไฟล์ดัชนี M3U8 ซึ่งบอกเครื่องเล่น (แอปไคลเอนต์สตรีมมิง) ว่าจะรับไฟล์วิดีโอใด

เริ่มต้นด้วยไฟล์วิดีโอ โปรโตคอล HLS คาดว่าไฟล์วิดีโอจะจัดเก็บไว้ในชิ้นเล็ก ๆ ที่มีความยาวเท่ากัน โดยทั่วไปแล้วแต่ละไฟล์ 10 วินาที ในขั้นต้น ไฟล์เหล่านั้นต้องถูกจัดเก็บไว้ในไฟล์ MPEG-2 TS ( .ts ) และเข้ารหัสด้วยรูปแบบ H.264 พร้อมเสียงในรูปแบบ MP3, HE-AAC หรือ AC-3

วิดีโอ HLS

ซึ่งหมายความว่าวิดีโอความยาว 30 วินาทีจะถูกแบ่งออกเป็นไฟล์ .ts ที่เล็กกว่า 3 ไฟล์ โดยแต่ละไฟล์มีความยาวประมาณ 10 วินาที

โปรดทราบว่า HLS เวอร์ชันล่าสุดอนุญาตให้แยกไฟล์ .mp4 ได้เช่นกัน เนื่องจากยังเป็นสิ่งใหม่ และโปรแกรมเล่นวิดีโอบางส่วนยังคงต้องใช้งาน ตัวอย่างในบทความนี้จะใช้ไฟล์ .ts

คีย์เฟรม

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

นั่นเป็นสาเหตุที่ .ts chunks ต้องมีคีย์เฟรมที่จุดเริ่มต้น บางครั้งผู้เล่นต้องเริ่มกลางคัน โปรแกรมเล่นสามารถคำนวณภาพปัจจุบันโดยการเพิ่ม "ส่วนต่าง" ทั้งหมดจากคีย์เฟรมแรก แต่ถ้าเริ่มต้น 9 วินาทีจากจุดเริ่มต้น จะต้องคำนวณ “ส่วนต่าง” 9 วินาที เพื่อให้การคำนวณนั้นเร็วขึ้น วิธีที่ดีที่สุดคือสร้างคีย์เฟรมทุกๆ สองสามวินาที (cca 3s ที่ดีที่สุด)

คะแนนเบรก HLS

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

ในการแก้ไขปัญหานั้นมีแท็ก #EXT-X-DISCONTINUITY ซึ่งสามารถใช้ในเพลย์ลิสต์ m3u8 โดยทั่วไป บรรทัดนี้จะบอกโปรแกรมเล่นวิดีโอให้เตรียมการล่วงหน้าสำหรับข้อเท็จจริงที่ว่าจากนี้ไป ไฟล์ .ts อาจถูกสร้างขึ้นด้วยการกำหนดค่าที่แตกต่างกัน (เช่น ความละเอียดอาจเปลี่ยนแปลง) ผู้เล่นจะต้องคำนวณใหม่ทั้งหมดและอาจเปลี่ยนไปใช้ตัวแปรอื่นและต้องเตรียมพร้อมสำหรับจุด "ความไม่ต่อเนื่อง" ดังกล่าว

ถ่ายทอดสดด้วย HLS

โดยทั่วไปมี "การสตรีมวิดีโอ" สองประเภท หนึ่งคือ Video On Demand ( VOD ) สำหรับวิดีโอที่บันทึกล่วงหน้าและสตรีมไปยังผู้ใช้เมื่อเขาตัดสินใจ และมี การถ่ายทอดสด แม้ว่า HLS จะเป็นคำย่อของ HTTP Live Streaming ทุกสิ่งที่อธิบายจนถึงตอนนี้นั้นเน้นที่ VOD แต่ก็ยังมีวิธีที่จะทำให้การสตรีมสดด้วย HLS เช่นกัน

มีการเปลี่ยนแปลงเล็กน้อยในไฟล์ M3U8 ของคุณ อันดับแรก ต้องมีแท็ก #EXT-X-MEDIA-SEQUENCE:1 ในไฟล์รุ่น M3U8 จากนั้น ไฟล์ M3U8 จะต้องไม่ ลงท้ายด้วย #EXT-X-ENDLIST (มิฉะนั้นจะต้องวางไว้ที่ส่วนท้ายเสมอ)

ในขณะที่คุณบันทึกสตรีมของคุณ คุณจะมีไฟล์ .ts ใหม่อย่างต่อเนื่อง คุณต้องผนวกไว้ในเพลย์ลิสต์ M3U8 และทุกครั้งที่คุณเพิ่มตัวนับใหม่ใน #EXT-X-MEDIA-SEQUENCE:<counter> จะต้องเพิ่มขึ้น 1

เครื่องเล่นวิดีโอจะตรวจสอบเคาน์เตอร์ หากเปลี่ยนจากครั้งที่แล้วจะรู้ว่ามีชิ้นส่วนใหม่ให้ดาวน์โหลดและเล่นหรือไม่ ตรวจสอบให้แน่ใจว่าไฟล์ M3U8 มีส่วนหัวที่ไม่มีแคช เนื่องจากไคลเอ็นต์จะทำการโหลดไฟล์ M3U8 ซ้ำเพื่อรอการเล่นชิ้นใหม่

VTT

คุณสมบัติที่น่าสนใจอีกประการสำหรับสตรีม HLS คือ คุณสามารถฝังไฟล์ Web Video Text Track (VTT) ลงในไฟล์เหล่านั้นได้ ไฟล์ VTT ใช้งานได้หลากหลาย ตัวอย่างเช่น สำหรับโปรแกรมเล่น HLS ของเว็บ คุณสามารถระบุสแน็ปช็อตของภาพสำหรับส่วนต่างๆ ของวิดีโอ เมื่อผู้ใช้เลื่อนเมาส์ไปเหนือพื้นที่จับเวลาวิดีโอ (ด้านล่างโปรแกรมเล่นวิดีโอ) โปรแกรมเล่นสามารถแสดงสแนปชอตจากตำแหน่งนั้นในวิดีโอ

การใช้ไฟล์ VTT ที่ชัดเจนอีกอย่างหนึ่งคือคำบรรยาย สตรีม HLS สามารถระบุคำบรรยายได้หลายภาษาสำหรับหลายภาษา:

 #EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-,NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/eng/prog_index.m3u8"

จากนั้น theprog_index.m3u8 จะมีลักษณะดังนี้:

 #EXTM3U #EXT-X-TARGETDURATION:30 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:30, 0000.webvtt #EXTINF:30, 0001.webvtt ...

VTT จริง (เช่น 0000.webvtt ):

 WEBVTT X-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000 00:00:01.000 --> 00:00:03.000 Subtitle -Unforced- (00:00:01.000) 00:00:03.000 --> 00:00:05.000 <i>...text here... -Unforced- (00:00:03.000)</i> <i>...text here...</i>

นอกจากไฟล์ VTT แล้ว Apple เพิ่งประกาศว่า HLS จะรองรับ IMSC1 ซึ่งเป็นรูปแบบคำบรรยายใหม่ที่ปรับให้เหมาะกับการส่งแบบสตรีมมิง ข้อได้เปรียบที่สำคัญที่สุดคือสามารถกำหนดสไตล์ได้โดยใช้ CSS

เครื่องมือ HTTP Live Streaming และปัญหาที่อาจเกิดขึ้น

Apple ได้เปิดตัวเครื่องมือ HSL ที่มีประโยชน์มากมาย ซึ่งมีการอธิบายรายละเอียดเพิ่มเติมในคู่มือ HLS อย่างเป็นทางการ

  • สำหรับการสตรีมแบบสด Apple ได้เตรียมเครื่องมือชื่อ mediastreamsegmenter เพื่อสร้างไฟล์เซ็กเมนต์ได้ทันทีจากสตรีมวิดีโอต่อเนื่อง
  • เครื่องมือสำคัญอีกตัวหนึ่งคือ mediastreamvalidator มันจะตรวจสอบเพลย์ลิสต์ M3U8 ของคุณ ดาวน์โหลดไฟล์วิดีโอ และรายงานปัญหาต่างๆ ตัวอย่างเช่น เมื่ออัตราบิตที่รายงานไม่เหมือนกับที่คำนวณจากไฟล์ .ts
  • แน่นอน เมื่อคุณต้องเข้ารหัส/ถอดรหัส/mux/demux/chunk/strip/merge/join/… ไฟล์วิดีโอ/เสียง แสดงว่ามี ffmpeg เตรียมคอมไพล์ ffmpeg เวอร์ชันที่คุณกำหนดเองสำหรับกรณีการใช้งานเฉพาะ

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

หากเป็นไปได้ ควรตรวจสอบให้แน่ใจว่าซอฟต์แวร์ของคุณได้รับการตั้งค่าให้บันทึกวิดีโอด้วยอัตราเฟรมคงที่

ตัวอย่างการสตรีมสดของ HTTP

ฉันเตรียมแอปพลิเคชัน HLS Android ซึ่งสตรีม HLS ที่กำหนดไว้ล่วงหน้าโดยใช้เครื่องเล่น ExoPlayer ของ Google จะแสดงวิดีโอและรายการ "เหตุการณ์" ของ HLS ด้านล่าง เหตุการณ์เหล่านี้รวมถึง: ทุกไฟล์ .ts ที่ดาวน์โหลด หรือทุกครั้งที่ผู้เล่นตัดสินใจเปลี่ยนไปใช้สตรีมที่มีอัตราบิตสูงหรือต่ำ

มาดูส่วนหลักของการเริ่มต้นวิวเวอร์กัน ในขั้นตอนแรก เราจะเรียกข้อมูลประเภทการเชื่อมต่อปัจจุบันของอุปกรณ์และใช้ข้อมูลนั้นเพื่อตัดสินใจว่าจะดึงไฟล์ m3u8 ใด

 String m3u8File = "hls.m3u8"; ConnectivityManager connectivity = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = connectivity.getActiveNetworkInfo(); if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) { int type = activeNetwork.getType(); int subType = activeNetwork.getSubtype(); if (type == ConnectivityManager.TYPE_MOBILE && subType == TelephonyManager.NETWORK_TYPE_GPRS) { m3u8File = "hls_gprs.m3u8"; } } String m3u8URL = "https://s3-us-west-2.amazonaws.com/hls-playground/" + m3u8File;

โปรดทราบว่าไม่จำเป็นอย่างยิ่ง โปรแกรมเล่น HLS จะปรับให้เข้ากับรูปแบบ HLS ที่ถูกต้องเสมอหลังจากผ่านไปสองสามชิ้น แต่นั่นหมายความว่าใน 5-20 วินาทีแรก ผู้ใช้อาจไม่ได้ดูรูปแบบที่เหมาะสมที่สุดของการสตรีม

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

ในขั้นตอนถัดไป เราจะเริ่มต้นและเริ่มต้นโปรแกรมเล่น HLS ของเรา:

 Handler mainHandler = new Handler(); DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder() .setEventListener(mainHandler, bandwidthMeterEventListener) .build(); TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter); TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); LoadControl loadControl = new DefaultLoadControl(); SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);

จากนั้นเราเตรียมเครื่องเล่นและป้อนด้วย m3u8 ที่ถูกต้องสำหรับประเภทการเชื่อมต่อเครือข่ายนี้:

 DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "example-hls-app"), bandwidthMeter); HlsMediaSource videoSource = new HlsMediaSource(Uri.parse(m3u8URL), dataSourceFactory, 5, mainHandler, eventListener); player.prepare(videoSource);

และนี่คือผลลัพธ์:

ตัวอย่างการสตรีม HLS ใน Android

ความเข้ากันได้ของเบราว์เซอร์ HLS การพัฒนาในอนาคต

มีข้อกำหนดจาก Apple สำหรับแอปสตรีมวิดีโอบน iOS ที่พวกเขา ต้อง ใช้ HLS หากวิดีโอมีความยาวมากกว่า 10 นาทีหรือใหญ่กว่า 5mb ในตัวมันเองเป็นการรับประกันว่า HLS จะอยู่ที่นี่ มีความกังวลเกี่ยวกับ HLS และ MPEG-DASH และสิ่งใดที่จะเป็นผู้ชนะในเวทีเว็บเบราว์เซอร์ HLS ไม่ได้ใช้ในเบราว์เซอร์สมัยใหม่ทั้งหมด (คุณอาจสังเกตเห็นว่าหากคุณคลิกตัวอย่าง URL m3u8 ก่อนหน้า) ตัวอย่างเช่นใน Android ในเวอร์ชันที่น้อยกว่า 4.0 จะไม่ทำงานเลย ตั้งแต่ 4.1 ถึง 4.4 จะทำงานเพียงบางส่วนเท่านั้น (เช่น เสียงขาดหายไป หรือวิดีโอหายไปแต่เสียงทำงานได้)

แต่ “การต่อสู้” ครั้งนี้ง่ายขึ้นเล็กน้อยเมื่อเร็วๆ นี้ Apple ประกาศว่าโปรโตคอล HLS ใหม่จะอนุญาตไฟล์ mp4 ที่แยกส่วน ( fMP4 ) ก่อนหน้านี้ หากคุณต้องการรองรับทั้ง HLS และ MPEG-DASH คุณต้องเข้ารหัสวิดีโอของคุณสองครั้ง ตอนนี้ คุณจะสามารถใช้ไฟล์วิดีโอเดิมซ้ำได้ และจัดแพ็กเกจใหม่เฉพาะไฟล์ข้อมูลเมตา ( .m3u8 สำหรับ HLS และ .mpd สำหรับ MPEG-DASH)

การประกาศล่าสุดอีกประการหนึ่งคือการรองรับ High Efficiency Video Codec (HEVC) หากใช้ จะต้องจัดแพ็กเกจเป็นไฟล์ mp4 ที่กระจัดกระจาย และนั่นอาจหมายความว่าอนาคตของ HLS คือ fMP4

สถานการณ์ปัจจุบันในโลกของเบราว์เซอร์คือการใช้งานเบราว์เซอร์แท็ก <video> บางส่วนเท่านั้นที่จะเล่น HLS ได้ทันที แต่มีโอเพ่นซอร์สและโซลูชันเชิงพาณิชย์ที่เข้ากันได้กับ HLS ส่วนใหญ่เสนอ HLS โดยมี Flash สำรอง แต่มีการใช้งานบางส่วนที่เขียนด้วย JavaScript อย่างสมบูรณ์

ห่อ

บทความนี้เน้นที่ HTTP Live Streaming โดยเฉพาะ แต่ตามแนวคิดแล้ว สามารถอ่านเป็นคำอธิบายว่า Adaptive Bitrate Streaming (ABS) ทำงานอย่างไร โดยสรุป เราสามารถพูดได้ว่า HLS เป็นเทคโนโลยีที่แก้ปัญหาที่สำคัญมากมายในการสตรีมวิดีโอ:

  • ช่วยลดความยุ่งยากในการจัดเก็บไฟล์วิดีโอ
  • CDN
  • ผู้เล่นไคลเอนต์จัดการแบนด์วิดท์ไคลเอนต์ที่แตกต่างกันและสลับไปมาระหว่างสตรีม
  • คำบรรยาย การเข้ารหัส การเล่นแบบซิงโครไนซ์ และคุณสมบัติอื่นๆ ที่ไม่ครอบคลุมในบทความนี้

ไม่ว่าคุณจะใช้ HLS หรือ MPEG-DASH หรือไม่ก็ตาม โปรโตคอลทั้งสองควรมีฟังก์ชันการทำงานที่คล้ายคลึงกัน และด้วยการแนะนำไฟล์ mp4 ที่แยกส่วน (fMP4) ใน HLS คุณจะสามารถใช้ไฟล์วิดีโอเดียวกันได้ ซึ่งหมายความว่าในกรณีส่วนใหญ่ คุณจะต้องเข้าใจพื้นฐานของโปรโตคอลทั้งสอง โชคดีที่ดูเหมือนว่าพวกมันจะเคลื่อนที่ไปในทิศทางเดียวกัน ซึ่งจะทำให้ง่ายต่อการควบคุม