美文网首页
IJKPlayer遇上搜狐的CDN分发

IJKPlayer遇上搜狐的CDN分发

作者: Extension | 来源:发表于2018-10-22 10:55 被阅读0次

        由于公司的项目使用的是搜狐的CDN分发,在开发过程中遇到了很多的问题,特此记录。

        项目中使用的是B站的IJKPlayer播放器,正常使用中并没有发现问题,但是用户后期反馈中发现了一个问题,拖动进度条之后视频卡死了,只能退出后重新进入,而且不是所有的视频都有这个问题,当时定位了很长时间,最后查看M3U8文件的时候发现了一个问题,(如下图)

视频的m3u8

        可以发现里面有一个特殊的tag,#EXT-X-DISCONTINUITY,当遇到该tag的时候说明视频的属性发生了变化,需要更新播放器的设置,让播放器重新初始化。我们知道,IJKPlayer使用的是FFmpeg的拉流,但是FFmpeg本身又对这个tag不兼容,可以参考:https://trac.ffmpeg.org/ticket/5419#comment:17,这就导致了某些视频播放错误。至于为什么播放的时候没有问题,我查看文档后发现IJK播放的时候做了处理,但是视频seekTo某一时间段的时候就出现了问题。

        产生这个问题的原因是:

        #EXT-X-DISCONTINUITY标签后面的视频的pts和标签之前的视频是不连续的,而ffmpeg在seek时,会去将要seek的timestamp与当前包的pts区间进行对比,来查看查找的是否是当前包,但由于pts不连续的问题,会导致seek的timestamp总是大于包的pts区间,所以到会导致一直卡着,无法播放。

        找到了问题所在之后,我们要解决的就是让seekTo能够处理这个字段。当时想到了直接替换m3u8文件的时间,手动去除掉DISCONTINUITY这个tag,这样的话理论上可以,但是实在不忍心写这么垃圾的代码。然后就去翻IJK的issues,一顿搜索,终于发现了解决方案。

        这位大神是这么操作的:首先在hls.c文件里添加一个函数,用于查找当前packet之前的视频的总时长,用于得出正确的pts:

计算seek时间的函数

        再在合适的地方调用这个函数,成功的解决了这个问题。具体的issues地址是https://github.com/Bilibili/ijkplayer/issues/2874,CloudIAU大神的回答。

        然后就是正常的IJK播放器的生成流程,下载FFmpeg,然后对每个框架进行上述的操作,其实就是复制粘贴,没什么技术含量,(生成ijk包的资料比较多,在此不再详述)。生成之后,测试一下,完美解决。OJBK。

        这段时间找了很多的资料,发现大家分享出来的都是基础的IJK的framework,没有针对这个字段的修复,特此写文章记录一下,同时打包了了一个修复的框架包,供大家使用。(应该是很少人使用了搜狐的傻叉分发)

百度网盘下载地址:https://pan.baidu.com/s/1mbFk3757dJ-mlci4aeKtGQ

        同时记录一个发现的小问题,ijk播放器在播放一下视频的时候有画面无声音,这就很奇葩了,后来发现是视频第一帧无声音,导致后边的音轨解析不出来,

IJK的基本设置

        最后发现了原来是analyzeduration这个地方出现了问题,果断注释。

        第一次写文章,不通顺的地方还请见谅,有技术问题可以大家一起讨论。链接失效的话可以留言。

相关文章

  • IJKPlayer遇上搜狐的CDN分发

    由于公司的项目使用的是搜狐的CDN分发,在开发过程中遇到了很多的问题,特此记录。 项目中使用的是B站的IJKPla...

  • CDN

    简介:CDN(Content Delivery Network),内容分发网络。CDN是构建在网络之上的内容分发网...

  • CDN相关资料

    什么是CDN,CDN即(content distribute/delivery network)内容分发网络CDN...

  • 什么是【CDN】

    CDN 叫做内容分发网络(Content Delivery Network)。CDN是构建在网络之上的内容分发网络...

  • 02.Element UI 之安装使用(CDN)

    一、CDN方式安装使用 |--CDN:content delivery network内容分发网络,CDN是构...

  • CDN

    CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网...

  • 啥子是cdn

    CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网...

  • 什么是CDN

    CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网...

  • 免费CDN:jsDelivr + Github

    CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网...

  • 各网站CDN

    CDN(内容分发网络),jquery的在线引用地址 菜鸟教程cdn: 、、、 、、、 百度cdn: 、、、 、、、...

网友评论

      本文标题:IJKPlayer遇上搜狐的CDN分发

      本文链接:https://www.haomeiwen.com/subject/ehpflftx.html