RTSP

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

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

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

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

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

استفاده از MediaItem

برای پخش یک جریان RTSP، باید به ماژول RTSP وابسته باشید.

کاتلین

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

گرووی

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

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

کاتلین

// 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() استفاده کند.

ارسال یک SocketFactory سفارشی

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

به طور پیش‌فرض، RtspMediaSource از کارخانه سوکت استاندارد جاوا ( 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(...)
    .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(...)
        .createMediaSource(MediaItem.fromUri(rtspUri));