Debugging Adaptive Bitrate (ABR) streaming via HLS (HTTP Live Streaming)
บทความนี้เริ่มจากลองปรับจากที่เคย stream เพลงด้วย bandwidth ค่านึงมาเป็นแบบ adaptive ความหมายก็คือ stream เพลงโดยคุณภาพของเพลงที่ถูกเล่นขึ้นอยู่กับ bandwidth ที่ client ส่งมาขณะนั้น แต่ก็เลยเกิดคำถามว่า
เราจะรู้ได้อย่างไรว่าเพลงที่ถูกเล่น คุณภาพเปลี่ยนไปตาม bandwidth แล้วจริงๆ
ปกติไฟล์เพลงที่เรานำมา stream สามารถแปลงไฟล์หรือ convert ตาม bitrate ที่เราต้องการได้ ซึ่งการ convert ก็ขึ้นอยู่กับว่าอยากจะ stream ไฟล์คุณภาพยังไง ค่าที่สามารถปรับเปลี่ยนได้ก็เช่น sample rate, bitrate
http://devimages.apple.com/samplecode/adDemo/ad.m3u8
ลิงค์ด้านบนเป็นตัวอย่างของ URL ที่ปล่อย HLS และหากเรากด save ลิงค์นี้ ก็จะได้ meta data ของ HLS มา
เรามาดูหน้าตา meta data ของ HLS แบบง่ายๆกัน
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=384020,CODECS="mp4a.40.2"
chunklist_w1544243128.m3u8
ในไฟล์ meta data ก็จะบอก version ของ meta data, บอกว่ามีกี่ sub stream จากข้างต้นมีแค่อันเดียวที่ bandwidth เท่ากับ 384k
และ บอกว่า codec อะไร
อีกส่วนที่สำคัญก็คือ chunklist_w1544243128
เมื่อ client request ไปที่ streaming server ก็จะได้กลุ่มของไฟล์ที่จะนำมาเล่นต่อไป ส่วนค่า w1544243128
เป็นค่าของ session id ของ client ที่เรียกเข้ามา
ผลลัพธ์ที่เกิดขึ้นเมื่อเรา stream ไฟล์ข้างต้น หาก client มี internet ที่มี bandwidth สูงกว่า 384 kbps เพลงจะเล่นได้อย่าง smooth ไม่มีปัญหาอะไร แต่หาก client มี bandwidth ต่ำกว่านั้น เพลงอาจเริ่มเล่นช้า หรือเล่นๆหยุดๆ ได้
ผมทดสอบการเล่นเพลงผ่าน Safari และกำหนด throtting bandwidth ของเน็ตเวิร์คด้วย Charles proxy
Adaptive Bitrate (ABR)
เพื่อต้องการทดสอบว่าไฟล์เปลี่ยนไปหรือเปล่า เราก็จำเป็นต้องเตรียมไฟล์ตามคุณภาพของแต่ละ bitrate นั้นๆ โดยสามารถใช้ ffmpeg ในการ convert ไฟล์ได้
ผมกำหนดไว้ 3 แบบ โดยมีที่ bitrate 64
128
และ 192
kbps
สุดท้ายหน้าตาของ meta data ก็จะเป็นแบบนี้
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=64000
chunklist_w719702645_b64000_sleng.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=128000
chunklist_w719702645_b128000_sleng.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=192000
chunklist_w719702645_b192000_sleng.m3u8
ผมทำการทดสอบเหมือนเดิม และกำหนด throtting ผ่าน Charles ที่ความเร็วต่างๆ ก็พบว่า เมื่อ bandwidth เปลี่ยนไป ไฟล์จะโดนเปลี่ยนไปด้วย แต่เพลงยังสามารถเล่นได้ต่อเนื่อง อาจมีอาการกระตุกบ้างในจังหวะที่มีการ switch ไปเล่น chunk ใหม่ สังเกตได้จากรูปด้านล่างที่ hi-light จะเป็นช่วงก่อนที่กำลังจะ switch ไปที่คุณภาพใหม่ 64k -> 192k
ผลสรุปจากการทำ ABR HLS ก็คือ client สามารถเลือกเล่นเพลงคุณภาพอื่นๆได้ ขึ้นอยู่กับความเร็ว bandwidth ในตอนนั้น ส่งผลให้ client สามารถเล่นเพลงได้อย่างต่อเนื่องมากขึ้น ในส่วนของทางฝั่ง server สิ่งที่ต้องคำนึงเพิ่มเติมคือ ชนิดของไฟล์จะมีกี่แบบ mp3, mp4 และคุณภาพของไฟล์จะมีกี่แบบ 320k 256k เป็นต้น ซึ่งสิ่งเหล่านี้ล้วนเกี่ยวข้องกับ storage ด้วยทั้งสิ้น
บทความนี้ผมเขียนถึงแค่ฝั่ง client เท่านั้น ในครั้งถัดๆไปจะมาเล่าให้ฟังฝั่ง server กันบ้างครับ