يتوافق ExoPlayer مع بروتوكول RTSP المباشر والمسجَّل. في ما يلي تنسيقات النماذج وأنواع الشبكات المتوافقة.
تنسيقات النماذج المتوافقة
- H264 (يجب أن يتضمّن وصف الوسائط في بروتوكول SDP بيانات SPS/PPS في سمة fmtp لتهيئة برنامج فك الترميز).
- AAC (مع دفق بت ADTS).
- AC3
أنواع الشبكات المتوافقة
- بروتوكول RTP عبر بروتوكول UDP أحادي الإرسال (لا يتوافق مع بروتوكول UDP متعدد الإرسال).
- بروتوكول RTSP المتداخل، وبروتوكول RTP عبر بروتوكول RTSP باستخدام بروتوكول TCP.
استخدام MediaItem
لتشغيل بث RTSP، يجب الاعتماد على وحدة RTSP.
Kotlin
implementation("androidx.media3:media3-exoplayer-rtsp:1.10.0")
أنيق
implementation "androidx.media3:media3-exoplayer-rtsp:1.10.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 المحمي، يجب ضبط معرّف الموارد المنتظم (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 عبر بروتوكول 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));