आरटीएसपी

ExoPlayer, लाइव और ऑन-डिमांड, दोनों तरह के RTSP को सपोर्ट करता है. सैंपल के लिए काम करने वाले फ़ॉर्मैट और नेटवर्क के टाइप की सूची यहां दी गई है.

सैंपल के लिए काम करने वाले फ़ॉर्मैट

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

नेटवर्क के ऐसे टाइप जिनका इस्तेमाल किया जा सकता है

  • यूडीपी यूनिकास्ट पर आरटीपी (मल्टीकास्ट की सुविधा उपलब्ध नहीं है).
  • इंटरलीव्ड RTSP, टीसीपी का इस्तेमाल करके RTSP पर आरटीपी.

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

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

Kotlin

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

शानदार

implementation "androidx.media3:media3-exoplayer-rtsp:1.10.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, आरटीपी ट्रांसफ़र के लिए डिफ़ॉल्ट प्रोटोकॉल के तौर पर यूडीपी का इस्तेमाल करता है.

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

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

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

कुछ नेटवर्क सेटअप में, आरटीपी/टीसीपी बेहतर तरीके से काम करता है. RtspMediaSource.Factory.setForceUseRtpTcp() की मदद से, ExoPlayer को डिफ़ॉल्ट रूप से आरटीपी/टीसीपी का इस्तेमाल करने के लिए कॉन्फ़िगर किया जा सकता है.

पसंद के मुताबिक SocketFactory को पास करना

SocketFactory के पसंद के मुताबिक बनाए गए इंस्टेंस तब काम के हो सकते हैं, जब किसी खास राउटिंग की ज़रूरत हो. उदाहरण के लिए, जब RTSP ट्रैफ़िक को किसी खास इंटरफ़ेस से पास करना हो या सॉकेट को कनेक्टिविटी के अतिरिक्त फ़्लैग की ज़रूरत हो.

डिफ़ॉल्ट रूप से, 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));