MediaRecorder
我正在使用API成功运行充当语音消息发送者的客户端网页:
- 当用户按任意键时,开始录音,
- 当按键被释放时,录音会通过 soketio 发送到服务器进行进一步处理。
这是一种PTT(一键通)用户体验,用户只需按下一个键(推)即可激活语音记录。之后他必须松开按键以停止录制,触发消息发送到服务器。
这是我使用的一个javascript代码块:
navigator.mediaDevices
.getUserMedia({ audio: true })
.then(stream => {
const mediaRecorder = new MediaRecorder(stream)
var audioChunks = []
//
// start and stop recording:
// keyboard (any key) events
//
document
.addEventListener('keydown', () => mediaRecorder.start())
document
.addEventListener('keyup', () => mediaRecorder.stop())
//
// add data chunk to mediarecorder
//
mediaRecorder
.addEventListener('dataavailable', event => {
audioChunks.push(event.data)
})
//
// mediarecorder event stop
// trigger socketio audio message emission.
//
mediaRecorder
.addEventListener('stop', () => {
socket.emit('audioMessage', audioChunks)
audioChunks = []
})
})
现在,我想要的是激活/停用音频(语音)录制,不仅可以通过网页按钮/按键/触摸,还可以通过外部硬件麦克风(带有一键通按钮)。更准确地说,我想用耳罩上的 PTT 按钮连接工业耳机,见图:
顺便说一句,该PTT
按钮只是一个物理按钮,用作短路拨动开关,如图所示,仅作为示例:
- 默认情况下,麦克风接地,输入信号 == 0
- 当
PTT
按下按钮时,微被激活并输入信号!= 0。
现在我的问题是:如何使用 Web Audio API 来检测何时按下 PTT 按钮(因此音频信号 > 0)来执行mediaRecorder.start()
?
在这里阅读:我想我必须使用返回的流mediaDevices.getUserMedia
并创建一个AudioContext()
处理器:
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(handleSuccess);
const handleSuccess = function(stream) {
const context = new AudioContext();
const source = context.createMediaStreamSource(stream);
const processor = context.createScriptProcessor(1024, 1, 1);
source.connect(processor);
processor.connect(context.destination);
processor.onaudioprocess = function(e) {
// Do something with the data,
console.log(e.inputBuffer);
};
};
但是该processor.onaudioprocess
函数必须做什么才能启动(volume > DELTA)和停止(volume < DELTA)MediaRecorder?
我想音量检测可能对两种情况有用:
- 使用
PTT
按钮,用户明确决定演讲的持续时间,按下和释放按钮 - 没有
PTT
按钮,在这种情况下,语音消息是使用所谓的VOX
模式(连续音频处理)创建的
任何想法?