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
पर कॉल करके, मौजूदा मेनिफ़ेस्ट को वापस लाया जा सकता है.
एचएलएस के लिए, आपको लौटाए गए ऑब्जेक्ट को 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 पर एचएलएस प्लेबैक के बारे में मीडियम पोस्ट पढ़ें. मुख्य बातें ये हैं:
- सेगमेंट की सटीक अवधि का इस्तेमाल करें.
- लगातार चलने वाली मीडिया स्ट्रीम का इस्तेमाल करें. साथ ही, सभी सेगमेंट में मीडिया स्ट्रक्चर में बदलाव करने से बचें.
#EXT-X-INDEPENDENT-SEGMENTS
टैग का इस्तेमाल करें.- वीडियो और ऑडियो, दोनों शामिल करने वाली फ़ाइलों के बजाय, अलग-अलग वीडियो और ऑडियो वाली स्ट्रीम का इस्तेमाल करें.
- मल्टीवैरिएंट प्लेलिस्ट में ज़्यादा से ज़्यादा जानकारी शामिल करें.
ये दिशा-निर्देश खास तौर पर लाइव स्ट्रीम पर लागू होते हैं:
#EXT-X-PROGRAM-DATE-TIME
टैग का इस्तेमाल करें.#EXT-X-DISCONTINUITY-SEQUENCE
टैग का इस्तेमाल करें.- लाइव विंडो की अवधि लंबी हो. एक मिनट या उससे ज़्यादा का समय बढ़िया है.