HTML5 视频 MEDIA_ERR_DECODE 随机出现

Dzm*_*sky 6 html javascript video opera decode

我正在开发包含 6 个音频和视频元素的项目,这些元素一个接一个地播放。问题前的代码顺序是这样的:

  1. 预加载所有媒体资源直到“canplaythrough”
  2. 播放视频-1
  3. 停止视频 1 并播放音频 1
  4. 停止音频 1 并再次播放视频 1。

然后视频 1 播放 2-3 秒并停止发送错误代码 3(3 = MEDIA_ERR_DECODE - 解码时发生错误)。我试图通过链接播放相同的视频,并且播放正常。

此外,该问题在某些浏览器的某些操作系统上随机发生。例如:

  • Win10最新Opera-出现
  • Win10 最新版 Chrome - 很好
  • MacOS 所有浏览器 - 很好
  • 另一个 MacOS 最新版 Chrome - 发生在 10 个案例中的一个
  • iPhone 所有浏览器 - 很好
  • iPad 所有浏览器 - 很好

更新仅在第一次查看或禁用缓存时才会在 Win10 最新版 Opera 上发生。

更新 2视频编解码器是 H.264,音频编解码器是 AAC,帧率是 24。

Jam*_*rch 6

MEDIA_ERR_DECODE 的定义

媒体错误代码的 HTML5 规范

媒体资源被确定为可用后,在解码媒体资源时发生某种描述错误。

Mozilla MediaError 文档

尽管之前已确定可用,但在尝试解码媒体资源时发生错误,导致错误。

Firefox 错误消息(如本支持票中所示

由于损坏问题或因为所使用的视频功能您的浏览器不支持,视频播放被中止。

解雇的常见原因

  • 视频已加密,但您未能解密。这可能是由于各种原因:

    1)使用多种 DRM 方案(而不是只有一种加密视频可能会导致在某些浏览器上解密失败;

    2)您在开始播放之前忽略了对视频的解密(可能在您完成许可请求之前不小心将其设置为自动播放);

    3)没有足够的资源来解码视频,因为几个视频缓冲区(即使它们不是加密视频)已经用完了。

  • 您的浏览器不支持特定的媒体格式(例如 DASH)。这可以通过插件修复,具体取决于媒体类型。

  • 您在<source>元素上设置了错误的 MIME 类型;请注意,某些浏览器更喜欢声明不同的 MIME 类型,以便对某些视频格式进行解码。

  • 太多的视频缓冲区已用完而未被清除。

您的情况的诊断

由于错误相当不确定地触发,这似乎是资源问题,而不是任何其他可能性。你有六个音频和视频元素一个接一个地播放,所以你应该在他们每次传送媒体时清除每个元素。您也不应该并排加载所有六个。

var video = document.getElementById('myVideo');
var nextVideo = document.getElementById('nextVideo');

video.addEventListener('ended', (event)=>{
    video.src = ""; // or the src attribute of the active <source> element.
    video.load();
    // If you aren't going to re-use this video element, you should also
    // remove all eventListeners from it and then remove it from the DOM.
    nextVideo.preload = "auto"; // I'm assuming the src has already been set.
    nextVideo.autoplay = true;
    // Second video should start playing now due to autoplay. If not, call load() again.
});

video.preload = "auto";
nextVideo.preload = "metadata";
video.src = "video.mp4";
nextVideo.src = "nextVideo.mp4";
video.autoplay = true;
nextVideo.load(); // I believe load() might not be necessary for preload = "metadata".
video.load(); // I believe load() is necessary for preload = "auto".
// First video should start playing now due to autoplay.
Run Code Online (Sandbox Code Playgroud)

这是与 iOS 相关的答案的类似案例。