我为iPad创建了此Web应用程序,该应用程序使用getUserMedia并将生成的视频流传输到网站上的video元素。我使用的型号是iPad Air,后置摄像头分辨率为1936x2592。当前,getUserMedia方法的约束为:
video: {
facingMode: 'environment',
width: { ideal: 1936 },
height: { ideal: 2592 }
}
但是,当我插入视频时,它看起来有点粗糙。在控制台日志中浏览以获取流,视频轨道以及该轨道的设置,看来视频的分辨率已缩小为720x1280。有什么特殊原因吗? webRTC / getUserMedia是否可以处理最大分辨率?
答案 0 :(得分:7)
编辑-ImageCapture
如果对60FPS视频的要求不是很高,并且兼容性尚可,则可以轮询ImageCapture来模拟摄像机,并从摄像机接收更清晰的图像。
您必须检查客户端支持,然后潜在地回退MediaCapture。
API可以控制相机的功能,例如缩放,亮度,对比度,ISO和白平衡。最重要的是,Image Capture允许您访问任何可用的设备相机或网络摄像头的全分辨率功能。以前在网络上拍摄照片的技术使用的是视频快照(将MediaCapture渲染到Canvas),其分辨率低于静态图像的分辨率。
https://developers.google.com/web/updates/2016/12/imagecapture
及其polyfill:
https://github.com/GoogleChromeLabs/imagecapture-polyfill
MediaCapture
答案很长……在过去几年中,主要是通过研究AR Web和本机应用程序来学习。
如果您的相机仅允许1920x1080、1280x720和640x480分辨率,则Media Capture的浏览器实现可以模拟1280x720的480x640提要。通过测试(主要是Chrome),浏览器通常会将720缩小到640,然后裁剪中心。有时,当我使用虚拟相机软件时,我看到Chrome在不支持的分辨率周围添加了人工黑色填充。客户会看到一条成功消息和正确尺寸的提要,但一个人会看到质的下降。由于存在这种仿真,因此无法保证Feed正确或未按比例缩放。但是,它通常具有要求的正确尺寸。
您可以了解约束here。基本上可以归结为:给我一个接近x的分辨率。然后,浏览器通过自己的实现确定拒绝约束并引发错误,获取分辨率或模拟分辨率。
有关此设计的更多信息,请参见mediacapture规范。特别是:
RTCPeerConnection是一个有趣的对象,因为它同时充当网络流的接收器和源。作为接收器,它具有源转换功能(例如,降低比特率,放大/缩小分辨率和调整帧速率),作为源,它可以通过轨道源更改其自身的设置。
这样做的主要原因是允许n个客户端访问相同的媒体源,但可能需要不同的分辨率,比特率等,因此尝试通过仿真/缩放/转换来解决此问题。不利的一面是您永远无法真正知道源分辨率是多少。
因此可以回答您的特定问题:Apple已确定在Safari中应在何时何地缩放哪些分辨率。如果您不够具体,则可能会遇到这种粗糙的外观。我发现如果您将约束与最小,最大和精确值一起使用,则会获得更清晰的iOS相机供稿。如果不支持该分辨率,它将尝试模拟或拒绝它。