สตรีม HLS ส่วนตัวของคุณโหลดให้คุณ ไม่ใช่ให้ผู้ชมของคุณ
หน้าโหลดได้เพราะเซิร์ฟเวอร์ของคุณเข้าถึงกล้องได้ แต่เบราว์เซอร์ยังคงดึงเพลย์ลิสต์ ตัดสินใจว่าใครเป็นผู้ส่งคำขอ แล้วทดสอบห่วงโซ่
คุณทดสอบหน้าเว็บบนแล็ปท็อป เครื่องเล่นเริ่มทำงาน และตั๋วถูกปิด ผู้ชมที่อยู่อีกด้านเปิดหน้าเดียวกันแล้วเจอตัวหมุนที่ไม่มีวันจบ คำอธิบายที่ให้กันบ่อยคือ VPN อยู่บนเซิร์ฟเวอร์ การเล่นจึงควรได้ผล — แต่เบราว์เซอร์คือชิ้นส่วนที่ขอเพลย์ลิสต์ และมันมีเส้นทางเครือข่ายของตัวเอง หน้าที่ฝังอยู่บนเซิร์ฟเวอร์ที่มีการเข้าถึงแบบส่วนตัวไม่ได้ให้ยืมการเข้าถึงนั้นแก่ใครก็ตามที่โหลดมัน
เรื่องนี้เกี่ยวกับหน้า ASP.NET ที่มีอยู่แล้วซึ่งเล่นแหล่ง HLS เช่น http://10.5.5.9:8080/live/stream.m3u8 ซึ่งเป็นที่อยู่ส่วนตัวแบบตัวอย่าง มีสองรูปแบบที่ใช้ได้ รูปแบบหนึ่งน่าจะไม่ใช่สิ่งที่คุณสร้าง
ความเชื่อผิด: หน้าที่โหลดได้พิสูจน์เส้นทางของสื่อ
HTML ของหน้านั้นมาจากเว็บเซิร์ฟเวอร์ของคุณ ผ่านเส้นทางใดก็ตามที่เว็บเซิร์ฟเวอร์ของคุณมี เพลย์ลิสต์และเซกเมนต์มาจากต้นทางของสื่อ ผ่านเส้นทางใดก็ตามที่ชิ้นส่วนผู้ขอมี เมื่อเครื่องเล่นทำงานในเบราว์เซอร์ของผู้ชม สองสิ่งนี้คือไคลเอนต์สองตัว ที่อยู่ต้นทางสองที่ และบ่อยครั้งคือโดเมนความล้มเหลวสองโดเมน การเห็นอย่างแรกสำเร็จไม่ได้บอกอะไรเกี่ยวกับอย่างที่สอง
สิ่งที่การทดสอบของคุณพิสูจน์จริงนั้นแคบกว่าที่เห็น: เครื่องของคุณเข้าถึงทั้งหน้าสาธารณะและโฮสต์สื่อส่วนตัวได้ในเวลาเดียวกัน เครื่องของผู้ชมไม่เคยเป็นส่วนหนึ่งของการทดลอง
เพลย์ลิสต์ขออะไรต่อไป
RFC 8216 แยกเพลย์ลิสต์สื่อซึ่งระบุเซกเมนต์ออกจากเพลย์ลิสต์หลักซึ่งระบุเพลย์ลิสต์อื่น และแก้ไข URI แบบสัมพัทธ์เทียบกับ URI ของเพลย์ลิสต์ที่บรรจุมัน กฎข้อนี้คือส่วนที่คนข้ามไป การดึงไฟล์ .m3u8 หนึ่งไฟล์ได้สำเร็จไม่ใช่การทดสอบการเล่น เพราะไฟล์ที่ดึงมาคือดัชนี ไม่ใช่ตัวสื่อ
ตามห่วงโซ่แบบที่เครื่องเล่นทำ: เปิดเพลย์ลิสต์ที่เลือก แล้วขอทรัพยากรที่มันระบุชื่อ แล้วตามการเปลี่ยนเส้นทางใด ๆ เพลย์ลิสต์ที่ให้บริการผ่านเว็บเซิร์ฟเวอร์ที่เข้าถึงได้ก็ยังชี้ผู้ชมไปยังที่อยู่ส่วนตัวที่เข้าถึงไม่ได้ได้ เช่นเดียวกัน การย้ายเพลย์ลิสต์แบบสัมพัทธ์ไปยัง URL อื่นเปลี่ยนฐานที่รายการของมันใช้แก้ไข ซึ่งเป็นเหตุผลว่าการเขียน URL แรกที่มองเห็นใหม่แล้วหยุดอยู่ตรงนั้นมักได้เพลย์ลิสต์ที่ดูใช้ได้แต่เล่นไม่ได้
การชมโดยตรง: ผู้ชมต้องมีเส้นทาง
หากผู้ชมควรเข้าถึงโฮสต์สื่อโดยตรง อุปกรณ์ของพวกเขาต้องมี VPN ที่ได้รับอนุมัติหรือเส้นทางส่วนตัวอื่น DNS ที่แก้ชื่อที่คุณใช้จริง การอนุญาตให้เข้าถึงปลายทางเหล่านั้น และการยืนยันตัวตนใด ๆ ที่บริการสื่อกำหนด ตรวจสอบแต่ละข้อบนอุปกรณ์ของผู้ชมไม่ใช่บนเซิร์ฟเวอร์ เบราว์เซอร์บนโทรศัพท์ที่ติดตั้งโปรไฟล์ VPN ไว้แต่ไม่ได้เชื่อมต่อเป็นความล้มเหลวที่พบบ่อยและทำซ้ำได้เต็มที่
รูปแบบนี้รักษาต้นทางให้เป็นส่วนตัวและผลักภาระการเข้าถึงไปที่ผู้ชม เป็นการตัดสินใจเชิงนโยบายพอ ๆ กับการตัดสินใจเชิงเทคนิค ดังนั้นยืนยันว่าผู้ชมที่ตั้งใจไว้ทุกคนได้รับอนุญาตให้มีเส้นทางนั้นก่อนออกแบบโดยยึดมัน
การส่งจากฝั่งเซิร์ฟเวอร์: จุดเข้าเดียวที่ควบคุมได้
ทางเลือกคือฟรอนต์เอนด์สื่อที่ได้รับอนุญาตซึ่งดึงต้นทางผ่านเส้นทางส่วนตัวของมันและเผยแพร่ซ้ำเฉพาะทรัพยากรที่หันเข้าหาผู้ชม รักษาเพลย์ลิสต์ เซกเมนต์ และทรัพยากรคีย์ใด ๆ ให้สอดคล้องกับจุดเข้าเดียวนี้ มิฉะนั้นเครื่องเล่นจะดึงเพลย์ลิสต์ที่เขียนใหม่ผ่านฟรอนต์เอนด์ และดึงเซกเมนต์ตรงจากที่อยู่ที่ผู้ชมเข้าถึงไม่ได้
จำกัดต้นทางและเส้นทางที่อนุญาตในฟรอนต์เอนด์นั้น URL อะไรก็ได้ที่ผู้ใช้ให้มาจะเปลี่ยนพร็อกซีที่เป็นประโยชน์ให้กลายเป็นตัวดึงเครือข่ายภายในของคุณแบบไม่จำกัด ซึ่งเป็นปัญหาที่ร้ายแรงกว่าสตรีมที่เล่นไม่ได้มาก ใส่ต้นทางและคำนำหน้าเส้นทางในรายการที่อนุญาตแทนการตรวจสอบสตริงภายหลัง
สำหรับแหล่ง HLS ที่มีอยู่ ให้ตรวจก่อนว่าการส่งต่อที่ควบคุมได้นั้นเพียงพอหรือไม่ การมี VPN อยู่ตรงกลางไม่ได้หมายความว่าต้องแปลงรหัส จากนั้นตรวจสอบการทำงานร่วมกันของเบราว์เซอร์และตัวเข้ารหัสจริง เพราะการตอบกลับที่เข้าถึงได้และรูปแบบที่รองรับเป็นเงื่อนไขสองข้อแยกกัน รักษา TLS การยืนยันตัวตน และข้อกำหนดความปลอดภัยของเบราว์เซอร์ของต้นทางไว้ — เครื่องเล่นที่ฝังอยู่ไม่ใช่ข้อยกเว้น
ทดสอบห่วงโซ่ ไม่ใช่ URL
รันการตรวจสอบจากชิ้นส่วนที่จะส่งคำขอจริงทุกครั้ง และถือแต่ละขั้นเป็นผลลัพธ์ของตัวเอง:
curl -s http://10.5.5.9:8080/live/stream.m3u8
curl -s -o /dev/null -w '%{http_code}\n' http://10.5.5.9:8080/live/segment-000123.tsจากนั้นทำซ้ำในเบราว์เซอร์ของผู้ชมเองด้วยสตรีมที่ตั้งใจ ไม่ใช่รูปแบบทดสอบจากโต๊ะของคุณ การโหลดหน้า การโหลดเพลย์ลิสต์ การดึงเซกเมนต์ และความล้มเหลวในการอนุญาตเป็นสี่ผลลัพธ์ที่แตกต่างกัน และคุณต้องการเห็นทั้งสี่ก่อนจะบอกว่าแก้แล้ว อย่าติดตั้งปลั๊กอินเบราว์เซอร์รุ่นเก่าเพราะตัวอย่างเก่าเล่นสตรีมหนึ่งด้วยวิธีนั้น ชิ้นส่วนที่ขาดมักเป็นเส้นทางของผู้ชมหรือ URL เซกเมนต์ที่ไม่ได้ลงนาม
เมื่อรูปแบบเป็นสิ่งที่เลือกอย่างตั้งใจแล้ว จดไว้บรรทัดเดียว: ใครดึงสื่อ ผ่านเส้นทางใด และผู้ชมได้รับอนุญาตให้ขออะไร ประโยคนั้นยุติข้อโต้แย้งในอนาคตส่วนใหญ่เกี่ยวกับว่าสตรีมนี้มีไว้เพื่อใครจริง ๆ