WebRTC里面存在API,以便我们查询自己机子上都有哪些音视频设备。
音视频设备基本原理
1、音频设备
音频输入设备的主要工作是采集音频数据,而采集音频数据的本质就是模数转换(A/D),即将模似信号转换成数字信号。
重要概念:
- 采样率
- 采样大小
模数转换使用的采集原理:奈奎斯特定理
在进行模拟 / 数字信号的转换过程中,当采样率大于信号中最高频率的 2 倍时,采样之后的数字信号就完整地保留了原始信号中的信息。
例子:
人类听觉范围的频率是 20Hz~20kHz 之间。对于日常语音交流(像电话),8kHz 采样率就可以满足人们的需求。但为了追求高品质、高保真,你需要将音频输入设备的采样率设置在 40kHz 以上,这样才能完整地将原始信号保留下来。例如我们平时听的数字音乐,一般其采样率都是 44.1k、48k 等,以确保其音质的无损。
音频设备的工作
采集到的数据再经过量化、编码,成为数字信号
2、视频设备
与音频类似。当实物光通过镜头进入到摄像机后,通过视频设备的模数转化(A/D)模块,即:光学传感器,将光->数字信号,即RGB(Red、Green、Blue)数据
获得 RGB 数据后,还要通过 DSP(Digital Signal Processer)进行优化处理,如自动增强、白平衡、色彩饱和等都属于这一阶段要做的事情。优化处理之后,就得到了24位的真彩色(Red、Green、Blue 每种颜色由8位组成)的图片。
注意:
获得的 RGB 图像只是临时数据。因最终的图像数据还要进行压缩、传输,而编码器一般使用的输入格式为 YUV I420,所以在摄像头内部还有一个专门的模块用于将 RGB 图像转为 YUV 格式的图像。
备注:YUV 也是一种色彩编码方法,主要用于电视系统以及模拟视频领域。它将亮度信息(Y)与色彩信息(UV)分离,即使没有 UV 信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。
设备管理基本概念
WebRTC获取音视频设备列表的API:
MediaDevices.enumerateDevices()
MediaDeviceInfo包含以下三个重要的属性:
- deviceID,设备的唯一标识;
- label,设备名称;
- kind,设备种类,可用于识别出是音频设备还是视频设备,是输入设备还是输出设备。
需要注意的是,出于安全原因,除非用户已被授予访问媒体设备的权限(要想授予权限需要使用 HTTPS 请求),否则 label 字段始终为空。
例子:
if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) { //判断浏览器是否支持MediaDevice接口(老版本浏览器可能不支持)
console.log("enumerateDevices() not supported.");
return;
}
// List cameras and microphones.
navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
devices.forEach(function(device) {
console.log(device.kind + ": " + device.label +
" id = " + device.deviceId);
});
})
.catch(function(err) {
console.log(err.name + ": " + err.message);
});
设备检测
可通过MediaDeviceInfo结构中的kind字段,将设备分类为音频设备或者视频设备。如果需要细分的话,Kind也可分为输出/输入设备。例如:耳机(兼有音频、视频输出设备功能)。除此之外,每种不同种类的设备还会设置各自默认的设备。例如:耳机插入电脑后,耳机成为了音频默认设备;拔出耳机,默认设备有切换成为了系统的音频设备。