आरटीएसपी

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

अपनी पसंद के मुताबिक बनाने के ज़्यादा विकल्पों के लिए, 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();

एनएटी के पीछे RTSP का इस्तेमाल करना (आरटीपी/टीसीपी के साथ काम करता है)

ExoPlayer, आरटीपी ट्रांसपोर्ट के लिए यूडीपी को डिफ़ॉल्ट प्रोटोकॉल के तौर पर इस्तेमाल करता है.

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

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

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

कुछ नेटवर्क सेटअप में, आरटीपी/टीसीपी बेहतर तरीके से काम करता है. 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));