核心是通过媒体捕捉API获取设备能力并传入约束参数:浏览器用MediaTrackConstraints设ideal/min/max值,Android查supportedSizes后setVideoSize/setVideoFrameRate,Windows用MediaCaptureVideoProfile或编码属性筛选;均需处理权限、兼容性fallback及实际生效值校验。

获取和调整摄像头分辨率与帧率,核心在于通过媒体捕捉 API 获取设备能力列表,并在请求媒体流或配置录制器时传入明确的约束参数。不同平台实现方式有差异,但逻辑一致:先查支持项,再设目标值,最后处理兼容性 fallback。
浏览器端(MediaDevices API)
使用 navigator.mediaDevices.getUserMedia() 请求流时,可通过 MediaTrackConstraints 指定理想或强制的分辨率与帧率:
- 宽度/高度支持
min、ideal、max三档,例如{ width: { ideal: 1280 }, height: { ideal: 720 } };浏览器会尽力匹配,不保证一定生效 - 帧率同理,如
frameRate: { ideal: 30, max: 60 };过高设置可能被降级,尤其在低性能设备或弱光环境下 - 调用后应检查实际流属性:
stream.getVideoTracks()[0].getSettings()可读取最终生效的宽高、帧率等,用于后续逻辑适配 - 若需动态切换,需停止当前轨道并重新调用
getUserMedia,不能直接修改已激活流的约束
Android(MediaRecorder / Camera2)
在录制前通过 MediaRecorder 或 CameraCharacteristics 显式设置:
-
setVideoSize(int width, int height)设定输出分辨率;必须在prepare()前调用 -
setVideoFrameRate(int fps)设置帧率;注意部分设备仅支持特定整数帧率(如 15/24/30/60),非标准值会被四舍五入或拒绝 - 更稳妥的做法是先查询支持列表:
parameters.getSupportedPreviewSizes()和getSupportedVideoSizes(),从中选择最接近目标的尺寸 - 比特率也影响质量:
setVideoEncodingBitRate(int bps)配合分辨率使用,例如 1280×720 @ 30fps 建议 ≥3 Mbps
Windows(MediaCapture / WinUI)
UWP 或 WinUI 应用中,依赖 MediaCapture 的编码属性系统:
- 通过
GetAvailableMediaStreamProperties(MediaStreamType.VideoRecord)获取设备支持的所有视频编码属性(含分辨率、帧率、格式) - 筛选时注意纵横比一致性:预览流与录制流可能共享硬件引脚,若设置不匹配易导致黑屏或异常;可用
VideoDeviceCharacteristic判断是否独立 - 设置时使用
VideoEncodingProperties.CreateUncompressed或CreateH264构造目标属性,再传给PrepareLowLagRecordToStorageFileAsync等方法 - 推荐优先使用 相机配置文件(MediaCaptureVideoProfile),它封装了经验证的分辨率+帧率+编码组合,避免手动试错
通用注意事项
跨平台调整时需关注几个共性要点:
- 权限必须提前声明并获得用户授权,否则
getUserMedia或MediaRecorder.prepare()会直接失败 - 并非所有分辨率/帧率组合都被支持,尤其是高帧率+高分辨率同时启用时,设备可能只支持其中一项
- 某些摄像头固件对 YUV/MJPEG/H.264 编码格式的支持程度不同,格式选择会影响可设的最大分辨率
- 移动端需考虑后台运行限制——iOS Safari 不支持后台媒体流,Android 部分厂商系统会在切后台时中断预览

















