يتوافق 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
لعنوان URL لبروتوكول 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
باستخدام
معلومات المصادقة. وعلى وجه التحديد، يجب أن يكون عنوان URL على النحو التالي:
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));