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

Groovy

implementation "androidx.media3:media3-exoplayer-rtsp:1.4.0"

يمكنك بعد ذلك إنشاء 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 محمي، يجب ضبط عنوان URL الخاص بـ 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 خلف طبقة ترجمة عنوان الشبكة، قد لا تتمكن ترجمة عنوان الشبكة من إعادة توجيه حزم RTP/UDP الواردة إلى الجهاز. يحدث هذا إذا كانت ترجمة عنوان الشبكة تفتقر إلى تعيين منفذ UDP الضروري. في حال اكتشاف ExoPlayer عدم وجود أي إشعارات واردة حزم RTP لفترة من الوقت ولم يبدأ التشغيل بعد، ويفكك ExoPlayer إيقاف جلسة تشغيل بروتوكول RTSP الحالية، وإعادة محاولة التشغيل باستخدام بروتوكول RTP-over-RTSP. (إرسال حزم RTP باستخدام اتصال TCP المفتوح لبروتوكول 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));