ExoPlayer লাইভ এবং অন ডিমান্ড RTSP সমর্থন করে। সমর্থিত নমুনা বিন্যাস এবং নেটওয়ার্ক প্রকারগুলি নীচে তালিকাভুক্ত করা হয়েছে৷
সমর্থিত নমুনা বিন্যাস
- H264 (ডিকোডার ইনিশিয়ালাইজেশনের জন্য এফএমটিপি অ্যাট্রিবিউটে এসডিপি মিডিয়া বিবরণে অবশ্যই এসপিএস/পিপিএস ডেটা অন্তর্ভুক্ত করতে হবে)।
- AAC (ADTS বিটস্ট্রিম সহ)।
- AC3.
সমর্থিত নেটওয়ার্ক প্রকার
- UDP ইউনিকাস্টের উপর RTP (মাল্টিকাস্ট সমর্থিত নয়)।
- ইন্টারলিভড RTSP, TCP ব্যবহার করে RTSP এর উপর RTP।
MediaItem ব্যবহার করে
একটি RTSP স্ট্রিম চালাতে, আপনাকে RTSP মডিউলের উপর নির্ভর করতে হবে।
কোটলিন
implementation("androidx.media3:media3-exoplayer-rtsp:1.5.0")
গ্রোভি
implementation "androidx.media3:media3-exoplayer-rtsp:1.5.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 সমর্থন)
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
দৃষ্টান্তগুলি কার্যকর হতে পারে যখন নির্দিষ্ট রাউটিং প্রয়োজন হয় (উদাহরণস্বরূপ, যখন 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(...) .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));
ExoPlayer লাইভ এবং অন ডিমান্ড RTSP সমর্থন করে। সমর্থিত নমুনা বিন্যাস এবং নেটওয়ার্ক প্রকারগুলি নীচে তালিকাভুক্ত করা হয়েছে৷
সমর্থিত নমুনা বিন্যাস
- H264 (ডিকোডার ইনিশিয়ালাইজেশনের জন্য এফএমটিপি অ্যাট্রিবিউটে এসডিপি মিডিয়া বিবরণে অবশ্যই এসপিএস/পিপিএস ডেটা অন্তর্ভুক্ত করতে হবে)।
- AAC (ADTS বিটস্ট্রিম সহ)।
- AC3.
সমর্থিত নেটওয়ার্ক প্রকার
- UDP ইউনিকাস্টের উপর RTP (মাল্টিকাস্ট সমর্থিত নয়)।
- ইন্টারলিভড RTSP, TCP ব্যবহার করে RTSP এর উপর RTP।
MediaItem ব্যবহার করে
একটি RTSP স্ট্রিম চালাতে, আপনাকে RTSP মডিউলের উপর নির্ভর করতে হবে।
কোটলিন
implementation("androidx.media3:media3-exoplayer-rtsp:1.5.0")
গ্রোভি
implementation "androidx.media3:media3-exoplayer-rtsp:1.5.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 সমর্থন)
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
দৃষ্টান্তগুলি কার্যকর হতে পারে যখন নির্দিষ্ট রাউটিং প্রয়োজন হয় (উদাহরণস্বরূপ, যখন 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(...) .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));