RTSP

ExoPlayer は、ライブとオンデマンドの両方の RTSP をサポートしています。サポートされているサンプル形式と ネットワークの種類を以下に示します。

サポートされているサンプル形式

  • H264(SDP メディアの説明では、fmtp に SPS/PPS データを含める必要があります デコーダの初期化用の属性など)を指定します。
  • AAC(ADTS ビットストリームを使用)。
  • AC3.
で確認できます。

サポートされているネットワークの種類

  • RTP over UDP ユニキャスト(マルチキャストはサポートされていません)。
  • Interleaved RTSP、RTP over RTSP(TCP を使用)。

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 認証を使用した再生をサポートしています。プレイするには MediaItem の URI を 認証情報です。具体的には、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 の背後で RTSP を使用する(RTP/TCP サポート)

ExoPlayer は、RTP トランスポートのデフォルト プロトコルとして UDP を使用します。

NAT レイヤの背後に RTSP をストリーミングすると、NAT が RTSP を 受信する RTP/UDP パケットを 受信しますこれは、NAT にネットワーク ファイアウォール 必要な UDP ポート マッピングが定義されています。受信メッセージがないことを ExoPlayer が検出した場合 しばらくの間 RTP パケットが長くなり、再生がまだ開始されていない場合、ExoPlayer がテアリングする 現在の RTSP 再生セッションを停止し、RTP-over-RTSP を使用して再生を再試行します。 (RTSP 用に開かれた TCP 接続を使用して RTP パケットを送信する)

TCP で再試行する際のタイムアウトは、次のメソッドを呼び出してカスタマイズできます。 RtspMediaSource.Factory.setTimeoutMs()。たとえば、タイムアウトが次のように設定されていて、 4 秒経過すると、プレーヤーは UDP パケットの 4 秒後に TCP で再試行します。 表示されます。

タイムアウトを設定すると、配信終了の検出ロジックにも影響します。つまり 応答が何も受信されなかった場合、ExoPlayer は再生が終了したことを報告します。 設定されたタイムアウト時間。この値が小さすぎると、アラートの発効が 電波状況が良くない状況でストリーミング終了信号が発生する。

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