RTSP

يتوافق ExoPlayer مع بروتوكول RTSP للبث المباشر والمسجّل. في ما يلي نماذج التنسيقات وأنواع الشبكات المتاحة.

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

  • ‫H264 (يجب أن يتضمّن وصف وسائط SDP بيانات SPS/PPS في سمة fmtp لبدء تشغيل وحدة الترميز)
  • الترميز المتقدّم للصوت (مع بث ADTS)
  • ‫AC3

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

  • بروتوكول RTP عبر بروتوكول UDP للبث المباشر إلى مستخدم واحد (لا يتوفّر البث المتعدد)
  • ‫RTSP وRTP المُدرَجَين على بروتوكول RTSP باستخدام بروتوكول TCP

استخدام MediaItem

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

Kotlin

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

رائع

implementation "androidx.media3:media3-exoplayer-rtsp:1.4.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 من خلال شبكة تحويل عنوان (مع دعم بروتوكولَي 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));