RTSP

يتيح ExoPlayer استخدام بروتوكول RTSP للبث المباشر وعند الطلب. في ما يلي قائمة بتنسيقات العيّنات وأنواع الشبكات المتوافقة.

تنسيقات النماذج المتوافقة

  • ‫H264 (يجب أن يتضمّن وصف وسائط SDP بيانات SPS/PPS في سمة fmtp لتهيئة برنامج فك الترميز)
  • ‫AAC (مع تدفق بتات ADTS)
  • AC3.

أنواع الشبكات المتوافقة

  • بروتوكول RTP عبر بث UDP أحادي الوجهة (البث المتعدّد الوجهات غير متاح)
  • ‫RTSP متداخل، وRTP عبر RTSP باستخدام TCP

استخدام MediaItem

لتشغيل بث RTSP، يجب الاعتماد على وحدة RTSP.

Kotlin

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

أنيق

implementation "androidx.media3:media3-exoplayer-rtsp:1.11.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 باستخدام معلومات المصادقة. على وجه التحديد، يجب أن يكون معرّف الموارد المنتظم (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()

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-over-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(socketFactory)
    .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(socketFactory)
        .createMediaSource(MediaItem.fromUri(rtspUri));