ExoPlayer-এ লাইভ ও অন-ডিমান্ড RTSP, দু'টিই কাজ করে। কাজ করে এমন স্যাম্পেল ফরম্যাট ও নেটওয়ার্কের ধরন নিচে তালিকাভুক্ত করা হল।
কাজ করে এমন স্যাম্পেল ফর্ম্যাট
- H264 (ডিকোডার শুরু করার জন্য SDP মিডিয়া বিবরণে fmtp অ্যাট্রিবিউটে SPS/PPS ডেটা থাকতে হবে)।
- AAC (ADTS বিটস্ট্রিম সহ)।
- AC3.
যেসব নেটওয়ার্কের ধরন কাজ করে
- UDP ইউনিকাস্টের মাধ্যমে RTP (মাল্টিকাস্ট কাজ করে না)।
- ইন্টারলিভড RTSP, TCP ব্যবহার করে RTSP-এর মাধ্যমে RTP।
MediaItem ব্যবহার করা
RTSP স্ট্রিম চালাতে, আপনাকে RTSP মডিউলের উপর নির্ভর করতে হবে।
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.11.1")
গ্ৰুভি
implementation "androidx.media3:media3-exoplayer-rtsp:1.11.1"
আপনি RTSP URI-এর জন্য 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()
জাভা
// 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 ব্যবহার করা হচ্ছে
আরও কাস্টমাইজেশন বিকল্পের জন্য, আপনি একটি 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()
জাভা
// 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-over-RTSP (RTSP-এর জন্য খোলা TCP কানেকশন ব্যবহার করে RTP প্যাকেট ট্রান্সমিট করা) ব্যবহার করে প্লেব্যাক আবার চেষ্টা করে।
TCP-এর মাধ্যমে আবার চেষ্টা করার টাইমআউট
RtspMediaSource.Factory.setTimeoutMs() পদ্ধতি কল করে কাস্টমাইজ করা যেতে পারে। যেমন, টাইমআউট চার সেকেন্ডে সেট করা থাকলে, চার সেকেন্ড UDP ইনঅ্যাক্টিভিটির পরে প্লেয়ার TCP-এর মাধ্যমে আবার চেষ্টা করবে।
টাইম-আউট সেট করলে তা এন্ড-অফ-স্ট্রিম শনাক্তকরণ লজিককেও প্রভাবিত করে। অর্থাৎ, সেট করা টাইমআউটের সময়সীমার মধ্যে কিছু না পেলে, ExoPlayer রিপোর্ট করবে যে প্লেব্যাক শেষ হয়ে গেছে। এই ভ্যালু খুব কম সেট করলে, নেটওয়ার্ক কানেকশন খারাপ থাকলে, স্ট্রিম শেষ হওয়ার সিগন্যাল তাড়াতাড়ি দেখা যেতে পারে।
কিছু নেটওয়ার্ক সেট-আপের ক্ষেত্রে RTP/TCP আরও ভাল কম্প্যাটিবিলিটি অফার করে। আপনি
RtspMediaSource.Factory.setForceUseRtpTcp()-এর মাধ্যমে ডিফল্ট হিসেবে RTP/TCP ব্যবহার করার জন্য 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))
জাভা
// 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));