我正在开发一个包含 6 个音频和视频元素的项目,这些元素依次播放。
发出前的代码顺序是这样的:
- 预加载所有媒体资源直到“canplaythrough”
- 播放视频-1
- 停止 video-1 并播放 audio-1
- 停止音频 1 并再次播放视频 1。
然后 video-1 播放 2-3 秒并停止发送错误代码 3(3 = MEDIA_ERR_DECODE - 解码时发生错误)。我尝试仅通过链接播放相同的视频,并且播放得很好。
此外,该问题在某些浏览器的某些操作系统上也会随机出现。
例如:
- Win10最新Opera-出现
- Win10最新Chrome--不错
- MacOS 所有浏览器 - 很好
- 另一个 MacOS 最新的 Chrome - 出现在十分之一的情况下
- iPhone 所有浏览器 - 很好
- iPad 所有浏览器 - 很好
UPDATE仅在第一次查看或禁用缓存时,才会在 Win10 最新 Opera 上发生。
UPDATE 2视频编解码器为 H.264,音频编解码器为 AAC,帧速率为 24。
MEDIA_ERR_DECODE 的定义
HTML5 媒体错误代码规范 http://w3c.github.io/html/semantics-embedded-content.html#error-codes
在确定资源可用后,解码媒体资源时发生某种描述的错误。
Mozilla MediaError 文档 https://developer.mozilla.org/en-US/docs/Web/API/MediaError
尽管之前已确定可用,但在尝试解码媒体资源时发生错误,导致错误。
Firefox 错误消息(如下所示支持票 https://support.mozilla.org/en-US/questions/1058608)
由于损坏问题或视频使用了您的浏览器不支持的功能,视频播放被中止。
解雇的常见原因
-
视频已加密,但您无法解密。这可能是由于多种原因造成的:
1)使用多种 DRM 方案(而不仅仅是一种)加密视频可能会导致在某些浏览器上解密失败;
2)您在开始播放之前忽略了对视频进行解密(可能在您完成许可请求之前不小心将其设置为自动播放);
3)没有足够的资源来解码视频,因为多个视频缓冲区(即使它们不是加密视频)已用完。
您的浏览器不支持特定的媒体格式(例如 DASH)。根据媒体类型,这可以通过插件来修复。
您的 MIME 类型设置错误<source>
元素;请注意,某些浏览器更喜欢声明不同的 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.
这是一个类似的案例这个答案 https://stackoverflow.com/a/30105846/5951226与iOS相关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)