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.3.1")

رائع

implementation "androidx.media3:media3-exoplayer-rtsp:1.3.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 الواردة إلى الجهاز. يحدث هذا إذا كانت ترجمة عنوان الشبكة تفتقر إلى تخطيط منفذ 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().

المرور بمصنع Socketنبات مخصص

يمكن أن تكون مثيلات SocketFactory المخصّصة مفيدة عندما يكون توجيه معيّن مطلوبًا (على سبيل المثال، عندما تحتاج حركة مرور بيانات RTSP إلى تمرير واجهة محددة أو عندما يحتاج المقبس إلى علامات اتصال إضافية).

سيستخدم RtspMediaSource تلقائيًا مصنع المقبس العادي (SocketFactory.getDefault()) في Java لإنشاء اتصالات بنقاط النهاية البعيدة. يمكن إلغاء هذا السلوك باستخدام 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));