故意使 HTMLMediaElement 或 HTMLVideoElement 缓冲区无效或清除?

Purposefully invalidate or clear HTMLMediaElement or HTMLVideoElement buffers?

我的系统存在音频问题,导致偶尔出现裂纹或卡顿,并且 video/audio 不同步。

不同的程序和上下文对此有不同的处理方式。因此,对于我最常见的 YouTube 视频,我可以通过简单地在一秒后暂停和取消暂停视频,在“Quantum”之前的 Firefox (v<57) 上重新同步 A/V;但在像 Chrome v96.0.4664.45(官方构建)(64 位)这样的现代浏览器上,旧的、未对齐的缓冲区被保留。
当然,当一切顺利时这很聪明,但如果事情出错怎么办?

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

我的天真方法:替换 src 值(参考)

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

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

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

前几天我重新讨论了这个问题。
事实证明,一个简单的 .load() 调用可能会成功 ‍♂️

这可能因浏览器和网络应用程序而异,但无论如何这应该是一个很好的起点:

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(),它似乎也能完美运行。