يتوافق ExoPlayer مع بروتوكول RTSP للمحتوى المباشر والمسجّل. في ما يلي قائمة بتنسيقات العيّنات وأنواع الشبكات المتوافقة.
تنسيقات العيّنات المتوافقة
- H264 (يجب أن يتضمّن وصف وسائط بروتوكول وصف الجلسة بيانات SPS/PPS في السمة fmtp لتهيئة برنامج الترميز).
- الترميز المتقدّم للصوت (مع بث بتات ADTS)
- AC3.
أنواع الشبكات المتوافقة
- بروتوكول RTP عبر بث أحادي UDP (لا يتوفّر البث المتعدد).
- بروتوكول RTSP المتداخل، وبروتوكول RTP عبر RTSP باستخدام TCP
استخدام MediaItem
لتشغيل بث RTSP، عليك الاعتماد على وحدة RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.7.1")
Groovy
implementation "androidx.media3:media3-exoplayer-rtsp:1.7.1"
يمكنك بعد ذلك إنشاء MediaItem
لعنوان URI الخاص ببروتوكول RTSP وتمريره إلى المشغّل.
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()
Java
// 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 محمي، يجب ضبط معرّف الموارد المنتظم (URI) الخاص بـ MediaItem
باستخدام معلومات المصادقة. وبشكل خاص، يجب أن يكون معرّف الموارد المنتظم بالتنسيق 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()
Java
// 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();
استخدام RTSP خلف NAT (دعم RTP/TCP)
يستخدم ExoPlayer بروتوكول UDP كبروتوكول تلقائي لنقل بروتوكول النقل في الوقت الفعلي (RTP).
عند بث RTSP خلف طبقة NAT، قد لا تتمكّن NAT من إعادة توجيه حِزم RTP/UDP الواردة إلى الجهاز. يحدث ذلك إذا لم تتضمّن ترجمة عناوين الشبكة (NAT) عملية ربط منافذ UDP اللازمة. إذا رصد ExoPlayer عدم تلقّي حِزم RTP واردة لفترة من الوقت ولم يبدأ التشغيل بعد، سيوقف ExoPlayer جلسة تشغيل RTSP الحالية، وسيعيد محاولة التشغيل باستخدام RTP عبر RTSP (أي إرسال حِزم RTP باستخدام اتصال TCP الذي تم فتحه لبروتوكول RTSP).
يمكن تخصيص المهلة لإعادة المحاولة باستخدام TCP من خلال استدعاء الطريقة
RtspMediaSource.Factory.setTimeoutMs()
. على سبيل المثال، إذا تم ضبط المهلة على أربع ثوانٍ، سيعيد اللاعب المحاولة باستخدام TCP بعد أربع ثوانٍ من عدم النشاط في UDP.
يؤثّر ضبط المهلة أيضًا في منطق رصد نهاية البث. وهذا يعني أنّ ExoPlayer سيُبلغ عن انتهاء التشغيل إذا لم يتم تلقّي أي بيانات خلال مدة المهلة المحدّدة. قد يؤدي ضبط هذه القيمة على قيمة صغيرة جدًا إلى إرسال إشارة مبكرة بانتهاء البث في حال ضعف الشبكة.
يوفر بروتوكول RTP/TCP توافقًا أفضل في بعض إعدادات الشبكة. يمكنك ضبط ExoPlayer لاستخدام RTP/TCP تلقائيًا باستخدام RtspMediaSource.Factory.setForceUseRtpTcp()
.
تمرير 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(...) .createMediaSource(MediaItem.fromUri(rtspUri))
Java
// 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));