提问人:user3628726 提问时间:10/23/2023 最后编辑:user3628726 更新时间:10/23/2023 访问量:33
MediaRecorder 音频块包括以前的录音
MediaRecorder audiochunks includes previous recording
问:
我有一段代码,用于仅录制音频,并在每次注册静音时将其发送到我的服务器。
这适用于第一次录制。
之后的每个录音都会将之前的录音附加到新录音中。
例:
音频1:你好,这是第1句。
音频2:你好,这是第1句。你好,这是第 2 句。
音频3:你好,这是句子1。你好,这是第 2 句。你好 这是第 3 句。
录音永远不会从头开始。
到目前为止,我的代码已简化:
var audioChunks = [];
function SendBlobToServer(blob) {
//jquery post-request to server
}
function detectSilence(
stream,
onSoundEnd = _ => {},
onSoundStart = _ => {},
silence_delay = 500,
min_decibels = -80
) {
const ctx = new AudioContext();
const analyser = ctx.createAnalyser();
const streamNode = ctx.createMediaStreamSource(stream);
streamNode.connect(analyser);
analyser.minDecibels = min_decibels;
const data = new Uint8Array(analyser.frequencyBinCount); // will hold our data
let silence_start = performance.now();
let triggered = false; // trigger only once per silence event
function loop(time) {
requestAnimationFrame(loop); // we'll loop every 60th of a second to check
analyser.getByteFrequencyData(data); // get current data
if (data.some(v => v)) { // if there is data above the given db limit
if (triggered) {
triggered = false;
onSoundStart();
}
silence_start = time; // set it to now
}
if (!triggered && time - silence_start > silence_delay) {
onSoundEnd();
triggered = true;
}
}
loop();
}
function onSilence() {
console.log('silence');
window.recorder.requestData();
}
function onSpeak() {
console.log('speaking');
}
const ReadBlobContent = blob => {
const reader = new FileReader();
reader.readAsDataURL(blob);
return new Promise(resolve => {
reader.onloadend = () => {
resolve(reader.result);
};
});
};
navigator.mediaDevices.getUserMedia({
audio: true
}).then(stream => {
window.recorder = new MediaRecorder(stream);
window.recorder.onstart = function(e) {
console.log("window.recorder.onstart");
detectSilence(stream, onSilence, onSpeak);
};
window.recorder.onstop = function(e) {
console.log("window.recorder.onstop");
};
window.recorder.ondataavailable = (e) => {
if (window.recorder.state === "recording") {
let blob = new Blob(audioChunks, {
type: 'audio/mpeg-3'
});
ReadBlobContent(blob).then(res => SendBlobToServer(res.split(',')[1]));
}
};
window.recorder.start();
// do something else with the stream
}).catch(console.error);
我试着在最后一行做,但是那
损坏下一句的 blob 文件,使音频无法播放。audioChunks = []
SendBlobToServer()
如何以正确的方式清除数组,而不必依赖使用和使用每个口语句子。我想在清除 .audiochunks
recorder.start()
recorder.stop()
audiochunks
答: 暂无答案
评论