RTSP

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

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

  • H264 (يجب أن يشتمل وصف وسائط SDP على بيانات SPS/PPS في السمة fmtp لإعداد برنامج فك الترميز).
  • AAC (مع بث بت ADTS)
  • AC3.

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

  • البث الأحادي عبر بروتوكول RTP عبر UDP (البث المتعدد غير متاح).
  • بروتوكول RTSP، أو بروتوكول RTP، عبر بروتوكول RTSP باستخدام بروتوكول التحكم في الإرسال.

استخدام 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 مع دعم بروتوكول ترجمة عنوان الشبكة (RTP/TCP)

يستخدم ExoPlayer بروتوكول UDP كبروتوكول افتراضي لنقل البيانات في الوقت الفعلي.

عند بث بروتوكول RTSP خلف طبقة ترجمة عنوان الشبكة، قد لا تتمكن آلية NAT من إعادة توجيه حزم RTP/UDP الواردة إلى الجهاز. يحدث هذا إذا كانت ترجمة عنوان الشبكة تفتقر إلى تخطيط منفذ UDP اللازم. إذا اكتشف ExoPlayer عدم وجود حزم RTP واردة منذ فترة ولم يبدأ التشغيل بعد، يوقف ExoPlayer جلسة التشغيل الحالية عبر RTSP ويعيد محاولة التشغيل باستخدام بروتوكول RTP-over-RTSP (نقل حزم RTP باستخدام اتصال بروتوكول التحكم بالنقل المفتوح "RTSP").

يمكن تخصيص مهلة إعادة المحاولة باستخدام بروتوكول التحكم بالنقل من خلال استدعاء الطريقة RtspMediaSource.Factory.setTimeoutMs(). على سبيل المثال، إذا تم ضبط المهلة على أربع ثوانٍ، سيعيد المشغّل المحاولة باستخدام بروتوكول TCP بعد أربع ثوانٍ من توقف نشاط UDP.

ويؤثر ضبط المهلة أيضًا في منطق رصد نهاية البث. وهذا يعني أنّ ExoPlayer سيبلغ عن انتهاء التشغيل في حال عدم تلقّي أي إشعارات خلال المدة المحدّدة. وقد يؤدي ضبط هذه القيمة على قيمة صغيرة جدًا إلى تلقّي إشارة نهاية البث المباشر في ظل ظروف سيئة للشبكة.

يوفر RTP/TCP توافقًا أفضل ضمن بعض عمليات إعداد الشبكة. يمكنك ضبط ExoPlayer لاستخدام بروتوكول RTP/TCP تلقائيًا مع RtspMediaSource.Factory.setForceUseRtpTcp().

اجتياز اختبار Socket تعذر مخصص

يمكن أن تكون مثيلات 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));