我试图在Chrome浏览器中录制30秒的声音片段并将音频作为base64编码的FLAC音频发布到服务器,我觉得我80%的方式都在那里。
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
const DURATION_MS = 10 * 1000;
function getUserMediaPromise(constraints) {
return new Promise(function(resolve, reject) {
console.info('Getting user media.');
navigator.getUserMedia({
audio: true,
video: false
}, function(stream) {
console.info('Got stream!');
resolve(stream);
}, function(error) {
console.error('Error getting stream!');
reject(error);
});
});
}
function recordAudioPromise(stream) {
return new Promise(function(resolve, reject) {
var audioChunks = [],
mediaRecorder = new MediaRecorder(stream, {
audioBitsPerSecond: 16000
});
mediaRecorder.start(5 * 1000); // One chunk of data per X seconds. Why do we care?
setTimeout(function() {
console.info('Stopping audio after ' + DURATION_MS + 'ms');
mediaRecorder.stop();
}, DURATION_MS);
mediaRecorder.ondataavailable = function(e) {
console.info('data available', e.data.size);
audioChunks.push(e.data);
};
mediaRecorder.onerror = reject;
mediaRecorder.onwarning = reject;
mediaRecorder.onstop = function() {
console.info('Stopped and converting to base64, state:', mediaRecorder.state);
var blob = new Blob(audioChunks, {
type: 'audio/flac'
});
console.info('Created blob', blob.type, blob.size);
audioChunks = [];
var fileReader = new window.FileReader();
fileReader.onloadend = function() {
var base64data = fileReader.result;
resolve(base64data.substr('data:audio/flac;base64,'.length));
};
fileReader.readAsDataURL(blob);
};
});
}
getUserMediaPromise()
.then(recordAudioPromise)
.then(function(base64Audio) {
console.log('Got base64Audio', base64Audio.length);
console.log(base64Audio);
}).catch(function(error) {
throw error;
});