我正在尝试从 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/