एचएलएस

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

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

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

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

Kotlin

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

ग्रूवी

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 टैग का इस्तेमाल करें.
  • लाइव विंडो की अवधि ज़्यादा होनी चाहिए. एक मिनट या उससे ज़्यादा समय का वीडियो अच्छा होता है.