getUserMedia()音频约束

作者:addpipe.com(原文链接

翻译:刘通

原标题:Supported Audio Constraints in getUserMedia()

相关文章:getUserMedia()视频约束

audio-constraints1

getUserMedia()音频约束

媒体捕捉和流规范管理着所有浏览器应该实现的跨浏览器音频选项,并且在最新的候选推荐标准中,定义了不少的音频约束。

下面是完整的清单,还附有说明和我对数字声音工作原理的解释:

# sampleRate:指定一个所需的采样率,不确定它应该被用作编码设置还是作为硬件要求,越高越好(比如CD的采样率就是44000 samples/s或44kHz)。

# sampleSize:每个采样点大小的位数,越高越好(CD的采样大小为16 bits/sample)

# volume:从0(静音)到1(最大音量)取值,被用作每个样本值的乘数

# echoCancellation:是否使用回声消除来尝试去除通过麦克风回传到扬声器的音频

# autoGainControl:是否要修改麦克风的输入音量

# noiseSuppression:是否尝试去除音频信号中的背景噪声

# latency:以秒为单位,控制开始处理声音和下一步可以使用数据之间的时间,想不明白你为什么想要设更高的延迟,但是音频编解码器的延时确实有所不同。

# channelCount:规定了单声道的时候为1,立体声的时候为2。

这是一个令人惊讶的综合列表,其中大部分的内容都没有被浏览器广泛支持。有一些内容是新加入的(autoGainControl和noiseSuppression),这些内容还没来的及被浏览器支持还是可以理解的,但是其他一些内容(sampleRate,sampleSize和echoCancellation)早在2014年2月的时候就存在了,可是也没有得到广泛支持。增加对这些约束的支持将会为开发者提供很多关于Opus的灵活性。

浏览器支持(包括Safari 11

我使用MediaStreamTrack.getSettings()来记录每个浏览器支持的设置,因为MediaDevices.getSupportedConstraints()会返回太多的误报。我还测试了最新版本的Chrome,Firefox和Safari浏览器,以确保改变约束真的有作用。

 

Chrome 62

Firefox 56

Safari 11

echoCancellation

支持,默认值是on

支持,默认值是on

支持,默认值是on

sampleRate

固定值: 48000

固定值: 48000

固定值: 44100

noiseSuppression

默认开启,约束不被支持

支持,默认值为true

autoGainControl

默认开启,约束不被支持

支持,默认值为false

channelCount

支持,默认记录最大avb.声道

volume

支持,默认为1

通过getUserMedia()使用音频约束

所有约束都可以作为约束对象内的音频对象属性发送给getUserMedia()。下面的例子使用了基于getUserMedia()的更新的promise:

audio-constraints2

如果你只是想使用浏览器默认的设置,只要给音频对象赋值为true就可以了:

audio-constraints3

Firefox 55和56版中的立体声音频录制

Firefox 55增加了对立体声录音的支持,所以我就可以使用这些设备来录制有双声道的视频了:

# 罗技C925e(双麦克风)

# 老款的罗技C920(双麦克风)

# 15英寸2017款MacBook PRO(三麦克风)

audio-constraintsnew4

罗技C925e的声道分配非常清晰,麦克风艰巨很大,而MacBook Pro的三个麦克风都在键盘的右侧且排列很密集。

Firefox 56还增加了对channelCount约束的支持,这意味着我可以从立体声录音(此为使用具有双麦克风网络摄像头录像时的默认情况)切换到单声道录音,从而占用更少的带宽。下面是如何请求单声道流:

audio-constraints4

值为0(默认值)告诉getUserMedia()捕获所有可用的支持的声道。

Chrome 62版本只能录制单声道音频,如果设置channelCount约束为2的话不起作用。

回声消除,噪声抑制和自动增益

echoCancellation约束在Chrome,Firefox和Safari 11中是默认工作的。这有一个demo,通过这个非静音的MediaRecorderAPI demo来录制音频的时候效果十分明显。它在Firefox上很激进,比Chrome上要激进的多。

下面是可以与支持它的用户代理一起使用的约束,但默认情况下不会将其打开:

audio-constraints5

noiseSuppression在Firefox中运行堪称完美,当关掉这个约束时,我能非常清晰的听到麦克风收录进来的噪声:

audio-constraints6

即使Chrome不支持该约束,也绝对会应用噪声抑制功能。

Safari 11目前还不支持噪声抑制。

autoGainControl作为一项约束目前只在Firefox上工作,而且还是默认关闭的。下面是如何打开它的方法:

audio-constraints7

在打开它之后,如果你对着麦克风大喊大叫,就能明显的感受到音量被降下来了。

Chrome默认是使用自动增益的,但是你不能通过autoGainControl约束来控制它,如果想把它关闭你需要设置老版本的{mandatory: {googAutoGainControl: false}}。当在macOS上进行测试时,输入电平指针往左调了一点,因为我把麦克风往更靠近声源的地方移动了。

audio-constraints8

关键字

关键字(min,max,exact和ideal)也适用于这些音频约束。根据规范,在上面的例子中,channelCount属性应该被视为一个ideal属性,它应该产生与此相同的结果:

audio-constraints9

请求两个声道的更复杂些的约束是这样:

audio-constraints10

如果想要精确的请求双声道音频,需要:

audio-constraints11

如果设备没有双麦克风网络摄像头的话,上述约束将导致OverconstrainedError。有关更多详细信息,请点击此链接查看常见的getUserMedia错误。

填写常用邮箱,接收社区更新

WebRTC 中文社区由

运营