You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExoPlayer2无法获取本地Docker部署的RTSP流问题求助

问题排查与修复建议

逐个排查以下常见问题,定位并解决RTSP流无法播放的问题:

1. 确认ExoPlayer是否引入RTSP扩展库

ExoPlayer核心库不包含RTSP协议支持,必须单独添加扩展依赖。在Module级别的build.gradle中加入:

implementation "com.google.android.exoplayer:exoplayer-rtsp:2.X.X"

注意将2.X.X替换为你当前使用的ExoPlayer核心库版本,确保版本号完全一致。

2. 检查Android网络权限

确保AndroidManifest.xml中已声明网络权限,RTSP流请求同样需要该权限:

<uses-permission android:name="android.permission.INTERNET" />

3. 验证Docker容器端口映射是否正确

启动RTSP服务的Docker容器时,必须将容器内的8554端口映射到主机的8554端口,否则模拟器通过10.0.2.2无法访问容器内服务。启动命令需包含端口映射参数:

docker run -d -p 8554:8554 <你的RTSP服务镜像名>

4. 先确认RTSP流本身可用

用VLC播放器在主机上直接测试rtsp://localhost:8554/test,如果无法播放,优先修复Docker内的RTSP服务配置;如果能正常播放,再回到Android代码排查问题。

5. 修复Jetpack Compose中ExoPlayer的生命周期管理

你的代码未将Player与Compose组件生命周期绑定,容易出现播放准备失败或资源泄漏问题。调整代码如下:

val context = LocalContext.current
// 用remember缓存Player,避免重复初始化
val player = remember {
    ExoPlayer.Builder(context).build().apply {
        val mediaSource = RtspMediaSource.Factory()
            .createMediaSource(MediaItem.fromUri("rtsp://10.0.2.2:8554/test"))
        setMediaSource(mediaSource)
        prepare()
        play()
    }
}

// 用DisposableEffect在组件销毁时释放Player资源
DisposableEffect(Unit) {
    onDispose {
        player.release()
    }
}

AndroidView(factory = {
    PlayerView(context).apply {
        this.player = player
    }
})

6. 排查防火墙/安全软件拦截

主机的防火墙或安全软件可能拦截8554端口的流量,暂时关闭防火墙测试是否能正常播放RTSP流。

内容的提问来源于stack exchange,提问作者Iets Iets

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:30:39