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
相关产品推荐
相关产品推荐

