bilibili / ijkplayer

Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.
GNU General Public License v2.0
32.44k stars 8.11k forks source link

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

Open VeiZhang opened 5 years ago

VeiZhang commented 5 years ago

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

zj381652512 commented 5 years ago

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

VeiZhang commented 5 years ago

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

compilelife commented 5 years ago

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

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

boboZeng commented 4 years ago

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

VeiZhang commented 4 years ago

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

boboZeng commented 4 years ago

@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);
}
VeiZhang commented 4 years ago

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

tailanx commented 2 years ago

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