ijkplayer播放hls(m3u8)文件拖放不准确的问题

使用ijkplayer播放hls,seek到某个位置的时候老会出现往往后跳的情况,比如seek到1分60秒的时候,会跳到1分55秒。多次seek都会出现这种现象,但是播放m4a文件未出现该现象。

代码中设置的各种参数如下

player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 0);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 60);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 0);
//部分手机无法设置快速播放,比如小米8的miui10.3.6,对应的是安卓9, 开启soundtouch解决该问题
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);
String whiteList = "async,cache,crypto,file,http,https,ijkhttphook,ijkinject,ijklivehook,ijklongurl,ijksegment,ijktcphook,pipe,rtp,tcp,tls,udp,ijkurlhook,data,concat,subfile,udp,ffconcat";
if(isShortPlayer){
	whiteList += ",ijkmediadatasource";
}
player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", whiteList);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "safe", 0);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
player.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "fastseek");

   流程是app启动的时候创建了IjkMediaPlayer对象,播放的时候调用了stop和reset函数,然后设置播放地址,再次设置soundtouch参数,调用prepareAsync函数,在onPrepared回调中调用start开始播放。
   一开始没有觉察出问题出在哪里,然后参考ijkplayer官网的issues的#313的处理方法,于是注释掉了seekbar相关的代码,在进度刷新定时器中直接从IjkMediaPlayer对象中获取当前的播放位置输出日志,发现在seek的过程中这个进度是正确的(seek是异步执行的,真正的seek是在ff_ffplay.c的read_thread函数中if (is->seek_req)逻辑里面的内容),seek完以后进度往回跳几秒。在ijkplayer的demo中发现也是正常的,demo中配置的参数和app中配置的参数一致,如上代码段。为什么呢,此次剥离了seekbar的为什么还是这个样子呢?此时并没有察觉是因为播放前调用了reset函数,把设置的参数给重置了导致。

       之前写过一简短播放类用于播放短音频文件的,每次播放音频文件的时候都是创建一个IjkMediaPlayer之后设置了参数,设置播放地址,调用prepareAsync函数,在onPrepared回调中调用start开始播放,用这个类测试了下播放同一个hls文件,发现seek的时候没问题,于是对比了下播放流程,发现app中播放之前多调用了stop和reset函数,注释掉这两个函数调用,发现正常了。既然确定了问题所在就好办了,于是在reset之后再次设置了如上的参数就OK了。

       小结一下:

       本次出现的问题是因为调用了reset函数导致首次创建对象时设置的参数被清除,而没有再次设置参数导致。这里的关键参数是

player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);这一句,其他的设置在这个问题中都没影响,这个是设置精准定位的。


    ijkplayer拖放不准的问题原因总结

1、seekbar导致的,详见ijkplayer官网的issues的#313描述。解决方法请参考#313

2、未开启精准定位导致的,这个现象目前个人发现的仅影响hls播放,对于m4a或mp3的播放不影响。解决方法就是给播放器设置精准定位,设置方法参考上面代码。

 

     

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值