javascript - 将 mp4 视频数组缓冲区添加到媒体源后,html 视频播放器冻结
问题描述
我尝试使用 javascript 处理来自 api 的视频数据,api 响应正常,但播放器无法按预期工作,当我播放视频时,控制台会抛出错误。
DOMException:该元素没有支持的来源。
尽管视频数据可用,但数组缓冲区似乎尚未推送到媒体源中
这是代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>Hello</h1>
<video id="video" controls autoplay></video>
</body>
</html>
<script>
window.onload = function() {
var mime = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
const videoTag = document.getElementById("video");
if (
"MediaSource" in window &&
MediaSource.isTypeSupported(mime)
) {
var mediaSource = new MediaSource();
//console.log(mediaSource.readyState);
videoTag.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener("sourceopen", sourceOpen);
} else {
console.error("Unsupported MIME type or codec: ", mime);
}
function sourceOpen(e) {
var msource = this;
console.log(msource.readyState);
// URL.revokeObjectURL(vidElement.src);
var sourceBuffer = msource.addSourceBuffer(mime);
var videoUrl = "https://vjs.zencdn.net/v/oceans.mp4";
fetch(videoUrl)
.then(function(response) {
return response.arrayBuffer();
})
.then(function(arrayBuffer) {
console.log("object", arrayBuffer.byteLength);
sourceBuffer.addEventListener("updateend", function(_) {
console.log(msource.readyState);
if (!sourceBuffer.updating &&
mediaSource.readyState === "open"
) {
msource.endOfStream();
}
videoTag.play();
});
sourceBuffer.appendBuffer(arrayBuffer);
})
.catch(e => console.log(e));
}
};
</script>
解决方案
推荐阅读
- reactjs - Jest + Enzyme 单元测试字典
- php - 如何通过更改 PHP 中的输出来处理自定义 url 参数
- python - 将多个参数传递给 Python __name__=="__main__"
- android - Android Studio 空白 CoordinatorLayout 设计器
- regex - 搜索/替换正则表达式和文本
- json - 使用 Jackson 库从 Scala 中的 mapFields 创建 JSON
- django - 使用 AppConfig 导入信号不起作用 Django 2.08
- python - 如何在flask-sqlalchemy的一行中同时包含SELECT语句中的SUM、COUNT
- javascript - JDK 8 Nashorn Javascript 引擎限制
- android - AppCompat MODE_NIGHT_AUTO 事件监听器