RTSP

ExoPlayer 同時支援直播和隨選 RTSP。支援的範例格式和 網路類型如下所列

支援的範例格式

  • H264 (SDP 媒體說明必須在 fmtp 中加入 SPS/PPS 資料 屬性)。
  • AAC (含 ADTS 位元流)。
  • AC3:
,瞭解如何調查及移除這項存取權。

支援的網路類型

  • 透過 UDP 單點傳播技術進行 RTP (不支援多點傳播)。
  • 交錯的 RTSP、RTP 使用 TCP 的 RTSP。

使用 MediaItem

如要播放 RTSP 串流,您需要依附 RTSP 模組。

Kotlin

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

Groovy

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

接著,您可以為 RTSP URI 建立 MediaItem,並傳遞至播放器。

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 內容,MediaItem必須使用 驗證資訊具體來說,URI 的格式應為 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();

在 NAT (支援 RTP/TCP 支援) 後端使用 RTSP

ExoPlayer 使用 UDP 做為 RTP 傳輸的預設通訊協定。

在 NAT 層後方串流 RTSP 時,NAT 可能無法轉送 傳入裝置的傳入 RTP/UDP 封包當 NAT 缺少 所需的 UDP 通訊埠對應如果 ExoPlayer 偵測到使用者未傳入 有一段時間的 RTP 封包尚未開始播放,ExoPlayer 隱藏器 關閉目前的 RTSP 播放工作階段,並重試使用 RTP-over-RTSP 播放 (使用針對 RTSP 開啟的 TCP 連線傳輸 RTP 封包)。

您可以呼叫 方法,以自訂透過 TCP 重試的逾時時間。 RtspMediaSource.Factory.setTimeoutMs()。舉例來說,如果逾時設為 四秒後,播放器會在 4 秒後使用 TCP 重試 閒置。

設定逾時時間也會影響串流結束偵測邏輯。也就是說 如果沒有針對 逾時時間值如果設定這個值太小,可能會導致 串流結束信號。

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