为什么iPad/iOS上原生相机分辨率-vs- getUserMedia的差异?

asc*_*yun 6 javascript ios webrtc getusermedia

我已经为使用getUserMedia的iPad构建了这个Web应用程序,并将生成的视频流式传输到网站上的视频元素.我正在使用的型号是iPad Air,后置摄像头分辨率为1936x2592.目前,getUserMedia方法的约束是:

video: {
    facingMode: 'environment',
    width: { ideal: 1936 },
    height: { ideal: 2592 }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我拉入视频时,它看起来相当颗粒感.通过控制台日志挖掘以获取流,视频轨道以及该轨道的设置,看起来视频的分辨率已缩小到720x1280.这有什么特别的原因吗?webRTC/getUserMedia可以处理的最大分辨率是多少?

Mar*_*cus 9

编辑 - ImageCapture

如果60FPS视频不是一项硬性要求,并且您对兼容性有所了解,您可以轮询ImageCapture来模拟相机并从相机接收更清晰的图像.

您必须检查客户端支持,然后可能回退MediaCapture.

该API可控制相机功能,如变焦,亮度,对比度,ISO和白平衡.最重要的是,Image Capture允许您访问任何可用设备摄像头或网络摄像头的全分辨率功能.以前用于在Web上拍照的技术使用了视频快照(MediaCapture渲染到Canvas),其分辨率低于静止图像的分辨率.

https://developers.google.com/web/updates/2016/12/imagecapture

和它的polyfill:

https://github.com/GoogleChromeLabs/imagecapture-polyfill


MediaCapture

有点长的回答......主要是在过去几年中从AR Web和Native应用程序中学习.

如果您的相机仅允许1920x1080,1280x720和640x480分辨率,则Media Capture的浏览器实施可以模拟来自1280x720的480x640馈送.从测试(主要是Chrome)开始,浏览器通常将720缩小到640,然后裁剪中心.有时当我使用虚拟相机软件时,我看到Chrome在非支持的分辨率周围添加了人工黑色填充.客户看到成功消息和正确尺寸的馈送,但一个人会看到质量下降.由于此仿真,您无法保证Feed正确或不缩放.但是,它通常会具有所需的正确尺寸.

您可以在此处阅读约束.它基本归结为:给我一个接近x的分辨率.然后,浏览器根据自己的实现确定拒绝约束并抛出错误,获取分辨率或模拟分辨率.

有关此设计的更多信息,请参阅mediacapture规范.特别:

RTCPeerConnection是一个有趣的对象,因为它同时作为网络流的接收器和源.作为一个水槽,其具有源转型能力(例如,降低的比特率,缩放/下拉分辨率,并且调节的帧速率),并且作为源其可以具有其自己的设置由一轨道源改变.

其主要原因是允许n个客户端访问相同的媒体源,但可能需要不同的分辨率,比特率等,因此仿真/扩展/转换尝试解决此问题.对此的否定是你永远不知道源解析是什么.

因此,要回答您的具体问题:Apple已在Safari中确定应在何时何地缩放分辨率.如果你不够具体,你可能会遇到这种颗粒状的外观.我发现如果你使用min,max和exact的约束,你会得到一个更清晰的iOS摄像头.如果不支持该分辨率,它将尝试并模拟它,或拒绝它.