आरटीएसपी

ExoPlayer, लाइव और मांग पर उपलब्ध RTSP, दोनों के साथ काम करता है. यहां दिए गए सैंपल फ़ॉर्मैट और नेटवर्क टाइप इस्तेमाल किए जा सकते हैं.

नमूने के लिए इस्तेमाल किए जा सकने वाले फ़ॉर्मैट

  • H264 (एसडीपी मीडिया की जानकारी में, डिकोडर को शुरू करने के लिए fmtp एट्रिब्यूट में SPS/PPS डेटा शामिल होना चाहिए).
  • AAC (ADTS बिटस्ट्रीम के साथ).
  • AC3.

इस्तेमाल किए जा सकने वाले नेटवर्क टाइप

  • यूडीपी यूनिकास्ट पर आरटीपी (मल्टीकास्ट काम नहीं करता).
  • इंटरलीव्ड आरटीएसपी, टीसीपी का इस्तेमाल करके आरटीएसपी पर आरटीपी.

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

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

Kotlin

implementation("androidx.media3:media3-exoplayer-rtsp:1.11.1")

Groovy

implementation "androidx.media3:media3-exoplayer-rtsp:1.11.1"

इसके बाद, 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 का इस्तेमाल करना

कस्टम बनाने के ज़्यादा विकल्पों के लिए, 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, आरटीपी ट्रांसपोर्ट के लिए यूडीपी को डिफ़ॉल्ट प्रोटोकॉल के तौर पर इस्तेमाल करता है.

एनएटी लेयर के पीछे RTSP स्ट्रीम करने पर, ऐसा हो सकता है कि एनएटी, आने वाले आरटीपी/यूडीपी पैकेट को डिवाइस पर फ़ॉरवर्ड न कर पाए. ऐसा तब होता है, जब NAT में ज़रूरी यूडीपी पोर्ट मैपिंग नहीं होती. अगर ExoPlayer को पता चलता है कि कुछ समय से आरटीपी पैकेट नहीं आ रहे हैं और अब तक प्लेबैक शुरू नहीं हुआ है, तो ExoPlayer मौजूदा RTSP प्लेबैक सेशन को बंद कर देता है. इसके बाद, आरटीपी-ओवर-आरटीएसपी का इस्तेमाल करके प्लेबैक को फिर से शुरू करने की कोशिश करता है. आरटीपी-ओवर-आरटीएसपी का मतलब है कि RTSP के लिए खोले गए टीसीपी कनेक्शन का इस्तेमाल करके आरटीपी पैकेट ट्रांसमिट करना.

टीसीपी का इस्तेमाल करके फिर से कोशिश करने के लिए टाइमआउट को, RtspMediaSource.Factory.setTimeoutMs() तरीके को कॉल करके अपनी पसंद के मुताबिक बनाया जा सकता है. उदाहरण के लिए, अगर टाइमआउट चार सेकंड पर सेट है, तो प्लेयर चार सेकंड तक यूडीपी का इस्तेमाल न होने पर, टीसीपी का इस्तेमाल करके फिर से कोशिश करेगा.

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

कुछ नेटवर्क सेटअप में, आरटीपी/टीसीपी बेहतर तरीके से काम करता है. RtspMediaSource.Factory.setForceUseRtpTcp() की मदद से, 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(socketFactory)
    .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(socketFactory)
        .createMediaSource(MediaItem.fromUri(rtspUri));