langhuihui / jessibuca

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

四个轮播 大概2个小时之后出现Failed to execute 'appendBuffer' on 'SourceBuffer'的报错 #222

Closed Mxjjj closed 2 years ago

Mxjjj commented 2 years ago

请问这个会造成内存溢出吗?怎样才不会出现这个错误?感谢

Mxjjj commented 2 years ago

76487799-CE39-453d-B81A-4A3131A70998

bosscheng commented 2 years ago

我看下呢,有测试源吗?

Mxjjj commented 2 years ago

抱歉没有.. 都是用在内网

Mxjjj commented 2 years ago

轮播的逻辑上 每次有新的视频进来 我会把上一个destroy掉再重新create一个进行播放 但时间长了就会出现这个报错 浏览器占用的内存会不断上升 最后页面会崩溃 还有一个问题是如果我把页面最小化 如果这时发生了轮播切换 会出现这个报错Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause().

bosscheng commented 2 years ago

如果内存不断上升,应该就是内存溢出了。方便的话,贴下代码,我看下如何写的。

Mxjjj commented 2 years ago

`useEffect(() => { return () => { playTimer && clearTimeout(playTimer); destroy(); } }, []);

useEffect(() => { if (.isEmpty(flowVideoUrl)) return; // destroy(); if (.isEmpty(jessibuca)) { create(); } playTimer && clearTimeout(playTimer); playTimer = setTimeout(() => { play(); }, 1000); }, [flowVideoUrl]);

const create = () => { let $container = document.getElementById(id); jessibuca = new window.Jessibuca({ container: $container, isResize: false, text: '', loadingText: '', debug: false, hasAudio: false, // isFlv: flowVideoUrl.includes('.flv'), showBandwidth: true, // 显示网速 operateBtns: { fullscreen: true, screenshot: true, play: true, audio: true, record: false, }, isNotMute: false, videoBuffer: 1, // 缓存时长 useMSE: true, useWCS: true, wcsUseVideoRender: true, autoWasm: true, // 在使用MSE或者WebCodecs播放H265的时候,是否自动降级到wasm模式 forceNoOffscreen: true, // 是否关闭离屏渲染 }); };

const play = () => { if (jessibuca && flowVideoUrl) { jessibuca.play(flowVideoUrl); } };

const destroy = () => { if (jessibuca) { jessibuca && jessibuca.clearView() jessibuca && jessibuca.destroy(); } jessibuca = null; };`

hu2014 commented 2 years ago

你是不是最小化页面,播放就会暂停?

bosscheng commented 2 years ago

不要设置两个 useMSE: true, useWCS: true,

这种情况下,会优先使用useMSE 的。

bosscheng commented 2 years ago

@Mxjjj 试下最新的dist目录下面。

Mxjjj commented 2 years ago

你是不是最小化页面,播放就会暂停?

有可能是会暂停 我最小化再打开 会看到有几个视频是黑屏 过一会才会加载出画面 这么说来 我大概知道要怎么处理了 感谢

Mxjjj commented 2 years ago

不要设置两个 useMSE: true, useWCS: true,

这种情况下,会优先使用useMSE 的。

我这样设置的话 如果不能用MSE的话不就会用WCS了吗 如果不要设置两个的话是只把useMSE: true把useMCS: false这样吗

Mxjjj commented 2 years ago

@Mxjjj 试下最新的dist目录下面。

拉最新的代码吗 我去试下 感谢

bosscheng commented 2 years ago

不要设置两个 useMSE: true, useWCS: true, 这种情况下,会优先使用useMSE 的。

我这样设置的话 如果不能用MSE的话不就会用WCS了吗 如果不要设置两个的话是只把useMSE: true把useMCS: false这样吗

嗯,只要设置一个true 就行了,两个同时设置(播放器会检查是否支持),如果两个都支持,就会优先使用MSE

Mxjjj commented 2 years ago

@Mxjjj 试下最新的dist目录下面。

拉最新的代码吗 我去试下 感谢

我用最新的dist测试了一下午 没有出现SourceBuff is full的报错了 但出现了另外的问题 轮播一段时间后 只有两个视频能出来 再后面就只能出来一个视频了 其他不能展示的视频会出现这个响应 1657859092548_D7B2F395-52D9-40cf-8B24-10EA7B935DD6

Mxjjj commented 2 years ago

内存的话 最后涨到1.2G就没有什么变化了 但因为后面只有一个视频能被播放出来 所以我也不能断定内存不断上涨这个问题是不是已经被解决

bosscheng commented 2 years ago

这个是网络请求报错吧,和播放器没关系了,你可以尝试配置下重试机制,这样就算请求不通,也可以重试。

Mxjjj commented 2 years ago

这个是网络请求报错吧,和播放器没关系了,你可以尝试配置下重试机制,这样就算请求不通,也可以重试。

好的 非常感谢 想问一下 播放器支持播放H.265编码的流吗 我尝试了一下可以播放 但是没办法支持4路同时播放 CPU和内存占比会变得非常高 这种情况有办法通过配置解决吗

bosscheng commented 2 years ago

h265 是支持的,但是h265 只能支持软解。目前各大浏览器还没有开放h265的硬解码。如果想要四路播放h265,只能尝试降低分辨率,或者提升配置。

bosscheng commented 2 years ago

SourceBuff is full 我添加了防御,如果触发了,就会清空sourcebuffer 的缓存,重新触发播放。

Mxjjj commented 2 years ago

@bosscheng 请问同一个页面下只能播放6路视频 6路以上的视频播不出来是什么原因 我单个播放每一路视频都是没问题的 同一个页面下就不支持6路以上了

bosscheng commented 2 years ago

http 协议还是ws?协议? 如果是http 协议,可以看下这个 http://jessibuca.monibuca.com/document.html#%E5%A4%9A%E5%88%86%E5%B1%8F%E8%B6%85%E8%BF%87-6-%E8%B7%AF%E4%B8%8D%E8%83%BD%E6%92%AD%E6%94%BE

Mxjjj commented 2 years ago

http 协议还是ws?协议? 如果是http 协议,可以看下这个 http://jessibuca.monibuca.com/document.html#%E5%A4%9A%E5%88%86%E5%B1%8F%E8%B6%85%E8%BF%87-6-%E8%B7%AF%E4%B8%8D%E8%83%BD%E6%92%AD%E6%94%BE

是这个原因 非常感谢!