使用浏览器 Web API,我想设置MediaDevices.getUserMedia
约束属性,适合录制音频语音(语音消息),例如设置这些参数:
- 单核细胞增多症
- 16位
- 16KHz
这是我的代码:
const mediaStreamConstraints = {
audio: {
channelCount: 1,
sampleRate: 16000,
sampleSize: 16,
volume: 1
},
video: false
}
navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
.catch( err => serverlog(`ERROR mediaDevices.getUserMedia: ${err}`) )
.then( stream => {
// audio recorded as Blob
// and the binary data are sent via socketio to a nodejs server
// that store blob as a file (e.g. audio/inp/audiofile.webm)
} )
录制的剪辑被抓取并存储(使用MediaRecorder
API),最终发送到 nodejs 服务器,在那里将 blob 保存为文件并进行处理(应用程序是语音机器人)。
出了点问题,WebM 保存的文件没有所需的参数:
$ mediainfo audio/inp/audiofile.webm
General
Complete name : audio/inp/audiofile.webm
Format : WebM
Format version : Version 4 / Version 2
File size : 2.04 KiB
Writing application : Chrome
Writing library : Chrome
IsTruncated : Yes
Audio
ID : 1
Format : Opus
Codec ID : A_OPUS
Channel(s) : 1 channel
Channel positions : Front: C
Sampling rate : 48.0 kHz
Bit depth : 32 bits
Compression mode : Lossy
Language : English
Default : Yes
Forced : No
例如
Sampling rate : 48.0 kHz
Bit depth : 32 bits
但是约束意味着不同的值:
Sampling rate : 16 kHz
Bit depth : 16 bits
Audio(audioUrl(blob)).play()
同样,用 anew 播放的blob也不播放。诡异的。但是,如果约束只是:
const mediaStreamConstraints = { audio: true }
我检查了浏览器控制台,没有看到任何navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
API 调用错误。
顺便说一句,我在这里遵循了指导方针:
- https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
- https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
请注意,我的用户代理是:(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
我使用的是最后一个 Brave 浏览器版本)。
在我看来,浏览器不允许的任何音频约束设置:
- 破坏了音频斑点,
- 没有引发错误异常(我同时捕获了
navigator.mediaDevices.getUserMedia()
和new MediaRecorder(...)
。这不是最后一个错误吗?
我的问题是:
有什么方法可以根据要求获得采样率/位深度?
或者音频格式是“硬编码”/由浏览器实现决定的?
顺便说一句,音频参数格式的原因是因为我想最小化音频 blob 大小以最小化浏览器客户端和服务器之间的 websocket 通信中的带宽,优化语音(语音消息)的音频 blob 交换