ExoPlayer 同时支持直播和点播 RTSP。支持的示例格式和 网络类型如下所列。
支持的样本格式
- H264(SDP 媒体说明必须在 <p> 属性)。
- AAC(使用 ADTS 比特流)。
- AC3.
支持的网络类型
- UDP 单播 RTP(不支持多播)。
- 使用 TCP 通过 RTSP 执行交错的 RTSP 和 RTP。
使用 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 必须使用
身份验证信息。具体而言,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 使用 UDP 作为 RTP 传输的默认协议。
在 NAT 层后面流式传输 RTSP 时,NAT 可能无法转发 传入的 RTP/UDP 数据包。如果 NAT 缺少 必要的 UDP 端口映射。如果 ExoPlayer 检测到尚未传入 RTP 数据包的运行,但播放尚未开始,ExoPlayer 会撕裂 关闭当前的 RTSP 播放会话,然后使用 RTP-over-RTSP 重新尝试播放 (使用针对 RTSP 打开的 TCP 连接来传输 RTP 数据包)。
可通过调用 方法自定义 TCP 重试的超时时间
RtspMediaSource.Factory.setTimeoutMs()
。例如,如果超时设置为
则播放器会在运行 4 秒 UDP 后通过 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));