ijkplayer icon indicating copy to clipboard operation
ijkplayer copied to clipboard

播放视频时,前几秒卡,FPS低

Open VeiZhang opened this issue 5 years ago • 8 comments

使用官方ijk的示例,修改使用硬解,播放该段视频HEVC-000.ts,前几秒FPS低,导致画面卡,之后是正常播放。 请教如何解决或者跳过卡的帧?

VeiZhang avatar Apr 09 '19 04:04 VeiZhang

经过几百次重复播放,我发现ijkplayer有一定概率出现延迟高,加载慢,fps低的问题,大概5-6次播放就会出现一次,感觉和网速没有关系,用VLC2.26播放相同的rtmpUrl都很正常,目前我的解决思路就是一出这种异常,就重新创建player

zj381652512 avatar Apr 27 '19 02:04 zj381652512

@zj381652512 跟你复现的操作不一样,每次播放或者seek,前几秒都会出现fps低的情况。

VeiZhang avatar Apr 29 '19 02:04 VeiZhang

我觉得这个应该是视频在等音频。

一般从封装中读出的视频pts会大于音频pts,如果采取音频为主时钟,就需要视频重复已经播放的帧来等待音频。

compilelife avatar Jun 17 '19 12:06 compilelife

参考https://www.jianshu.com/p/358a42ecc7d6

boboZeng avatar Oct 29 '19 03:10 boboZeng

@ribory 没效果,我已经设置了该选项

VeiZhang avatar Oct 29 '19 03:10 VeiZhang

@ribory 没效果,我已经设置了该选项

我这边是这个原因,我的参数设置

private IjkMediaPlayer createPlayer() {
    IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer();
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 0);

    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1);
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);

    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "min-frames", 100);
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
    //如果项目中同时使用了HTTP和HTTPS的视频源的话,要注意如果视频源刚好是相同域名,会导致播放失败,这是由于dns缓存造成的;
    //设置清除dns cache;
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "http-detect-range-support", 1);

    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", 10000000);
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 5);

    ijkMediaPlayer.setVolume(1.0f, 1.0f);

    setEnableMediaCodec(ijkMediaPlayer, mEnableMediaCodec);//
    return ijkMediaPlayer;
}

//设置是否开启硬解码
private void setEnableMediaCodec(IjkMediaPlayer ijkMediaPlayer, boolean isEnable) {
    int value = isEnable ? 1 : 0;
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", value);//开启硬解码
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", value);
    ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", value);
}

boboZeng avatar Oct 29 '19 03:10 boboZeng

@ribory 好的,谢谢,我用你的配置试试

VeiZhang avatar Oct 29 '19 03:10 VeiZhang

//播放前的探测Size,默认是1M, 改小一点会出画面更快 setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"probesize", 200); 设置这个参数我的页面正常了。

tailanx avatar Jun 24 '22 08:06 tailanx