1、缩短首帧探测时间
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 1024*16); // 默认值较大,调整为16KB
2、禁用缓冲
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0); // 禁用网络缓冲:
3、限制最大缓冲区
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 1024*256); // 256KB缓冲阈值
4、分片数据预缓存
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1);
5、连接复用配置
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1); // 网络波动时自动重连
6、开启硬件加速
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
7、动态调整帧率阀值,丢帧策略
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-fps", 30)
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5)
8、带宽与延迟监测
ijkMediaPlayer.setOnInfoListener((mp, what, extra) -> { if (what == IMediaPlayer.MEDIA_INFO_BUFFERING_START) { // 触发网络降级策略 } else if (what == IMediaPlayer.MEDIA_INFO_BUFFERING_END) { // 恢复高帧率模式 } return true; });
9、连续检测到3个I帧解码失败时,触发GOP级丢弃 ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "gop_max_decode_failures", 3)
10、启用解码前丢帧策略
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48)