故意使 HTMLMediaElement 或 HTMLVideoElement 缓冲区无效或清除?
Posted
技术标签:
【中文标题】故意使 HTMLMediaElement 或 HTMLVideoElement 缓冲区无效或清除?【英文标题】:Purposefully invalidate or clear HTMLMediaElement or HTMLVideoElement buffers? 【发布时间】:2022-01-05 20:43:23 【问题描述】:我的系统出现音频问题,导致偶尔出现裂缝或卡顿,以及视频/音频不同步。
不同的程序和上下文对此有不同的处理方式。因此,对于我最常见的 YouTube 视频案例,我可以在“Quantum”之前的 Firefox (v 当然,当事情顺利时这很聪明,但如果事情出错了怎么办?
我想知道使缓冲区无效的方法,触发对音频和视频轨道的重新评估,以确保它们再次同步。 htmlMediaElement.buffered是只读的,其中的范围对象也不提供任何修改接口。
我的幼稚方法:替换 src 值(参考)
我仍然缺乏解决方案的最常见问题是网络浏览器中的视频,最常见的是 YouTube。
我尝试通过使用 videoElement.src += "?refresh=" + Math.random(0,1);
附加查询字符串或使用井号 ("#
") 仅附加“哈希”/DOM 引用来更改 src
值,但 YouTube 全部返回“未找到”我正在操作的常用 blob 资源。
现在我被困住了。
我正在查看的似乎有用的 DOM 元素的所有属性都是只读的(例如 HTMLMediaElement.buffered
范围)
有没有办法向浏览器发出信号,使迄今为止组装的 A/V 缓冲区无效并根据当前时间位置重新评估事物?
【问题讨论】:
【参考方案1】:前几天我重新审视了这个问题。
事实证明,一个简单的.load()
调用就可以解决问题?♂️
这在浏览器和 web 应用程序之间可能有所不同,但无论如何这应该是一个很好的起点:
function reloadMedia(v)
var t = v.currentTime;
v.load();
v.play(); // usually not needed; included for good measure
v.currentTime = t; // usually not needed; included for good measure
对于当前的 Chrome 和 YouTube,即使不重新设置时间并再次调用 play()
,它似乎也能正常工作。
【讨论】:
以上是关于故意使 HTMLMediaElement 或 HTMLVideoElement 缓冲区无效或清除?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 canplay 事件中设置 HTMLMediaElement 的 .currentTime,调用 play 并避免调度 pause 事件?
扩展音频/HTMLMediaElement javascript 对象
无法在“SourceBuffer”上执行“appendBuffer”:HTMLMediaElement.error 属性不为空