故意使 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 缓冲区无效或清除?的主要内容,如果未能解决你的问题,请参考以下文章

故意使我的 Windows 应用程序崩溃的最佳方法是啥?

使用 HTMLMediaElement 向后播放音频

HTMLMediaElement 的非线性体积

如何在 canplay 事件中设置 HTMLMediaElement 的 .currentTime,调用 play 并避免调度 pause 事件?

扩展音频/HTMLMediaElement javascript 对象

无法在“SourceBuffer”上执行“appendBuffer”:HTMLMediaElement.error 属性不为空