为什么 iPad / iOS 上的原生相机分辨率 -vs- getUserMedia 存在差异?
Why the difference in native camera resolution -vs- getUserMedia on iPad / iOS?
我为 iPad 构建了这个网络应用程序,它使用 getUserMedia 并将生成的视频流式传输到网站上的视频元素。我使用的型号是 iPad Air,后置摄像头分辨率为 1936x2592。目前 getUserMedia 方法的约束是:
video: {
facingMode: 'environment',
width: { ideal: 1936 },
height: { ideal: 2592 }
}
但是,当我打开视频时,它看起来很粗糙。挖掘控制台日志以获取流、视频轨道,然后是该轨道的设置,视频的分辨率似乎已缩小到 720x1280。这有什么特别的原因吗?是否有 webRTC/getUserMedia 可以处理的最大分辨率?
编辑 - ImageCapture
如果 60FPS 视频不是硬性要求并且您在兼容性方面有余地,您可以轮询 ImageCapture 以模拟相机并从相机接收更清晰的图像。
您将不得不检查客户端支持,然后可能回退到 MediaCapture。
The API enables control over camera features such as zoom, brightness, contrast, ISO and white balance. Best of all, Image Capture allows you to access the full resolution capabilities of any available device camera or webcam. Previous techniques for taking photos on the Web have used video snapshots (MediaCapture rendered to a Canvas), which are lower resolution than that available for still images.
https://developers.google.com/web/updates/2016/12/imagecapture
及其 polyfill:
https://github.com/GoogleChromeLabs/imagecapture-polyfill
媒体捕捉
有点长的答案......主要是从过去几年的 AR Web 和 Native 应用程序中学习。
如果您的相机仅支持 1920x1080、1280x720 和 640x480 分辨率,则 Media Capture 的浏览器实现可以从 1280x720 模拟 480x640 的提要。从测试(主要是 Chrome)来看,浏览器通常将 720 缩小到 640,然后裁剪中心。有时当我使用虚拟相机软件时,我看到 Chrome 在不受支持的分辨率周围添加了人工黑色填充。客户看到一条成功消息和正确尺寸的提要,但一个人会看到质量下降。由于此模拟,您无法保证提要正确或未缩放。但是,它通常会具有所要求的正确尺寸。
您可以阅读约束 here。它基本上可以归结为:给我一个接近 x 的分辨率。然后浏览器根据自己的实现决定是拒绝约束并抛出错误,获取解决方案,还是模拟解决方案。
此设计的更多信息在 mediacapture 规范中有详细说明。特别是:
The RTCPeerConnection is an interesting object because it acts simultaneously as both a sink and a source for over-the-network streams. As a sink, it has source transformational capabilities (e.g., lowering bit-rates, scaling-up / down resolutions, and adjusting frame-rates), and as a source it could have its own settings changed by a track source.
这样做的主要原因是允许 n 个客户端访问相同的媒体源,但可能需要不同的分辨率、比特率等,因此 emulation/scaling/transforming 试图解决这个问题。不利的是您永远不知道源分辨率是什么。
因此回答您的具体问题:Apple 已在 Safari 中确定应在何时何地缩放哪些分辨率。如果你不够具体,你可能会遇到这种颗粒状的外观。我发现如果你使用最小、最大和精确的约束,你会得到更清晰的 iOS 相机画面。如果不支持该分辨率,它将尝试模拟它,或者拒绝它。
我为 iPad 构建了这个网络应用程序,它使用 getUserMedia 并将生成的视频流式传输到网站上的视频元素。我使用的型号是 iPad Air,后置摄像头分辨率为 1936x2592。目前 getUserMedia 方法的约束是:
video: {
facingMode: 'environment',
width: { ideal: 1936 },
height: { ideal: 2592 }
}
但是,当我打开视频时,它看起来很粗糙。挖掘控制台日志以获取流、视频轨道,然后是该轨道的设置,视频的分辨率似乎已缩小到 720x1280。这有什么特别的原因吗?是否有 webRTC/getUserMedia 可以处理的最大分辨率?
编辑 - ImageCapture
如果 60FPS 视频不是硬性要求并且您在兼容性方面有余地,您可以轮询 ImageCapture 以模拟相机并从相机接收更清晰的图像。
您将不得不检查客户端支持,然后可能回退到 MediaCapture。
The API enables control over camera features such as zoom, brightness, contrast, ISO and white balance. Best of all, Image Capture allows you to access the full resolution capabilities of any available device camera or webcam. Previous techniques for taking photos on the Web have used video snapshots (MediaCapture rendered to a Canvas), which are lower resolution than that available for still images.
https://developers.google.com/web/updates/2016/12/imagecapture
及其 polyfill:
https://github.com/GoogleChromeLabs/imagecapture-polyfill
媒体捕捉
有点长的答案......主要是从过去几年的 AR Web 和 Native 应用程序中学习。
如果您的相机仅支持 1920x1080、1280x720 和 640x480 分辨率,则 Media Capture 的浏览器实现可以从 1280x720 模拟 480x640 的提要。从测试(主要是 Chrome)来看,浏览器通常将 720 缩小到 640,然后裁剪中心。有时当我使用虚拟相机软件时,我看到 Chrome 在不受支持的分辨率周围添加了人工黑色填充。客户看到一条成功消息和正确尺寸的提要,但一个人会看到质量下降。由于此模拟,您无法保证提要正确或未缩放。但是,它通常会具有所要求的正确尺寸。
您可以阅读约束 here。它基本上可以归结为:给我一个接近 x 的分辨率。然后浏览器根据自己的实现决定是拒绝约束并抛出错误,获取解决方案,还是模拟解决方案。
此设计的更多信息在 mediacapture 规范中有详细说明。特别是:
The RTCPeerConnection is an interesting object because it acts simultaneously as both a sink and a source for over-the-network streams. As a sink, it has source transformational capabilities (e.g., lowering bit-rates, scaling-up / down resolutions, and adjusting frame-rates), and as a source it could have its own settings changed by a track source.
这样做的主要原因是允许 n 个客户端访问相同的媒体源,但可能需要不同的分辨率、比特率等,因此 emulation/scaling/transforming 试图解决这个问题。不利的是您永远不知道源分辨率是什么。
因此回答您的具体问题:Apple 已在 Safari 中确定应在何时何地缩放哪些分辨率。如果你不够具体,你可能会遇到这种颗粒状的外观。我发现如果你使用最小、最大和精确的约束,你会得到更清晰的 iOS 相机画面。如果不支持该分辨率,它将尝试模拟它,或者拒绝它。