HTML5 javascript 视频“播放事件”在 ios 上未触发

问题描述 投票:0回答:1

我尝试在 html5 应用程序中启动用户相机。在我的电脑上,这工作正常,但在 iPhone(chrome 和 safari)上测试此功能时,不会触发事件播放。

我创建了一个简约的 html 页面来测试这一点。

<!DOCTYPE html>
<html>
    <head>
        
    </head>
    <body onload="pageLoaded()"> </body>
    <script >
        async function startCamera() {
            let stream = await navigator.mediaDevices.getUserMedia({ video: {facingMode: 'user'}, audio: false});
            if(!stream) return;
            let video = document.createElement("video");
            video.srcObject = stream;
            video.oncanplay = (ev) => {
                console.log("video can play");
                video.oncanplay = "";
            }
            video.onplaying = (ev) => {
                console.log("video is playing");
            }
            video.play();
        }


        function pageLoaded() {
            startCamera();
        }
    </script>
</html>

在移动设备上,我使用 chrome://inspect 查看日志。 显示“视频可以播放”,但从未显示“视频正在播放”。

在我的台式电脑上,这工作得很好。 不过我没有测试 firefox、edge 和 opera... 而且我没有 Android 设备来测试这个。 但当我查找规范时,它显示每个现代浏览器都支持“播放”事件。

有人知道我在这里缺少什么吗?是否需要额外提出用户权限请求?我需要等待另一个事件来链接事件吗?

经过另一次测试(感谢评论),这段代码可以工作。 诀窍似乎是单击视频元素来播放相机视频流。这是代码:

<!DOCTYPE html>
<script >
    async function startCamera() {
        let stream = await navigator.mediaDevices.getUserMedia({ video: {facingMode: 'user'}, audio: false});
        if(!stream) return;
        let video = document.createElement("video");
        video.style.width = 400;
        video.style.height = 400;
        video.style.border = "1px solid red";
        document.body.appendChild(video);
        

        video.srcObject = stream;
        video.oncanplay = (ev) => {
            console.log("video can play");
            video.oncanplay = "";
        }
        video.onplaying = (ev) => {
            console.log("video is playing");
        }
        video.onclick = () => { video.play();}
        //video.play();
    }


    function pageLoaded() {
        startCamera();
    }
</script>

如果用户不必进行点击,那就太好了,但我想现在我会这样使用它,直到我弄清楚如何解决这个问题。感谢帮助。

javascript html events camera playing
1个回答
0
投票

我做了一些进一步的测试。看来,您不必将视频元素添加到文档中。但在移动设备上,您无法自动启动视频,而必须用户“单击”某些内容才能主动启动视频。

这是一段代码来展示 ios 上的行为。

<!DOCTYPE html>
<script >
    async function startCamera() {
        let stream = await navigator.mediaDevices.getUserMedia({ video: {facingMode: 'user'}, audio: false});
        if(!stream) return;
        let video = document.createElement("video");
        
        let btn = document.createElement("button");
        btn.innerHTML = "click me";
        document.body.appendChild(btn);
        btn.onclick = () => {video.play(); } //THIS WORKS

        video.srcObject = stream;
        video.oncanplay = (ev) => {
            console.log("video can play");
            video.oncanplay = "";
            //video.play(); //THIS DOESN'T WORK
        }
        video.onplaying = (ev) => {
            console.log("video is playing");
        }
        video.onclick = () => { video.play();} //THIS WORKS
        //video.play(); THIS DOESN'T WORK
    }


    function pageLoaded() {
        startCamera();
    }
</script>

因此,“单击”视频元素就可以了(然后您必须添加它),或者“单击”某个按钮也可以达到目的。 不过有一件事。如果我不显示视频元素(未添加到文档或显示=无),我的手机上的相机屏幕将保持黑色。在网站上显示视频元素时,我正在看着相机。

© www.soinside.com 2019 - 2024. All rights reserved.