RTSP

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

فرمت های نمونه پشتیبانی شده

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

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

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

با استفاده از MediaItem

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

implementation("androidx.media3:media3-exoplayer-rtsp:1.5.0")
implementation "androidx.media3:media3-exoplayer-rtsp:1.5.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). ).

با فراخوانی متد RtspMediaSource.Factory.setTimeoutMs() می‌توان مهلت زمانی را برای تلاش مجدد با TCP سفارشی کرد. به عنوان مثال، اگر بازه زمانی چهار ثانیه تنظیم شده باشد، پخش کننده پس از چهار ثانیه عدم فعالیت 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));

،

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

فرمت های نمونه پشتیبانی شده

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

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

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

با استفاده از MediaItem

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

implementation("androidx.media3:media3-exoplayer-rtsp:1.5.0")
implementation "androidx.media3:media3-exoplayer-rtsp:1.5.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). ).

با فراخوانی متد RtspMediaSource.Factory.setTimeoutMs() می‌توان مهلت زمانی را برای تلاش مجدد با TCP سفارشی کرد. به عنوان مثال، اگر بازه زمانی چهار ثانیه تنظیم شده باشد، پخش کننده پس از چهار ثانیه عدم فعالیت 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));