WebRTC源码研究(13)音频约束
本篇博客 下载地址:点击这里下载
1. WebRTC音频设置api
在浏览器中,webrtc允许你使用如下代码去设置视频,音频参数:
var constraints = {
// 表示同时采集视频金和音频
video : {
width: 640, // 宽带
height: 480, // 高度
frameRate:15, // 帧率
facingMode: 'enviroment', // 设置为后置摄像头
deviceId : deviceId ? deviceId : undefined // 如果deviceId不为空直接设置值,如果为空就是undefined
},
audio : {
noiseSuppression: true, // 降噪
echoCancellation: true // 回音消除
},
}
// 从指定的设备中去采集数据
navigator.mediaDevices.getUserMedia(constraints)
.then(gotMediaStream) // 使用Promise串联的方式,获取流成功了
.then(gotDevices)
.catch(handleError);
如上面代码中的 :noiseSuppression: true, // 降噪 echoCancellation: true // 回音消除
这些属性就是设置音频参数的api了,类似的还有如下这些:
api | 含义 | 使用说明 |
---|---|---|
volume | 音量大小 | 数值是从0到1.0,0就是静音 ,1.0就是最大音量。 |
sampleRate | 采样率 | 在音频里面有很多前人已经调好的采样率,固定的几个如:四万八,三万二,一万六,八千等,根据自己的需要设置就好了 |
sampleSize | 采样大小 | 每一个采样大小是由多少位表示,一般情况下我们都是用16位,也就是两个字节 |
echoCancellation | 回音消除 | 一个bool类型的值,用来开启关闭回音消除功能。我们在开启采集 数据之后,是否要开启回音消除,在实时直播的过程中,回音消除是 一个非常重要的功能,当双方通信的时候 ,如果有回音传过来,对这个通话质量会造成极大的影响,设置可以通过true或false来开启或关闭回音消除。 |
autoGainControl | 自动增益 | 一个bool类型的值,用来开启关闭自动增益功能。在我原有的录制的声音的基础上是否给他增加这个音量,它增加的范围也是有一定范围的,这也是一个用 true或false设置的,也就是开始或者关闭 |
noiseSuppression | 降噪 | 一个bool类型的值,用来开启关闭降噪功能。我们在采集数据的时候是否要开启降噪功能 |
latency | 延迟大小 | 直播过程中的音视频,如果latency 设置小的话,就表示它的 视频传输试试通信的时候它的延迟就会小,延迟小的后果就是当你网络状况不好的时候,它就会出现卡顿甚至花屏等质量问题。但是它的好处是我们双方可以实时通信,一般是低于500毫秒,这是非常好的一个质量了。当然最好的是200毫秒以内,从采集到编码到传输到对方接受且解码再到渲染整个过程中是200毫秒以内是最好的 。我们正常通话应该是这样一个延迟。我们感受500毫秒还可以,再往上800毫秒 就比较大了。如果你的latency 设置的大,它的好处是你的画面比你声音更平滑,但是它这种及时性,就是说如果做实时通信的话 ,就会很麻烦,你说了一句话,你过了一秒多,对方才听到,在回答你又过了一秒。这种交互的话就没法忍受了。 |
channelCount | 声道数量,表示单声道还是双声道 | 一般情况下我们会使用单声道,如果是对于一些乐器,都是双声道,这样的话音质才更好。 |
deviceID | 设备ID,用来区分硬件设备 | devideID就是当我有多个输入输出设备的时候,我可以进行设备的切换 ,比如在手机上当我改变了devideID之后,我从前置摄像头就可以切换到后置摄像头。 |
groupID | 组ID | 是groupID,它代表 是同一个物理设备,对于音频来说,音频的输入输出是同一个物理设备,不同浏览器其实它的实现是不一样的,对于chrome来说它分成了音频的输入输出,对于FireFOX和safari就没有音频的输出,音频视频设备就是一个音频设备。 |
2. 音频约束
上面表中的约束也可以写成最大最小的范围限制,这些 都可以设置,这样它就是一个动态的,它会在这个范围内选择一个最好的,不是说摄像的时候实时变化 ,是说它选择的时候会在这个范围内选择一个最好的。帧率他是可以根据网络的情况去调整的。
如下:
完整音视频约束的JS代码如下:
'use strict'
var audioSource = document.querySelector('select#audioSource');
var audioOutput = document.querySelector('select#audioOutput');
var videoSource = document.querySelector('select#videoSource');
// 获取video标签
var videoplay = document.querySelector('video#player');
// deviceInfos是设备信息的数组
function gotDevices(deviceInfos){
// 遍历设备信息数组, 函数里面也有个参数是每一项的deviceinfo, 这样我们就拿到每个设备的信息了
deviceInfos.