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