ExoPlayer, लाइव और मांग पर उपलब्ध RTSP, दोनों के साथ काम करता है. सपोर्ट किए जाने वाले सैंपल फ़ॉर्मैट और नेटवर्क टाइप की जानकारी यहां दी गई है.
नमूने के लिए इस्तेमाल किए जा सकने वाले फ़ॉर्मैट
- H264 (एसडीपी मीडिया के ब्यौरे में, डिकोडर को शुरू करने के लिए fmtp एट्रिब्यूट में SPS/PPS डेटा शामिल होना चाहिए).
- AAC (ADTS बिटस्ट्रीम के साथ).
- AC3.
इस्तेमाल किए जा सकने वाले नेटवर्क टाइप
- यूडीपी यूनिकास्ट पर आरटीपी (मल्टीकास्ट काम नहीं करता).
- इंटरलीव्ड आरटीएसपी, टीसीपी का इस्तेमाल करके आरटीएसपी पर आरटीपी.
MediaItem का इस्तेमाल करना
RTSP स्ट्रीम चलाने के लिए, आपको RTSP मॉड्यूल पर निर्भर रहना होगा.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.8.0")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.8.0"
इसके बाद, RTSP यूआरआई के लिए MediaItem बनाया जा सकता है और उसे प्लेयर को पास किया जा सकता है.
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(rtspUri)) // 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(rtspUri)); // Prepare the player. player.prepare();
पुष्टि करना
ExoPlayer, RTSP BASIC और DIGEST पुष्टि के साथ वीडियो चलाने की सुविधा देता है. सुरक्षित किए गए RTSP कॉन्टेंट को चलाने के लिए, MediaItem के यूआरआई को पुष्टि करने की जानकारी के साथ कॉन्फ़िगर किया जाना चाहिए. खास तौर पर, यूआरआई rtsp://<username>:<password>@<host address> के फ़ॉर्मैट में होना चाहिए.
RtspMediaSource का इस्तेमाल करना
अपनी पसंद के मुताबिक बनाने के ज़्यादा विकल्पों के लिए, MediaItem के बजाय RtspMediaSource बनाएं और इसे सीधे प्लेयर को पास करें.
Kotlin
// Create an RTSP media source pointing to an RTSP uri. val mediaSource: MediaSource = RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri)) // Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media source to be played. player.setMediaSource(mediaSource) // Prepare the player. player.prepare()
Java
// Create an RTSP media source pointing to an RTSP uri. MediaSource mediaSource = new RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri)); // Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. player.prepare();
NAT के पीछे RTSP का इस्तेमाल करना (RTP/TCP के साथ काम करता है)
ExoPlayer, आरटीपी ट्रांसपोर्ट के लिए यूडीपी को डिफ़ॉल्ट प्रोटोकॉल के तौर पर इस्तेमाल करता है.
एनएटी लेयर के पीछे RTSP स्ट्रीम करने पर, ऐसा हो सकता है कि एनएटी, आने वाले आरटीपी/यूडीपी पैकेट को डिवाइस पर फ़ॉरवर्ड न कर पाए. ऐसा तब होता है, जब NAT में ज़रूरी यूडीपी पोर्ट मैपिंग नहीं होती. अगर ExoPlayer को पता चलता है कि कुछ समय से कोई आरटीपी पैकेट नहीं आया है और अब तक प्लेबैक शुरू नहीं हुआ है, तो ExoPlayer मौजूदा RTSP प्लेबैक सेशन को बंद कर देता है. इसके बाद, RTP-over-RTSP का इस्तेमाल करके प्लेबैक को फिर से शुरू करने की कोशिश करता है. इसमें, RTSP के लिए खोले गए टीसीपी कनेक्शन का इस्तेमाल करके आरटीपी पैकेट ट्रांसमिट किए जाते हैं.
टीसीपी से फिर से कोशिश करने के लिए टाइमआउट को, RtspMediaSource.Factory.setTimeoutMs() तरीके को कॉल करके अपनी पसंद के मुताबिक बनाया जा सकता है. उदाहरण के लिए, अगर टाइम आउट चार सेकंड पर सेट है, तो यूडीपी के चार सेकंड तक काम न करने पर, प्लेयर टीसीपी के साथ फिर से कोशिश करेगा.
टाइम आउट सेट करने से, स्ट्रीम के खत्म होने का पता लगाने के लॉजिक पर भी असर पड़ता है. इसका मतलब है कि अगर सेट किए गए टाइम आउट की अवधि तक कोई डेटा नहीं मिलता है, तो ExoPlayer यह रिपोर्ट करेगा कि वीडियो चलाने की प्रोसेस खत्म हो गई है. इस वैल्यू को बहुत कम पर सेट करने से, खराब नेटवर्क की स्थिति में स्ट्रीम के खत्म होने का सिग्नल जल्दी मिल सकता है.
कुछ नेटवर्क सेटअप में, RTP/TCP बेहतर तरीके से काम करता है. RtspMediaSource.Factory.setForceUseRtpTcp() के साथ डिफ़ॉल्ट रूप से RTP/TCP का इस्तेमाल करने के लिए, ExoPlayer को कॉन्फ़िगर किया जा सकता है.
कस्टम SocketFactory पास करना
कस्टम SocketFactory इंस्टेंस तब काम आ सकते हैं, जब किसी खास राउटिंग की ज़रूरत हो. उदाहरण के लिए, जब आरटीएसपी ट्रैफ़िक को किसी खास इंटरफ़ेस से पास करना हो या सॉकेट को कनेक्टिविटी के अतिरिक्त फ़्लैग की ज़रूरत हो.
डिफ़ॉल्ट रूप से, RtspMediaSource रिमोट एंडपॉइंट से कनेक्शन बनाने के लिए, Java की स्टैंडर्ड सॉकेट फ़ैक्ट्री (SocketFactory.getDefault()) का इस्तेमाल करेगा.
RtspMediaSource.Factory.setSocketFactory() का इस्तेमाल करके, इस व्यवहार को बदला जा सकता है.
Kotlin
// Create an RTSP media source pointing to an RTSP uri and override the socket // factory. val mediaSource: MediaSource = RtspMediaSource.Factory() .setSocketFactory(...) .createMediaSource(MediaItem.fromUri(rtspUri))
Java
// Create an RTSP media source pointing to an RTSP uri and override the socket // factory. MediaSource mediaSource = new RtspMediaSource.Factory() .setSocketFactory(...) .createMediaSource(MediaItem.fromUri(rtspUri));