录制器.js录制未按预期工作



我使用recorder在JavaScript中实现了一个记录器.js

基本上,我正在为Mozilla OS创建一个应用程序。当我安装该应用程序时,录音机第一次工作正常。当我第二次尝试时,它不起作用。当我在 Audacity 中打开 wav 文件时,它显示完全空白。

我正在分享我的录音机。我把createDownloadLink()留空,因为它是我无法分享的东西。

关于为什么录音机第一次工作正常而不是第二次工作正常的任何线索?有什么技巧可以克服这个问题吗?

function startUserMedia(stream) {
var input = audio_context.createMediaStreamSource(stream);
__log('Media stream created.');
// Uncomment if you want the audio to feedback directly
//input.connect(audio_context.destination);
//__log('Input connected to audio context destination.');
recorder = new Recorder(input);
__log('Recorder initialised.');
}
function startRecording(button) {
recorder && recorder.clear();
recorder && recorder.record();
button.disabled = true;
button.nextElementSibling.disabled = false;
__log('Recording...');
}
function stopRecording(button) {
recorder && recorder.stop();
button.disabled = true;
button.previousElementSibling.disabled = false;
__log('Stopped recording.');
// create WAV download link using audio data blob
createDownloadLink();
recorder.clear();
recorder && recorder.clear();
}
function createDownloadLink() {
recorder && recorder.exportWAV(function(blob) {
}
}
window.onload = function init() {
try {
request = new XMLHttpRequest();
request.mozSystem = true;
// webkit shim
window.AudioContext = window.AudioContext || window.webkitAudioContext;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia|| navigator.mozGetUserMedia;
window.URL = window.URL || window.webkitURL;
audio_context = new AudioContext;
__log('Audio context set up.');
__log('navigator.getUserMedia ' + (navigator.getUserMedia ? 'available.' : 'not present!'));
} catch (e) {
alert('No web audio support in this browser!');
}
navigator.getUserMedia({
audio: true
}, startUserMedia, function(e) {
__log('No live audio input: ' + e);
});
};

您可能会遇到此错误: https://bugzilla.mozilla.org/show_bug.cgi?id=934512 解决方法是对createMediaStreamSource结果的引用放在永远不会被垃圾回收的地方,例如:

window.savedReferenceWorkaroundFor934512 = input;

如果这不是原因,那么我会考虑为每个开始/停止周期创建一个新的 audioContext(并在每个新启动时启动新的getUserMedia调用(。

如果不查看所有代码,很难判断,但保存 Blob 和清除记录器之间也可能存在争用条件。一种解决方法是仅在创建 blob 后调用 recorder.clear((。

最新更新