Android Jelly Bean播放ACTI IP摄像头RTSP流遇MediaPlayer错误(100,0)
我之前在Jelly Bean设备上做IP摄像头流播放时也碰到过类似的媒体服务器崩溃问题,结合你的情况,给你几个实用的排查和解决方向:
1. 强制指定RTSP传输协议(如果是RTSP流)
你的摄像头流在VLC能正常播放,但原生MediaPlayer对RTSP的适配远不如VLC灵活。Jelly Bean的MediaPlayer默认可能用UDP传输,而部分IP摄像头的UDP流可能存在丢包或者兼容性问题,导致媒体服务器崩溃。试试在流URL末尾加上?transport=tcp参数,强制用TCP传输:
mediaPlayer.setDataSource("rtsp://your_camera_stream_url?transport=tcp");
虽然你之前移除过?,但这个参数是关键——VLC会自动协商传输方式,但MediaPlayer需要明确指定。
2. 修复MediaPlayer的错误处理逻辑
错误码(100,0)通常意味着媒体服务进程崩溃,这时候直接重新初始化MediaPlayer会导致重复崩溃。必须先彻底释放旧实例的资源,再重新创建:
private MediaPlayer mediaPlayer; private void initAndPlayStream() { if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setOnErrorListener((mp, what, extra) -> { Log.e("CameraStream", "MediaPlayer崩溃: " + what + ", " + extra); // 触发重新初始化 initAndPlayStream(); return true; }); mediaPlayer.setOnPreparedListener(mp -> mp.start()); try { mediaPlayer.setDataSource("your_stream_url?transport=tcp"); mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } }
3. 替换为ExoPlayer(推荐方案)
Jelly Bean的原生MediaPlayer对H.264的支持有很多局限性,比如对某些Baseline profile的子特性、封装格式兼容性差。ExoPlayer是Google推出的替代方案,对各种流媒体格式的支持远优于原生MediaPlayer,而且VLC能播放的流ExoPlayer基本都能处理。
你只需要引入ExoPlayer的依赖(针对Jelly Bean,用ExoPlayer 2.x的兼容版本),然后简单配置即可播放:
// 初始化ExoPlayer SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); // 设置播放视图 playerView.setPlayer(player); // 创建媒体源 MediaItem mediaItem = MediaItem.fromUri("your_camera_stream_url"); player.setMediaItem(mediaItem); // 准备并播放 player.prepare(); player.play();
4. 调整摄像头的流参数
虽然摄像头设置的是H.264 Baseline 320x240,但可能存在其他非标准参数:
- 尝试降低帧率到15fps(Jelly Bean对高帧率H.264处理容易崩溃)
- 缩小GOP(关键帧间隔)到15帧以内
- 关闭摄像头的音频流(如果不需要的话),部分MediaPlayer实例会因为音频编码不兼容触发崩溃
5. 检查基础权限和网络配置
确保你的APP已经申请了INTERNET权限:
<uses-permission android:name="android.permission.INTERNET" />
如果是HTTP流,Jelly Bean默认允许明文网络访问,不需要额外配置;如果是RTSP流,确保网络没有阻止摄像头的RTSP端口(通常是554)。
内容的提问来源于stack exchange,提问作者maryS

