مقدمة إلى HTTP Live Streaming: HLS على Android والمزيد
نشرت: 2022-03-11يعد دفق الفيديو جزءًا لا يتجزأ من تجربة الإنترنت الحديثة. إنه موجود في كل مكان: على الهواتف المحمولة وأجهزة الكمبيوتر المكتبية وأجهزة التلفزيون وحتى الأجهزة القابلة للارتداء. يجب أن يعمل بشكل لا تشوبه شائبة على كل جهاز ونوع شبكة ، سواء كان ذلك على اتصالات بطيئة للهاتف المحمول أو شبكة WiFi أو خلف جدران الحماية وما إلى ذلك. تم إنشاء HTTP Live Streaming (HLS) من Apple مع وضع هذه التحديات في الاعتبار تمامًا.
تأتي جميع الأجهزة الحديثة تقريبًا مزودة بأجهزة حديثة سريعة بما يكفي لتشغيل الفيديو ، لذلك تبرز سرعة الشبكة والموثوقية باعتبارها أكبر مشكلة. لماذا هذا؟ حتى قبل بضع سنوات ، كانت الطريقة المتعارف عليها لتخزين ونشر الفيديو عبارة عن بروتوكولات تستند إلى UDP مثل RTP. ثبت أن هذا يمثل مشكلة من نواح كثيرة ، لإدراج عدد قليل فقط:
- أنت بحاجة إلى خدمة خادم (خفي) لدفق المحتوى.
- يتم تكوين معظم جدران الحماية للسماح فقط بالمنافذ القياسية وأنواع حركة مرور الشبكة ، مثل http والبريد الإلكتروني وما إلى ذلك.
- إذا كان جمهورك عالميًا ، فأنت بحاجة إلى نسخة من خدمة البث الخفي التي تعمل في جميع المناطق الرئيسية.
بالطبع ، قد تعتقد أن كل هذه المشاكل سهلة الحل. فقط قم بتخزين ملفات الفيديو (على سبيل المثال ، ملفات mp4) على خادم http الخاص بك واستخدم خدمة CDN المفضلة لديك لخدمتهم في أي مكان في العالم.
حيث يتراجع تدفق الفيديو القديم
هذا أبعد ما يكون عن الحل الأفضل لعدة أسباب ، الكفاءة أحدها. إذا قمت بتخزين ملفات الفيديو الأصلية بدقة كاملة ، فسيجد المستخدمون في المناطق الريفية أو أجزاء من العالم ذات اتصال ضعيف صعوبة في الاستمتاع بها. سيكافح مشغلو الفيديوهات لديهم لتنزيل بيانات كافية لتشغيلها في وقت التشغيل.
لذلك ، أنت بحاجة إلى إصدار خاص من الملف بحيث يكون مقدار الفيديو الذي تم تنزيله هو نفسه تقريبًا الذي يمكن تشغيله. على سبيل المثال ، إذا كانت دقة الفيديو وجودته بحيث يمكن تنزيل خمس ثوانٍ أخرى من الفيديو في خمس ثوانٍ ، فهذا هو الأمثل. ومع ذلك ، إذا استغرق الأمر خمس ثوانٍ لتنزيل فيديو بقيمة ثلاث ثوانٍ فقط ، فسيتوقف المشغل وينتظر تنزيل الجزء التالي من البث.
من ناحية أخرى ، فإن تقليل الجودة والدقة إلى أبعد من ذلك لن يؤدي إلا إلى تدهور تجربة المستخدم في الاتصالات الأسرع ، حيث ستوفر النطاق الترددي دون داع. ومع ذلك ، هناك طريقة ثالثة.
تدفق معدل البت التكيفي
بينما يمكنك تحميل إصدارات مختلفة من الفيديو لمستخدمين مختلفين ، فإنك ستحتاج بعد ذلك إلى امتلاك القدرة على التحكم في لاعبيهم وحساب ما هو أفضل دفق للاتصال والجهاز. بعد ذلك ، يحتاج اللاعب إلى التبديل بينهما (على سبيل المثال ، عندما ينتقل المستخدم من 3G إلى WiFi). وحتى ذلك الحين ، ماذا لو قام العميل بتغيير نوع الشبكة؟ بعد ذلك ، يجب على المشغل التبديل إلى مقطع فيديو مختلف ، ولكن يجب أن يبدأ تشغيله ليس من البداية ، ولكن في مكان ما في منتصف الفيديو. إذن كيف تحسب نطاق البايت المطلوب؟
سيكون الشيء الرائع إذا تمكنت مشغلات الفيديو من اكتشاف التغييرات في نوع الشبكة وعرض النطاق الترددي المتاح ، ثم التبديل بشفافية بين التدفقات المختلفة (من نفس الفيديو المعد لسرعات مختلفة) حتى يجد الأفضل.
هذا هو بالضبط ما يحله تدفق معدل البت التكيفي.
ملاحظة: لن يغطي هذا البرنامج التعليمي HLS التشفير وعمليات التشغيل المتزامنة و IMSC1.
ما هو HLS؟
HTTP Live Streaming هو بروتوكول دفق معدل بت التكيف قدمته شركة Apple في عام 2009. ويستخدم ملفات m3u8 لوصف تدفقات الوسائط ويستخدم HTTP للاتصال بين الخادم والعميل. إنه بروتوكول دفق الوسائط الافتراضي لجميع أجهزة iOS ، ولكن يمكن استخدامه على Android ومتصفحات الويب.
اللبنات الأساسية لتدفقات HLS هي:
- قوائم التشغيل M3U8
- ملفات الوسائط لمختلف التدفقات
قوائم التشغيل 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
يحتوي ملف 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
. يتم إنشاؤها من ملف الفيديو الأصلي ، والذي تم تغيير حجمه وتقسيمه إلى أجزاء.
هذا يعني أنه لا يزال لدينا المشكلة الموضحة في المقدمة - ماذا عن العملاء على الشبكات البطيئة جدًا (أو السريعة بشكل غير عادي)؟ أو العملاء على شبكات سريعة ذات أحجام شاشة صغيرة جدًا؟ ليس من المنطقي دفق ملف بأقصى درجة دقة إذا لم يكن من الممكن عرضه بكل روعته على هاتفك الجديد اللامع.
يحل 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
) على أجزاء ملف الفيديو للفيديو الذي تم تغيير حجمه إلى 640 × 360 بكسل وتم إعداده لمعدلات بت تبلغ 1296 كيلو بت في الثانية. لاحظ أن معدل البت الذي تم الإبلاغ عنه يجب أن يأخذ في الاعتبار كلاً من تدفقات الفيديو والصوت في الفيديو.
سيبدأ مشغل الفيديو عادةً في التشغيل من متغير البث الأول (في المثال السابق ، يكون هذا هو 640x360_1200.m3u8). لهذا السبب ، يجب أن تولي عناية خاصة لتحديد المتغير الذي سيكون الأول في القائمة. ترتيب المتغيرات الأخرى ليس مهما.
إذا استغرق تنزيل ملف .ts الأول وقتًا طويلاً (مما يتسبب في "التخزين المؤقت" ، أي انتظار المقطع التالي) ، فسيتحول مشغل الفيديو إلى دفق بمعدل بت أقل. وبالطبع ، إذا تم تحميله بسرعة كافية ، فهذا يعني أنه يمكنه التبديل إلى متغير جودة أفضل ، ولكن فقط إذا كان ذلك منطقيًا بالنسبة لدقة العرض.
إذا لم يكن الدفق الأول في قائمة فهرس M3U8 هو الأفضل ، فسيحتاج العميل إلى دورة أو دورتين حتى يستقر مع المتغير الصحيح.
إذن ، لدينا الآن ثلاث طبقات من HLS:
- ملف فهرس M3U8 (قائمة التشغيل الرئيسية) يحتوي على مؤشرات (عناوين URL) للمتغيرات.
- ملفات M3U8 المتغيرة (قائمة تشغيل الوسائط) لتدفقات مختلفة لشاشات مختلفة الأحجام وسرعات الشبكة. أنها تحتوي على مؤشرات (URLs) لملفات .ts.
- ملفات
.ts
(أجزاء) وهي ملفات ثنائية تحتوي على أجزاء من الفيديو.
يمكنك مشاهدة مثال لملف فهرس M3U8 هنا (مرة أخرى ، يعتمد ذلك على المتصفح / نظام التشغيل الخاص بك).
في بعض الأحيان ، تعلم مسبقًا أن العميل متصل بشبكة بطيئة أو سريعة. في هذه الحالة ، يمكنك مساعدة العميل في اختيار المتغير الصحيح من خلال توفير ملف فهرس M3U8 بمتغير أول مختلف. هناك طريقتان للقيام بذلك.
- الأول هو إعداد ملفات فهرس متعددة لأنواع شبكات مختلفة وإعداد العميل مسبقًا لطلب الملف الصحيح. سيتعين على العميل التحقق من نوع الشبكة ثم طلب على سبيل المثال
http://.../index_wifi.m3u8
أوhttp://.../index_mobile.m3u8
. - يمكنك أيضًا التأكد من أن العميل يرسل نوع الشبكة كجزء من طلب http (على سبيل المثال إذا كان متصلاً بشبكة wifi ، أو 2G / 3G / ... للهاتف المحمول) ثم قم بإعداد ملف الفهرس M3U8 ديناميكيًا لكل طلب. يحتاج ملف الفهرس M3U8 فقط إلى إصدار ديناميكي ، ولا يزال من الممكن تخزين التدفقات الفردية (ملفات M3U8 المتغيرة) كملفات ثابتة.
تحضير ملفات الفيديو لـ HLS
هناك نوعان من اللبنات الأساسية للبث المباشر HTTP من Apple. أحدهما هو الطريقة التي يتم بها تخزين ملفات الفيديو (ليتم تقديمها عبر HTTP لاحقًا) والآخر هو ملف (ملفات) فهرس M3U8 الذي يخبر المشغل (تطبيق عميل البث) بمكان الحصول على ملف الفيديو.
لنبدأ بملفات الفيديو. يتوقع بروتوكول HLS ملفات الفيديو المخزنة في أجزاء أصغر متساوية الطول ، عادةً 10 ثوانٍ لكل منها. في الأصل ، كان يجب تخزين هذه الملفات في ملفات MPEG-2 TS ( .ts
) وتشفيرها بتنسيق H.264 مع صوت بتنسيق MP3 أو HE-AAC أو AC-3.
هذا يعني أنه سيتم تقسيم مقطع فيديو مدته 30 ثانية إلى 3 ملفات أصغر بتنسيق .ts
، يبلغ طول كل منها 10 ثوانٍ تقريبًا.

لاحظ أن أحدث إصدار من HLS يسمح أيضًا بملفات mp4. نظرًا لأن هذا لا يزال شيئًا جديدًا ، ولا تزال بعض مشغلات الفيديو بحاجة إلى تنفيذه ، فستستخدم الأمثلة الواردة في هذه المقالة ملفات .ts
.
الإطارات الرئيسية
يجب ترميز المقاطع بإطار مفتاح في بداية كل ملف. يحتوي كل فيديو على إطارات. الإطارات عبارة عن صور ، لكن تنسيقات الفيديو لا تخزن صورًا كاملة ، فقد يستغرق ذلك مساحة كبيرة على القرص. يقومون بتشفير الاختلاف فقط من الإطار السابق. عندما تقفز إلى نقطة وسط في الفيديو ، يحتاج المشغل إلى "نقطة بداية" من حيث يتم تطبيق كل تلك الاختلافات من أجل إظهار الصورة الأولية ، ثم بدء تشغيل الفيديو.
لهذا السبب يجب أن تحتوي أجزاء .ts
على إطار رئيسي في البداية. يحتاج اللاعبون أحيانًا إلى البدء في منتصف المجموعة. يمكن للمشغل دائمًا حساب الصورة الحالية عن طريق إضافة جميع "الاختلافات" من الإطار الرئيسي الأول. ولكن ، إذا بدأت 9 ثوانٍ من البداية ، فإنها تحتاج إلى حساب 9 ثوانٍ من "الاختلافات". لجعل هذا الحساب أسرع ، من الأفضل إنشاء إطارات رئيسية كل بضع ثوان (أفضل cca 3s).
نقاط استراحة HLS
هناك مواقف تريد فيها تشغيل مقاطع فيديو متعددة على التوالي. تتمثل إحدى طرق القيام بذلك في دمج ملفات الفيديو الأصلية ، ثم إنشاء تدفقات HLS مع هذا الملف ، ولكن هذا يمثل مشكلة لأسباب متعددة. ماذا لو كنت تريد عرض إعلان قبل الفيديو الخاص بك أو بعده؟ ربما لا ترغب في القيام بذلك لجميع المستخدمين ، وربما تريد إعلانات مختلفة لمستخدمين مختلفين. وبالطبع ، لا تريد تحضير ملفات HLS بإعلانات مختلفة مسبقًا.
لإصلاح هذه المشكلة ، هناك علامة #EXT-X-DISCONTINUITY
والتي يمكن استخدامها في قائمة التشغيل m3u8. يخبر هذا السطر مشغل الفيديو بشكل أساسي بالاستعداد مقدمًا لحقيقة أنه من الآن فصاعدًا ، يمكن إنشاء ملفات .ts
بتكوين مختلف (على سبيل المثال ، قد تتغير الدقة). سيحتاج اللاعب إلى إعادة حساب كل شيء وربما التبديل إلى متغير آخر ويجب أن يكون مستعدًا لنقاط "عدم الاستمرارية" هذه.
البث المباشر مع HLS
هناك نوعان أساسيان من "بث الفيديو". الأول هو الفيديو عند الطلب ( 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 والمشكلات المحتملة
قدمت 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 ، التطورات المستقبلية
هناك متطلبات من Apple لتطبيقات دفق الفيديو على iOS أنه يجب عليهم استخدام HLS إذا كانت مقاطع الفيديو أطول من 10 دقائق أو أكبر من 5 ميغا بايت. هذا في حد ذاته هو ضمان أن 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).
إعلان آخر مؤخرًا هو دعم برنامج ترميز الفيديو عالي الكفاءة (HEVC). في حالة استخدامها ، يجب تعبئتها في ملفات mp4 مجزأة. وهذا يعني على الأرجح أن مستقبل HLS هو fMP4
.
يتمثل الوضع الحالي في عالم المتصفحات في أن بعض تطبيقات المتصفح لعلامة <video>
فقط هي التي ستلعب HLS خارج الصندوق. ولكن هناك حلول تجارية ومفتوحة المصدر توفر توافق HLS. يقدم معظمهم HLS من خلال وجود احتياطي Flash ولكن هناك بعض التطبيقات المكتوبة بالكامل في JavaScript.
تغليف
تركز هذه المقالة بشكل خاص على البث المباشر لـ HTTP ، ولكن من الناحية المفاهيمية يمكن قراءتها أيضًا على أنها شرح لكيفية عمل دفق معدل البت التكيفي (ABS). في الختام ، يمكننا القول إن HLS هي تقنية تحل العديد من المشكلات المهمة في دفق الفيديو:
- يبسط تخزين ملفات الفيديو
- CDN
- يتعامل اللاعبون مع العملاء مع نطاقات مختلفة للعميل والتبديل بين التدفقات
- الترجمة والتشفير وعمليات التشغيل المتزامنة والميزات الأخرى غير المشمولة في هذه المقالة
بغض النظر عما إذا كنت تستخدم HLS أو MPEG-DASH ، يجب أن يقدم كلا البروتوكولين وظائف متشابهة ، ومع إدخال mp4 (fMP4) المجزأ في HLS ، يمكنك استخدام نفس ملفات الفيديو. هذا يعني أنك ستحتاج في معظم الحالات إلى فهم أساسيات كلا البروتوكولين. لحسن الحظ ، يبدو أنهم يتحركون في نفس الاتجاه ، مما يسهل إتقانهم.