এক্সো প্লেয়ার লাইভ এবং অন-ডিমান্ড উভয় প্রকার আরটিএসপি সমর্থন করে। সমর্থিত স্যাম্পল ফরম্যাট এবং নেটওয়ার্কের ধরন নিচে তালিকাভুক্ত করা হলো।
সমর্থিত নমুনা ফর্ম্যাট
- H264 (ডিকোডার প্রারম্ভিককরণের জন্য SDP মিডিয়া বিবরণে fmtp অ্যাট্রিবিউটে অবশ্যই SPS/PPS ডেটা অন্তর্ভুক্ত থাকতে হবে)।
- AAC (ADTS বিটস্ট্রিম সহ)।
- এসি৩।
সমর্থিত নেটওয়ার্কের প্রকারভেদ
- ইউডিপি ইউনিকাস্টের মাধ্যমে আরটিপি (মাল্টিকাস্ট সমর্থিত নয়)।
- ইন্টারলিভড আরটিএসপি, টিসিপি ব্যবহার করে আরটিএসপি-র উপর আরটিপি।
মিডিয়াআইটেম ব্যবহার করে
একটি RTSP স্ট্রিম চালাতে হলে, আপনাকে RTSP মডিউলটির উপর নির্ভর করতে হবে।
কোটলিন
implementation("androidx.media3:media3-exoplayer-rtsp:1.10.0")
গ্রুভি
implementation "androidx.media3:media3-exoplayer-rtsp:1.10.0"
এরপর আপনি একটি RTSP URI-এর জন্য একটি MediaItem তৈরি করে সেটি প্লেয়ারে পাঠাতে পারবেন।
কোটলিন
// 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()
জাভা
// 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 এর URI অবশ্যই অথেনটিকেশন তথ্য দিয়ে কনফিগার করতে হবে। বিশেষত, URI-টি rtsp://<username>:<password>@<host address> এই ফর্ম্যাটের হওয়া উচিত।
RtspMediaSource ব্যবহার করে
আরও কাস্টমাইজেশন বিকল্পের জন্য, আপনি একটি MediaItem এর পরিবর্তে একটি RtspMediaSource তৈরি করে সরাসরি প্লেয়ারে পাঠাতে পারেন।
কোটলিন
// 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()
জাভা
// 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 RTP ট্রান্সপোর্টের জন্য ডিফল্ট প্রোটোকল হিসেবে UDP ব্যবহার করে।
NAT লেয়ারের পিছনে RTSP স্ট্রিমিং করার সময়, NAT হয়তো আগত RTP/UDP প্যাকেটগুলোকে ডিভাইসে ফরওয়ার্ড করতে পারে না। এমনটা ঘটে যদি NAT-এর প্রয়োজনীয় UDP পোর্ট ম্যাপিং না থাকে। যদি ExoPlayer শনাক্ত করে যে বেশ কিছুক্ষণ ধরে কোনো RTP প্যাকেট আসেনি এবং প্লেব্যাকও এখনো শুরু হয়নি, তবে ExoPlayer বর্তমান RTSP প্লেব্যাক সেশনটি বন্ধ করে দেয় এবং RTP-ওভার-RTSP ব্যবহার করে প্লেব্যাক পুনরায় চেষ্টা করে (RTSP-এর জন্য খোলা TCP কানেকশন ব্যবহার করে RTP প্যাকেট প্রেরণ করে)।
RtspMediaSource.Factory.setTimeoutMs() মেথডটি কল করে TCP দিয়ে পুনরায় চেষ্টা করার টাইমআউট কাস্টমাইজ করা যায়। উদাহরণস্বরূপ, যদি টাইমআউট চার সেকেন্ডে সেট করা হয়, তাহলে চার সেকেন্ড ধরে UDP নিষ্ক্রিয় থাকার পর প্লেয়ারটি TCP দিয়ে পুনরায় চেষ্টা করবে।
টাইমআউট সেট করা স্ট্রিম শেষ হওয়ার শনাক্তকরণ লজিককেও প্রভাবিত করে। অর্থাৎ, সেট করা টাইমআউটের সময়কালে যদি কিছু গ্রহণ করা না হয়, তাহলে ExoPlayer প্লেব্যাক শেষ হয়ে গেছে বলে রিপোর্ট করবে। এই মান খুব কম সেট করলে দুর্বল নেটওয়ার্ক পরিস্থিতিতে সময়ের আগেই স্ট্রিম শেষ হওয়ার সংকেত পাওয়া যেতে পারে।
কিছু নেটওয়ার্ক সেটআপে RTP/TCP আরও ভালো সামঞ্জস্য প্রদান করে। আপনি RtspMediaSource.Factory.setForceUseRtpTcp() ব্যবহার করে ExoPlayer-কে ডিফল্টভাবে RTP/TCP ব্যবহার করার জন্য কনফিগার করতে পারেন।
একটি কাস্টম সকেটফ্যাক্টরি পাস করা
কাস্টম SocketFactory ইনস্ট্যান্সগুলো তখন কার্যকর হতে পারে যখন নির্দিষ্ট রাউটিংয়ের প্রয়োজন হয় (উদাহরণস্বরূপ, যখন RTSP ট্র্যাফিককে একটি নির্দিষ্ট ইন্টারফেসের মধ্য দিয়ে যেতে হয়, অথবা সকেটের অতিরিক্ত কানেক্টিভিটি ফ্ল্যাগ প্রয়োজন হয়)।
ডিফল্টরূপে, RtspMediaSource রিমোট এন্ডপয়েন্টগুলোর সাথে সংযোগ তৈরি করতে জাভার স্ট্যান্ডার্ড সকেট ফ্যাক্টরি ( SocketFactory.getDefault() ) ব্যবহার করে। RtspMediaSource.Factory.setSocketFactory() ব্যবহার করে এই আচরণটি পরিবর্তন করা যেতে পারে।
কোটলিন
// 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))
জাভা
// 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));