RTSP

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();

যাচাইকরণ

RTSP BASIC ও DIGEST যাচাইকরণের মাধ্যমে ExoPlayer প্লেব্যাক কাজ করে। সুরক্ষিত 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 কাজ করে)

RTP ট্রান্সপোর্টের জন্য ExoPlayer ডিফল্ট প্রোটোকল হিসেবে 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));