Web前端技术 2020-04-23 14:26 采纳率: 0%
浏览 643

在html下如何实现摄像头录制的视频实时显示在当前页面中的另一个video中?

现在有个项目,在同html中有两个video,一个video打开摄像头录制视频,另一个video实时显示录制的视频,利用MediaRecoder、MediaSouce,求大神指导,代码如下:

test.html

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <title>摄像头调用</title>
    <style>
        #test {
            width: 200px;
            height: 200px;
        }
    </style>
</head>

<body>
    <video id="v"></video>
    <video id="test"></video>
    <button onclick="openCamera()">启用摄像头</button>
    <script>
        var video = document.querySelector('#v');
        var testVideo = document.querySelector('#test');
        var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
        var sourceBuffer;
        var mediaRecorder;
        var mediaStream;

        // 接收视频并展示
        var mediaSource = new MediaSource();
        testVideo.src = URL.createObjectURL(mediaSource);

        mediaSource.addEventListener('sourceopen', (event) => {
            console.log('mediaSource打开:', event);
            sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);

            sourceBuffer.addEventListener('updateend', (event) => {
                console.log('sourceBuffer更新结束:', event);
                mediaSource.endOfStream();
                testVideo.play();
            });
        });

        function openCamera() {
            var constraints = { audio: true, video: { width: 100, height: 100 } };

            navigator.mediaDevices.getUserMedia(constraints)
                .then(stream => {
                    mediaStream = stream;
                    console.log('mediaStream-', mediaStream);

                    video.srcObject = mediaStream;
                    video.onloadedmetadata = function (e) {
                        console.log('视频可以使用', e);
                        console.dir(video);
                        video.play();
                    };


                    mediaRecorder = new MediaRecorder(mediaStream);

                    mediaRecorder.ondataavailable = (event) => {
                        event.data.arrayBuffer()
                            .then(data => {
                                sourceBuffer.appendBuffer(data);
                                console.log('正确正确');
                            }
                        );
                    }

                    mediaRecorder.start(1000);
                })
                .catch(err => { console.log(err.name + ": " + err.message); });
        }
    </script>
</body>

</html>

然后打开摄像头之后就会报如下的错误:
图片说明

  • 写回答

1条回答 默认 最新

  • wem520 2020-04-23 15:50
    关注

    看你的代码应该是没有给testvideo赋值播放源吧

    评论

报告相同问题?

悬赏问题

  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效