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

Android Jelly Bean播放ACTI IP摄像头RTSP流遇MediaPlayer错误(100,0)

解决Android Jelly Bean上播放ACTI IP摄像头H.264流时MediaPlayer崩溃问题

我之前在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:27:34