एचएलएस

ExoPlayer, कई कंटेनर फ़ॉर्मैट के साथ एचएलएस के साथ काम करता है. इसमें शामिल ऑडियो और वीडियो सैंपल के फ़ॉर्मैट भी काम करने चाहिए. ज़्यादा जानकारी के लिए, सैंपल फ़ॉर्मैट सेक्शन देखें. हम एचएलएस कॉन्टेंट के प्रोड्यूसर को, अच्छी क्वालिटी वाली एचएलएस स्ट्रीम जनरेट करने का सुझाव देते हैं. इसके बारे में यहां बताया गया है.

सुविधा इनकी अनुमति है टिप्पणियां
कंटेनर
MPEG-TS हां
FMP4/CMAF हां
ADTS (AAC) हां
MP3 हां
सबटाइटल/कैप्शन
CEA-608 हां
CEA-708 हां
WebVTT हां
मेटाडेटा
आईडी3 हां
SCTE-35 नहीं
कॉन्टेंट की सुरक्षा
AES-128 हां
AES-128 का सैंपल नहीं
वाइडवाइन हां एपीआई 19+ ("cenc" स्कीम) और 25+ ("cbcs" स्कीम)
PlayReady SL2000 हां सिर्फ़ Android TV के लिए
सर्वर कंट्रोल
डेल्टा अपडेट हां
प्लेलिस्ट को फिर से लोड होने से रोकना हां
पेज को पहले से लोड करने के सुझावों को लोड होने से रोकना हां जिन बाइट रेंज की लंबाई तय नहीं की गई है उनके लिए
लाइव वीडियो चलाना
लाइव स्ट्रीम को सामान्य तरीके से चलाना हां
लो-लेटेंसी एचएलएस (Apple) हां
कम इंतज़ार वाला एचएलएस (कम्यूनिटी) नहीं
कॉमन मीडिया क्लाइंट डेटा (सीएमसीडी) हां इंटिग्रेशन गाइड

MediaItem का इस्तेमाल करना

एचएलएस स्ट्रीम चलाने के लिए, आपको एचएलएस मॉड्यूल का इस्तेमाल करना होगा.

Kotlin

implementation("androidx.media3:media3-exoplayer-hls:1.4.1")

Groovy

implementation "androidx.media3:media3-exoplayer-hls:1.4.1"

इसके बाद, HLS प्लेलिस्ट के यूआरआई के लिए MediaItem बनाया जा सकता है और उसे प्लेयर को पास किया जा सकता है.

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri));
// Prepare the player.
player.prepare();

अगर आपका यूआरआई .m3u8 पर खत्म नहीं होता है, तो कॉन्टेंट के टाइप के बारे में साफ़ तौर पर बताने के लिए, MediaItem.Builder के setMimeType में MimeTypes.APPLICATION_M3U8 को पास किया जा सकता है.

मीडिया आइटम का यूआरआई, मीडिया प्लेलिस्ट या मल्टीवैरिएंट प्लेलिस्ट पर ले जा सकता है. अगर यूआरआई, एक से ज़्यादा वैरिएंट वाली प्लेलिस्ट पर ले जाता है, जिसमें एक से ज़्यादा #EXT-X-STREAM-INF टैग मौजूद हैं, तो ExoPlayer उपलब्ध बैंडविड्थ और डिवाइस की क्षमताओं को ध्यान में रखते हुए, वैरिएंट के बीच अपने-आप अडजस्ट हो जाएगा.

HlsMediaSource का इस्तेमाल करना

पसंद के मुताबिक बनाने के ज़्यादा विकल्पों के लिए, HlsMediaSource बनाएं और उसे MediaItem के बजाय सीधे प्लेयर को पास करें.

Kotlin

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a HLS media source pointing to a playlist uri.
val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource)
// Prepare the player.
player.prepare()

Java

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a HLS media source pointing to a playlist uri.
HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource);
// Prepare the player.
player.prepare();

मेनिफ़ेस्ट ऐक्सेस करना

Player.getCurrentManifest को कॉल करके, मौजूदा मेनिफ़ेस्ट को वापस पाया जा सकता है. HLS के लिए, आपको दिखाए गए ऑब्जेक्ट को HlsManifest में कास्ट करना चाहिए. जब भी मेनिफ़ेस्ट लोड होता है, तब Player.Listener के onTimelineChanged कॉलबैक को भी कॉल किया जाता है. मांग पर उपलब्ध कॉन्टेंट के लिए ऐसा एक बार होगा और लाइव कॉन्टेंट के लिए कई बार. नीचे दिया गया कोड स्निपेट दिखाता है कि जब भी मेनिफ़ेस्ट लोड होता है, तो ऐप्लिकेशन कुछ कैसे कर सकता है.

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is HlsManifest) {
        // Do something with the manifest.
      }
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          HlsManifest hlsManifest = (HlsManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

वीडियो चलाने की सेटिंग में बदलाव करना

ExoPlayer में, वीडियो चलाने के अनुभव को अपने ऐप्लिकेशन की ज़रूरतों के हिसाब से बनाने के कई तरीके उपलब्ध हैं. उदाहरणों के लिए, पसंद के मुताबिक बनाने का पेज देखें.

बिना चंक वाली तैयारी की सुविधा बंद करना

डिफ़ॉल्ट रूप से, ExoPlayer बिना चंक वाले तरीके का इस्तेमाल करेगा. इसका मतलब है कि ExoPlayer, स्ट्रीम तैयार करने के लिए सिर्फ़ मल्टीवैरिएंट प्लेलिस्ट में मौजूद जानकारी का इस्तेमाल करेगा. यह तब काम करता है, जब #EXT-X-STREAM-INF टैग में CODECS एट्रिब्यूट मौजूद हो.

अगर आपके मीडिया सेगमेंट में, मल्टीप्लेक्स किए गए ऐसे सबटाइटल ट्रैक शामिल हैं जिन्हें #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS टैग के साथ मल्टीवैरिएंट प्लेलिस्ट में नहीं बताया गया है, तो आपको इस सुविधा को बंद करना पड़ सकता है. ऐसा न करने पर, इन सबटाइटल ट्रैक का पता नहीं चलेगा और उन्हें चलाया नहीं जा सकेगा. यहां दिए गए स्निपेट में दिखाए गए तरीके से, HlsMediaSource.Factory में चंकलेस तैयारी की सुविधा बंद की जा सकती है. ध्यान दें कि इससे वीडियो शुरू होने में लगने वाला समय बढ़ जाएगा. ऐसा इसलिए, क्योंकि ExoPlayer को इन अतिरिक्त ट्रैक को खोजने के लिए, मीडिया सेगमेंट डाउनलोड करना होगा. इसलिए, बेहतर होगा कि आप मल्टीवैरिएंट प्लेलिस्ट में सबटाइटल वाले ट्रैक का एलान करें.

Kotlin

val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory)
    .setAllowChunklessPreparation(false)
    .createMediaSource(MediaItem.fromUri(hlsUri))

Java

HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory)
        .setAllowChunklessPreparation(false)
        .createMediaSource(MediaItem.fromUri(hlsUri));

अच्छी क्वालिटी का एचएलएस कॉन्टेंट बनाना

ExoPlayer का ज़्यादा से ज़्यादा फ़ायदा पाने के लिए, HLS कॉन्टेंट को बेहतर बनाने के लिए कुछ दिशा-निर्देशों का पालन किया जा सकता है. पूरी जानकारी के लिए, ExoPlayer में एचएलएस प्लेबैक के बारे में Medium पर पोस्ट पढ़ें. मुख्य बातें ये हैं:

  • सेगमेंट की सटीक अवधि का इस्तेमाल करें.
  • लगातार चलने वाली मीडिया स्ट्रीम का इस्तेमाल करें. साथ ही, सभी सेगमेंट में मीडिया स्ट्रक्चर में बदलाव करने से बचें.
  • #EXT-X-INDEPENDENT-SEGMENTS टैग का इस्तेमाल करें.
  • वीडियो और ऑडियो, दोनों शामिल करने वाली फ़ाइलों के बजाय, अलग-अलग वीडियो और ऑडियो वाली स्ट्रीम का इस्तेमाल करें.
  • मल्टीवैरिएंट प्लेलिस्ट में ज़्यादा से ज़्यादा जानकारी शामिल करें.

ये दिशा-निर्देश खास तौर पर लाइव स्ट्रीम पर लागू होते हैं:

  • #EXT-X-PROGRAM-DATE-TIME टैग का इस्तेमाल करें.
  • #EXT-X-DISCONTINUITY-SEQUENCE टैग का इस्तेमाल करें.
  • लाइव विंडो की अवधि ज़्यादा होनी चाहिए. एक मिनट या उससे ज़्यादा समय का वीडियो अच्छा होता है.