使用浏览器 Web API,我想设置 MediaDevices.getUserMedia
约束属性,适合记录音频语音(语音消息),例如设置这些参数:
这是我的代码:
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
还有 blob,重新玩了
Audio(audioUrl(blob)).play()
, 不玩 .奇怪的。但如果约束只是:const mediaStreamConstraints = { audio: true }
我检查了浏览器控制台,没有看到任何错误
navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
API 调用。顺便说一句,我在这里遵循了指导方针:
请注意,我的用户代理是:
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(...)
。这至少不是最后一个错误吗?我的问题是:
有什么方法可以按要求获得采样率/位深度?
或者音频格式是“硬编码”/由浏览器实现决定的?
BTW, The reason of audio parameters formats is because I want to minimize audio blob size to minimize bandwidth in websocket communications between the browser client and the server, optimizing audio blob exchanges for speech (voice messages)
最佳答案
首先检查浏览器的功能:
let stream = await navigator.mediaDevices.getUserMedia({audio: true});
let track = stream.getAudioTracks()[0];
console.log(track.getCapabilities());
演示输出:autoGainControl: (2) [true, false]
channelCount: {max: 2, min: 1}
deviceId: "default"
echoCancellation: (2) [true, false]
groupId: "1e76386ad54f9ad3548f6f6c14c08e7eff6753f9362d93d8620cc48f546604f5"
latency: {max: 0.01, min: 0.01}
noiseSuppression: (2) [true, false]
sampleRate: {max: 48000, min: 48000}
sampleSize: {max: 16, min: 16}
关于audio - MediaDevices.getUserMedia() 如何设置音频约束(采样率/位深度)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62392352/