langhuihui / jessibuca

Jessibuca是一款开源的纯H5直播流播放器
https://jessibuca.com
GNU General Public License v3.0
2.14k stars 401 forks source link

网速差的时候 直播延迟问题... #200

Closed choi2k closed 2 years ago

choi2k commented 2 years ago

image

测试使用 chrome 的限速, “slow 3g" 下时间差会越来越大. 后续恢复不限速的时候时间差也不会恢复.

jessibuca = new Jessibuca({
        container: $container,
        videoBuffer: 0.2, // 缓存时长
        isFullResize: true,
        loadingText: '',
        useMSE: false,
        debug: true,
        showBandwidth: true, // 显示网速
        operateBtns: {
          fullscreen: false,
          screenshot: false,
          play: false,
          audio: false,
          record: false,
        },
        isNotMute: false,
      })

image

看 stats buffer 在网速差的时候会上升,待网速恢复正常时恢复到设定水平, 但延迟没有改善

bosscheng commented 2 years ago

@choi2k 完美,我知道如何测试追帧逻辑了。tks。

bosscheng commented 2 years ago

@choi2k 确认下,你用的哪个版本的jessibuca

choi2k commented 2 years ago

@choi2k 确认下,你用的哪个版本的jessibuca

应该是最新那个 6-12 的版本. 之前手机上播放不到更新了. 我明早回去确认看看

choi2k commented 2 years ago

https://github.com/langhuihui/jessibuca/releases/tag/v3.1.3 3.1.3 里面的 dist, 测试用的是 http-flv 流

bosscheng commented 2 years ago

对了你们服务器端用的是m7s 嘛? 是什么版本的?

choi2k commented 2 years ago

不是..这边好像用了最原始的 nginx-http-flv-module

bosscheng commented 2 years ago

那可能是 服务器端的问题。你可以试下m7s 会追帧的。

choi2k commented 2 years ago

那可能是 服务器端的问题。你可以试下m7s 会追帧的。

那我看看能不能用 m7s 试试... 用 bilibili 那款会追但有 mse 问题才试着找 wasm 的 player.

choi2k commented 2 years ago
image

用 m7s 测试了下还是不能追帧.

题外话.. m7s 快速体验的后台预设是 8081, 官网写的是 8080

bosscheng commented 2 years ago

我自己测试了有追帧的啊,你能给我个地址,我测试看下嘛。

choi2k commented 2 years ago
image

单位的视频不能放到外网.. 我拿了 m7s 里面那个测试 [HDL.AutoPullList] "live/hdl" = "http://flv.bdplay.nodemedia.cn/live/bbb.flv"

延迟会少点,大概因为视频流量不同? 前端的代码我弄了个最简单的. 本来想放在 codesandbox, 不知道为什么载入 jessibuca.js 就跑不了

Archive.zip

choi2k commented 2 years ago

测试方式.. 怕之前说的不清楚

进入网页前先把 chrome 的网络设定为 slow 3g image

进入及播放视频后,确认有延迟现象,再等一会 (e.g. 10s),把网络速度调回没限制 image

bosscheng commented 2 years ago

我来测试看下。

bosscheng commented 2 years ago

@choi2k 这种情况,是网速跟不上服务器端推流,数据都在还路上,本地接收到的数据是慢的,所以延迟会原来越大。 如果是用户类似那种网速非常慢,触发了本地的延迟最大时间,就会触发丢帧,但是也是解决不了网速慢导致的问题。

这样讲你还能理解。

bosscheng commented 2 years ago

@choi2k 你试着慢网络几秒钟,然后连接上看下,就可以看到丢帧情况。

choi2k commented 2 years ago

@choi2k 这种情况,是网速跟不上服务器端推流,数据都在还路上,本地接收到的数据是慢的,所以延迟会原来越大。 如果是用户类似那种网速非常慢,触发了本地的延迟最大时间,就会触发丢帧,但是也是解决不了网速慢导致的问题。

这样讲你还能理解。

但这样的话 如果网速恢复的话还是不会追帧么?或者有没有办法检测到这个延迟多大..然后选择手动重播来追帧?

bosscheng commented 2 years ago

可以的,可以定时的去服务器端拉取目前推流的最新时间,和本地的播放时间做对比,如果差值超过了某个大小,就直接重新拉取最新数据,进行查看。

choi2k commented 2 years ago

本地的播放时间

想问这个时间可以从哪边获取?翻了文档和几个 event 都找不到..

bosscheng commented 2 years ago

stats 里面的ts http://jessibuca.monibuca.com/api.html#stats

choi2k commented 2 years ago

stats 里面的ts http://jessibuca.monibuca.com/api.html#stats

好像有点误会.. 我以为 “播放时间” 是指像 2022-06-22 15:33:00 这种, 这个 stat ts 看起来是像客户端观看了多久(i.e. 进入观看视频到现在的时间)?

如果想用来服务器那边比较的话 拿客户端播放时间好像没作用.. 我以为的比较是... 客户端视频的时间是 2022-06-22 15:33:00 然后检查服务器那边是 2022-06-22 15:34:00, 中间相差一分钟,所以重新拉取. 不知道有没有可能拿到这个时间?

bosscheng commented 2 years ago

哦,stats里面的ts 就是解码获取到的流里面的时间,不过你讲的这种方式也可以实现,就是在播放的时候,需要给播放器一个开始时间,然后结合播放器里面的播放的时间,这样其实就是模拟出来 2022-06-22 15:33:00 这个时间了。

SuperChrisliu commented 2 years ago

可以的,可以定时的去服务器端拉取目前推流的最新时间,和本地的播放时间做对比,如果差值超过了某个大小,就直接重新拉取最新数据,进行查看。

是指重新初始化播放器,播放吗

bosscheng commented 2 years ago

不需要,直接pause().then(()=>{play() }) 这种就行了。

SuperChrisliu commented 2 years ago

不需要,直接pause().then(()=>{play() }) 这种就行了。

在延迟变大的时候,重新调用play()会出现短暂的加载动画,可以配置不显示这个加载动画吗

bosscheng commented 2 years ago

没有这个参数呢,可以自己定制化加一个。