首页 > 解决方案 > 将 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>

标签: javascripthtmlvideohtml5-video

解决方案


推荐阅读