ExoPlayer, लाइव और मांग पर उपलब्ध, दोनों तरह के RTSP के साथ काम करता है. इस्तेमाल किए जा सकने वाले सैंपल फ़ॉर्मैट और नेटवर्क टाइप की सूची यहां दी गई है.
सैंपल के लिए इस्तेमाल किए जा सकने वाले फ़ॉर्मैट
- H264 (डीकोडर को शुरू करने के लिए, एसडीपी मीडिया डिस्क्रिप्शन में fmtp एट्रिब्यूट में एसपीएस/पीपीएस डेटा शामिल होना चाहिए).
- AAC (ADTS बिटरस्ट्रीम के साथ).
- AC3.
इस्तेमाल किए जा सकने वाले नेटवर्क टाइप
- यूडीपी यूनीकास्ट पर आरटीपी (मल्टीकास्ट काम नहीं करता).
- टीसीपी का इस्तेमाल करके, इंटरलीव्ड आरटीएसपी, आरटीपी ओवर आरटीएसपी.
MediaItem का इस्तेमाल करना
RTSP स्ट्रीम चलाने के लिए, आपको RTSP मॉड्यूल का इस्तेमाल करना होगा.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.5.0")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.5.0"
इसके बाद, किसी आरटीएसपी यूआरआई के लिए 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 पुष्टि की सुविधा के साथ वीडियो चलाने की सुविधा देता है. सुरक्षित आरटीएसपी कॉन्टेंट चलाने के लिए, MediaItem
के यूआरआई को पुष्टि करने की जानकारी के साथ कॉन्फ़िगर किया जाना चाहिए. खास तौर पर, यूआरआई का फ़ॉर्मैट rtsp://<username>:<password>@<host address>
होना चाहिए.
RtspMediaSource का इस्तेमाल करना
पसंद के मुताबिक बनाने के ज़्यादा विकल्पों के लिए, RtspMediaSource
बनाएं और उसे MediaItem
के बजाय सीधे प्लेयर को पास करें.
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, आरटीपी ट्रांसपोर्ट के लिए डिफ़ॉल्ट प्रोटोकॉल के तौर पर यूडीपी का इस्तेमाल करता है.
NAT लेयर के पीछे RTSP स्ट्रीमिंग करते समय, हो सकता है कि NAT, डिवाइस पर आने वाले RTP/UDP पैकेट को फ़ॉरवर्ड न कर पाए. ऐसा तब होता है, जब एनएटी में ज़रूरी यूडीपी पोर्ट मैपिंग मौजूद न हो. अगर ExoPlayer को पता चलता है कि कुछ समय से RTP पैकेट नहीं आ रहे हैं और प्लेबैक शुरू नहीं हुआ है, तो ExoPlayer मौजूदा RTSP प्लेबैक सेशन को बंद कर देता है. इसके बाद, RTP-over-RTSP का इस्तेमाल करके प्लेबैक फिर से शुरू करता है. RTP-over-RTSP में, RTSP के लिए खोले गए टीसीपी कनेक्शन का इस्तेमाल करके RTP पैकेट ट्रांसमिट किए जाते हैं.
RtspMediaSource.Factory.setTimeoutMs()
तरीके को कॉल करके, टीसीपी के साथ फिर से कोशिश करने के लिए टाइम आउट को पसंद के मुताबिक बनाया जा सकता है. उदाहरण के लिए, अगर टाइम आउट चार सेकंड पर सेट है, तो UDP पर कोई गतिविधि न होने पर, चार सेकंड बाद प्लेयर टीसीपी के साथ फिर से कोशिश करेगा.
टाइम आउट सेट करने पर, स्ट्रीम खत्म होने का पता लगाने के लॉजिक पर भी असर पड़ता है. इसका मतलब है कि अगर सेट किए गए टाइम आउट के दौरान कोई डेटा नहीं मिलता है, तो 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));