RTSP

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

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

  • H264 (شرح رسانه SDP باید شامل داده‌های SPS/PPS در ویژگی fmtp برای مقداردهی اولیه رمزگشا باشد).
  • AAC (با جریان بیت ADTS).
  • 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 برای URI 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 محافظت‌شده، URI مربوط به MediaItem باید با اطلاعات اصالت‌سنجی پیکربندی شود. به‌طور مشخص، URI باید به شکل 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) دوباره امتحان می‌کند.

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

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

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

Passing a custom 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));