আরটিএসপি

এক্সোপ্লেয়ার লাইভ এবং অন ডিমান্ড RTSP উভয়কেই সমর্থন করে। সমর্থিত নমুনা ফর্ম্যাট এবং নেটওয়ার্ক প্রকারগুলি নীচে তালিকাভুক্ত করা হয়েছে।

সমর্থিত নমুনা বিন্যাস

  • H264 (ডিকোডার ইনিশিয়ালাইজেশনের জন্য fmtp অ্যাট্রিবিউটে SDP মিডিয়া বর্ণনায় SPS/PPS ডেটা অন্তর্ভুক্ত থাকতে হবে)।
  • AAC (ADTS বিটস্ট্রিম সহ)।
  • এসি৩।

সমর্থিত নেটওয়ার্কের ধরণ

  • UDP ইউনিকাস্টের উপর RTP (মাল্টিকাস্ট সমর্থিত নয়)।
  • TCP ব্যবহার করে RTSP-এর উপর ইন্টারলিভড RTSP, RTP।

মিডিয়াআইটিম ব্যবহার করা

একটি RTSP স্ট্রিম চালানোর জন্য, আপনাকে RTSP মডিউলের উপর নির্ভর করতে হবে।

কোটলিন

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

খাঁজকাটা

implementation "androidx.media3:media3-exoplayer-rtsp:1.8.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 ব্যবহার করা হচ্ছে

আরও কাস্টমাইজেশন বিকল্পের জন্য, আপনি একটি RtspMediaSource তৈরি করতে পারেন এবং MediaItem এর পরিবর্তে সরাসরি প্লেয়ারে পাঠাতে পারেন।

কোটলিন

// 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 পরিবহনের জন্য ডিফল্ট প্রোটোকল হিসেবে UDP ব্যবহার করে।

NAT লেয়ারের পিছনে RTSP স্ট্রিম করার সময়, NAT ইনকামিং RTP/UDP প্যাকেটগুলি ডিভাইসে ফরোয়ার্ড করতে সক্ষম নাও হতে পারে। NAT-তে প্রয়োজনীয় UDP পোর্ট ম্যাপিংয়ের অভাব থাকলে এটি ঘটে। যদি ExoPlayer সনাক্ত করে যে কিছুক্ষণ ধরে ইনকামিং RTP প্যাকেটগুলি আসেনি এবং প্লেব্যাক এখনও শুরু হয়নি, তাহলে ExoPlayer বর্তমান RTSP প্লেব্যাক সেশনটি ভেঙে দেয় এবং RTP-over-RTSP (RTSP-এর জন্য খোলা TCP সংযোগ ব্যবহার করে RTP প্যাকেটগুলি প্রেরণ করে) ব্যবহার করে পুনরায় প্লেব্যাক চেষ্টা করে।

TCP দিয়ে পুনরায় চেষ্টা করার সময়সীমা RtspMediaSource.Factory.setTimeoutMs() পদ্ধতিটি কল করে কাস্টমাইজ করা যেতে পারে। উদাহরণস্বরূপ, যদি টাইমআউট চার সেকেন্ডে সেট করা থাকে, তাহলে প্লেয়ারটি চার সেকেন্ড UDP নিষ্ক্রিয়তার পরে TCP দিয়ে পুনরায় চেষ্টা করবে।

টাইমআউট সেট করলে স্ট্রিম-এর শেষ সনাক্তকরণ লজিকও প্রভাবিত হয়। অর্থাৎ, যদি সেট টাইমআউটের সময়কালের জন্য কিছু না পাওয়া যায় তবে এক্সোপ্লেয়ার প্লেব্যাক শেষ হয়েছে বলে রিপোর্ট করবে। এই মানটি খুব কম সেট করলে খারাপ নেটওয়ার্ক পরিস্থিতিতে স্ট্রিম-এর শেষ সংকেত তাড়াতাড়ি আসতে পারে।

কিছু নেটওয়ার্ক সেটআপের অধীনে RTP/TCP আরও ভালো সামঞ্জস্যতা প্রদান করে। আপনি RtspMediaSource.Factory.setForceUseRtpTcp() দিয়ে ডিফল্টরূপে RTP/TCP ব্যবহার করার জন্য ExoPlayer কনফিগার করতে পারেন।

একটি কাস্টম সকেটফ্যাক্টরি পাস করা হচ্ছে

যখন নির্দিষ্ট রাউটিং প্রয়োজন হয় (উদাহরণস্বরূপ, যখন RTSP ট্র্যাফিককে একটি নির্দিষ্ট ইন্টারফেস অতিক্রম করতে হয়, অথবা সকেটের অতিরিক্ত সংযোগ পতাকার প্রয়োজন হয়) তখন কাস্টম SocketFactory ইনস্ট্যান্সগুলি কার্যকর হতে পারে।

ডিফল্টরূপে, 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(...)
    .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(...)
        .createMediaSource(MediaItem.fromUri(rtspUri));