javascript - 在移动浏览器中以 60 FPS 的速度捕获视频

标签 javascript android google-chrome html5-video

我正在尝试从 Chrome Android 中的网络应用程序以 60 FPS 的速度捕获视频。我有合适的video.frameRate为调用 getUserMedia 设置的约束. Chrome 识别 frameRate通过视频轨道设置设置并报告它以 60 FPS 的速度捕获,但视觉上视频仅为 30 FPS 而不是 60。在同一设备上通过股票 Android 相机应用程序以与我相同的分辨率捕获流畅的 60 FPS 视频尝试通过网络应用程序。
我正在 Pixel 3a 上使用 Chrome Android 84 进行测试。我还在其他手机上测试了这些手机支持 60 FPS 的分辨率,而不管它仅以 30 FPS 捕获。
下面是演示此行为的示例代码。
我怎样才能做到这一点?还是 Chrome Android 目前无法以 60 FPS 捕获?

<html>
<head>
    <title>frameRate</title>
    <script>
        if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
            var constraints = {
                video: {
                    width: { exact: 1920 },
                    height: { exact: 1080 },
                    facingMode: { ideal: "environment" },
                    frameRate: { exact: 60 }
                }
            };
            navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
                var video = document.getElementById('video');
                video.srcObject = stream;
                video.play();
                document.getElementById('frameRate').innerHTML = 'frameRate: ' + stream.getTracks()[0].getSettings().frameRate;
            });
        }
    </script>
</head>

<body>
    <p id="frameRate"></p>
    <video id="video" width="1920" height="1080"></video>
</body>
</html>

最佳答案

它没有使用硬件加速的视频编码,因此由于编码受到可用 CPU 资源的限制,因此无法以这种速率进行捕获。通过一些基本测试,Pixel 3a 的所有 4 个内核都达到了 100%,导致视频捕捉断断续续。MediaRecorder在 Chrome Android 上,一般只支持 VP8 和 VP9 视频编解码器进行编码。我用 https://stackoverflow.com/a/64656254/2281056 的代码对此进行了测试.作为一个古怪的行为,Chrome Android 似乎错误地报告它支持格式为 ${type};codecs:${codec} 的类型。所以我删除了这些。
在硬件方面,Pixel 3a 使用 Qualcomm Snapdragon 670。来自 specifications它仅支持 HEVC (h.265) 格式的视频捕获。
综上所述,Chrome Android 仅支持 VP8 或 VP9 的视频捕获,但大多数 Android 硬件不为这些格式提供硬件加速,导致捕获质量不佳。

关于javascript - 在移动浏览器中以 60 FPS 的速度捕获视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63210220/

相关文章:

javascript - 为什么使用模板字符串时可以不用括号调用函数?

java - RuntimeException : Unable to start activity(MainActivity cannot be cast to android. View .View$OnClickListener)

javascript - 尝试生成页面时在 Gatsby 中获取 "Exported queries are only executed for Page components."

Android布局重用, "exporting"属性可能吗?

Android 将文件写入内部存储问题

html - CSS 选择器优先级

reactjs - 自 M91 起,SharedArrayBuffer 将需要跨域隔离,大约在 2021 年 5 月

javascript - 如何将 chrome.alarms.getAll 回调设置为变量?

javascript - 第三方嵌入式视频的 SSL 证书

javascript - 使用 lambda/callback 从列表中获取元素 - 相当于 Array.prototype.find() 的 JS