RTSP

‫ExoPlayer از RTSP زنده و درصورت درخواست پشتیبانی می‌کند. قالب‌های نمونه پشتیبانی‌شده و انواع شبکه در زیر فهرست شده‌اند.

قالب‌های نمونه پشتیبانی‌شده

  • H264 (توضیحات رسانه SDP باید شامل داده‌های SPS/PPS در ویژگی fmtp برای مقداردهی اولیه کدبند باشد).
  • AAC (با ADTS bitstream).
  • AC3.

انواع شبکه پشتیبانی‌شده

  • ‫RTP ازطریق تک‌پخش UDP (از چندپخش پشتیبانی نمی‌شود).
  • RTSP درهم‌آمیخته، RTP روی RTSP بااستفاده از TCP.

درحال استفاده از MediaItem

برای پخش جاری‌سازی RTSP، باید به واحد RTSP وابسته باشید.

کاتلین

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

شیک

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

سپس می‌توانید MediaItem را برای نشانی وب RTSP ایجاد کنید و آن را به پخش‌کننده منتقل کنید.

کاتلین

// 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()

جاوا

// 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 محافظت‌شده، نشانی وب MediaItem باید با اطلاعات اصالت‌سنجی پیکربندی شود. به‌طور دقیق، نشانی وب باید به‌شکل rtsp://<username>:<password>@<host address> باشد.

استفاده از RtspMediaSource

برای گزینه‌های سفارشی‌سازی بیشتر، می‌توانید RtspMediaSource ایجاد کنید و آن را به‌جای MediaItem مستقیماً به پخش‌کننده ارسال کنید.

کاتلین

// 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()

جاوا

// 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-over-RTSP (انتقال بسته‌های RTP بااستفاده از اتصال TCP بازشده برای RTSP) دوباره امتحان می‌کند.

با فراخوانی روش RtspMediaSource.Factory.setTimeoutMs()، می‌توان زمان اتمام برای تلاش مجدد با TCP را سفارشی‌سازی کرد. برای مثال، اگر زمان اتمام به چهار ثانیه تنظیم شده باشد، پخش‌کننده پس‌از چهار ثانیه عدم فعالیت UDP، با TCP دوباره تلاش خواهد کرد.

تنظیم زمان اتمام بر منطق تشخیص پایان جاری‌سازی نیز تأثیر می‌گذارد. یعنی اگر چیزی برای مدت زمان وقفه تنظیم‌شده دریافت نشود، ExoPlayer گزارش می‌دهد که بازپخش پایان یافته است. اگر این مقدار خیلی کوچک باشد، ممکن است در شرایط شبکه ضعیف، سیگنال پایان جاری‌سازی زودتر ارسال شود.

‫RTP/TCP در برخی تنظیمات شبکه سازگاری بهتری ارائه می‌دهد. می‌توانید ExoPlayer را پیکربندی کنید تا به‌طور پیش‌فرض با RtspMediaSource.Factory.setForceUseRtpTcp() از RTP/TCP استفاده کند.

گذراندن SocketFactory سفارشی

وقتی مسیریابی خاصی موردنیاز باشد، نمونه‌های SocketFactory سفارشی می‌تواند مفید باشد (برای مثال، وقتی ترافیک RTSP باید از رابط خاصی عبور کند، یا سوکت به پرچم‌های اتصال‌پذیری اضافی نیاز دارد).

به‌طور پیش‌فرض، RtspMediaSource از کارخانه سوکت استاندارد Java (SocketFactory.getDefault()) برای ایجاد اتصالات به نقاط پایانی از دور استفاده می‌کند. بااستفاده از RtspMediaSource.Factory.setSocketFactory() می‌توان این رفتار را ملغی کرد.

کاتلین

// 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))

جاوا

// 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));