【问题标题】:Purposefully invalidate or clear HTMLMediaElement or HTMLVideoElement buffers?故意使 HTMLMediaElement 或 HTMLVideoElement 缓冲区无效或清除?
【发布时间】:2025-12-01 05:50:01
【问题描述】:

我的系统出现音频问题,导致偶尔出现裂缝或卡顿,以及视频/音频不同步。

不同的程序和上下文对此有不同的处理方式。因此,对于我最常见的 YouTube 视频案例,我可以在“Quantum”之前的 Firefox (v 当然,当事情顺利时这很聪明,但如果事情出错了怎么办?

我想知道使缓冲区无效的方法,触发对音频和视频轨道的重新评估,以确保它们再次同步。 HTMLMediaElement.buffered是只读的,其中的范围对象也不提供任何修改接口。

我的幼稚方法:替换 src 值(参考)

我仍然缺乏解决方案的最常见问题是网络浏览器中的视频,最常见的是 YouTube。
我尝试通过使用 videoElement.src += "?refresh=" + Math.random(0,1); 附加查询字符串或使用井号 ("#") 仅附加“哈希”/DOM 引用来更改 src 值,但 YouTube 全部返回“未找到”我正在操作的常用 blob 资源。

现在我被困住了。
我正在查看的似乎有用的 DOM 元素的所有属性都是只读的(例如 HTMLMediaElement.buffered 范围)

有没有办法向浏览器发出信号,使迄今为止组装的 A/V 缓冲区无效并根据当前时间位置重新评估事物?

【问题讨论】:

    标签: javascript dom browser


    【解决方案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(),它似乎也能正常工作。

    【讨论】:

      最近更新 更多