js+html5 getUserMedia 与 microphone (android) 冲突(手机认为 phone 调用有效)
js+html5 getUserMedia conflicts with microphone (android) (mobile thinks phone call is active)
已编辑 - 在 post
底部更新
我正在使用 phonegap 为 android 构建一个基于网络的应用程序,
我遇到了这个问题,
在 getusermedia 初始化后,当我使用音量 down/up 按钮时,音量控制用于通话而不是扬声器,
即使我没有开始新的录音...
此外,我注意到 phone 实际上认为它在 phone 调用中,而应用程序是 运行 例如:
我启动我的应用程序,然后我打开 whatsapp 并尝试录制一条语音消息,该消息正在被取消。
我知道是下一段有问题(我评论了没问题)
/***recording audio block***/
function audioRecordingInit() {
navigator.getUserMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
if (navigator.getUserMedia) {
console.log('getUserMedia supported.');
var constraints = {audio: true};
var chunks = [];
var onSuccess = function (stream) {
$.globals.mediaRecorder = new MediaRecorder(stream);
$.globals.mediaRecorder.onstop = function(e) {
console.log("data available after MediaRecorder.stop() called.");
var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
chunks = [];
if(!$("#recordBtn").hasClass("private"))
$.globals.lastRecorded.audio.src = window.URL.createObjectURL(blob);
else
$.globals.lastRecordedPrivate.audio.src = window.URL.createObjectURL(blob);
console.log("audio created");
};
$.globals.mediaRecorder.ondataavailable = function(e) {
chunks.push(e.data);
}
};
var onError = function (err) {
console.log('The following error occured: ' + err);
};
navigator.getUserMedia(constraints, onSuccess, onError);// I think this is the problem
}
else{
console.log('getUserMedia not supported on your browser!');
}
/***end of recording audio block***/
}
此函数在设备准备就绪后调用
我还在下面添加了开始录制和停止录制功能
function startRecording(event) {
document.getElementById("recordingTime").innerText = "00:00";
$.globals.mediaRecorder.start();
console.log($.globals.mediaRecorder.state);
console.log("recorder started");
$.globals.timerInterval = setInterval(function () {
$.globals.sec += 1;
if ($.globals.sec == 60) {
$.globals.min++;
$.globals.sec = 0;
}
if ($.globals.min < 10) {
if ($.globals.sec < 10)
$.globals.timeText = "0" + $.globals.min + ":0" + $.globals.sec;
else
$.globals.timeText = "0" + $.globals.min + ":" + $.globals.sec;
}
else if ($.globals.sec < 10)
$.globals.timeText = min + ":0" + $.globals.sec;
else
$.globals.timeText = min + ":" + $.globals.sec;
document.getElementById("recordingTime").innerText = $.globals.timeText;
}, 1000);
}
function stopRecording() {
if($(".circleNav").hasClass("recording"))
$(".circleNav").toggleClass("recording");
$.globals.currentState="Recorded";
console.log($.globals.mediaRecorder.state);
if($.globals.mediaRecorder.state=="inactive"){
$.globals.mediaRecorder.start();
}
$.globals.mediaRecorder.stop();
console.log("recorder stopped");
clearInterval($.globals.timerInterval);
}
触摸开始录制按钮时开始录制
触摸结束录制按钮时调用停止录制
谢谢你的帮助
更新:
与 microphone 发生冲突,因为流始终是实时的,而不仅仅是在录制时。
现在它工作正常但仍然需要在 phone 调用时禁用录音按钮,否则它会发生冲突并可能使应用程序崩溃或断开麦克风与所有设备的连接,甚至可能断开它。
好的,
所以在大量阅读 MediaRecorder、MediaStream 和 MediaStreamTrack 之后。
我发现了问题,音频流保持活跃并且正在使用 microphone,因此拒绝我访问 whatsapp 中的 phone 呼叫和语音消息。
我将在下面添加我的解决方案:
function audioRecordingInit() {
navigator.mediaDevices.getUserMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
if (navigator.getUserMedia) {
console.log('getUserMedia supported.');
navigator.getUserMedia({audio:true}, onSuccessMedia, onErrorMedia);
return true;
}
else{
console.log('getUserMedia not supported on your browser!');
return false;
}
}
请注意,我将此函数设为 return 布尔值,并将成功函数和错误函数分开。
function onSuccessMedia(stream) {
var chunks = [];
$.globals.mediaStream=stream;
console.log(stream);
$.globals.mediaRecorder = new MediaRecorder(stream);
$.globals.mediaRecorder.onstop = function(e) {
console.log("data available after MediaRecorder.stop() called.");
var blob = new Blob(chunks, { 'type' : 'audio/mp3; codecs=opus' });
chunks = [];
if(!$("#recordBtn").hasClass("private"))
$.globals.lastRecorded.audio.src = window.URL.createObjectURL(blob);
else
$.globals.lastRecordedPrivate.audio.src = window.URL.createObjectURL(blob);
console.log("audio created");
};
$.globals.mediaRecorder.ondataavailable = function(e) {
chunks.push(e.data);
};
$.globals.mediaRecorder.start();
console.log("recording start");
}
function onErrorMedia(err) {
console.log('The following error occured: ' + err);
}
这里我将 mediaRecorder.start() 移动到 onSuccess 函数,而不是在开始记录的内部...
然后我把开始录音功能改成了
function startRecording(event) {
if(audioRecordingInit()) {
//here is all of the visual changes
}
}
就是这样,一切正常
已编辑 - 在 post
底部更新我正在使用 phonegap 为 android 构建一个基于网络的应用程序, 我遇到了这个问题, 在 getusermedia 初始化后,当我使用音量 down/up 按钮时,音量控制用于通话而不是扬声器, 即使我没有开始新的录音... 此外,我注意到 phone 实际上认为它在 phone 调用中,而应用程序是 运行 例如: 我启动我的应用程序,然后我打开 whatsapp 并尝试录制一条语音消息,该消息正在被取消。
我知道是下一段有问题(我评论了没问题)
/***recording audio block***/
function audioRecordingInit() {
navigator.getUserMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
if (navigator.getUserMedia) {
console.log('getUserMedia supported.');
var constraints = {audio: true};
var chunks = [];
var onSuccess = function (stream) {
$.globals.mediaRecorder = new MediaRecorder(stream);
$.globals.mediaRecorder.onstop = function(e) {
console.log("data available after MediaRecorder.stop() called.");
var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
chunks = [];
if(!$("#recordBtn").hasClass("private"))
$.globals.lastRecorded.audio.src = window.URL.createObjectURL(blob);
else
$.globals.lastRecordedPrivate.audio.src = window.URL.createObjectURL(blob);
console.log("audio created");
};
$.globals.mediaRecorder.ondataavailable = function(e) {
chunks.push(e.data);
}
};
var onError = function (err) {
console.log('The following error occured: ' + err);
};
navigator.getUserMedia(constraints, onSuccess, onError);// I think this is the problem
}
else{
console.log('getUserMedia not supported on your browser!');
}
/***end of recording audio block***/
}
此函数在设备准备就绪后调用
我还在下面添加了开始录制和停止录制功能
function startRecording(event) {
document.getElementById("recordingTime").innerText = "00:00";
$.globals.mediaRecorder.start();
console.log($.globals.mediaRecorder.state);
console.log("recorder started");
$.globals.timerInterval = setInterval(function () {
$.globals.sec += 1;
if ($.globals.sec == 60) {
$.globals.min++;
$.globals.sec = 0;
}
if ($.globals.min < 10) {
if ($.globals.sec < 10)
$.globals.timeText = "0" + $.globals.min + ":0" + $.globals.sec;
else
$.globals.timeText = "0" + $.globals.min + ":" + $.globals.sec;
}
else if ($.globals.sec < 10)
$.globals.timeText = min + ":0" + $.globals.sec;
else
$.globals.timeText = min + ":" + $.globals.sec;
document.getElementById("recordingTime").innerText = $.globals.timeText;
}, 1000);
}
function stopRecording() {
if($(".circleNav").hasClass("recording"))
$(".circleNav").toggleClass("recording");
$.globals.currentState="Recorded";
console.log($.globals.mediaRecorder.state);
if($.globals.mediaRecorder.state=="inactive"){
$.globals.mediaRecorder.start();
}
$.globals.mediaRecorder.stop();
console.log("recorder stopped");
clearInterval($.globals.timerInterval);
}
触摸开始录制按钮时开始录制 触摸结束录制按钮时调用停止录制 谢谢你的帮助
更新:
与 microphone 发生冲突,因为流始终是实时的,而不仅仅是在录制时。 现在它工作正常但仍然需要在 phone 调用时禁用录音按钮,否则它会发生冲突并可能使应用程序崩溃或断开麦克风与所有设备的连接,甚至可能断开它。
好的, 所以在大量阅读 MediaRecorder、MediaStream 和 MediaStreamTrack 之后。 我发现了问题,音频流保持活跃并且正在使用 microphone,因此拒绝我访问 whatsapp 中的 phone 呼叫和语音消息。 我将在下面添加我的解决方案:
function audioRecordingInit() {
navigator.mediaDevices.getUserMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia);
if (navigator.getUserMedia) {
console.log('getUserMedia supported.');
navigator.getUserMedia({audio:true}, onSuccessMedia, onErrorMedia);
return true;
}
else{
console.log('getUserMedia not supported on your browser!');
return false;
}
}
请注意,我将此函数设为 return 布尔值,并将成功函数和错误函数分开。
function onSuccessMedia(stream) {
var chunks = [];
$.globals.mediaStream=stream;
console.log(stream);
$.globals.mediaRecorder = new MediaRecorder(stream);
$.globals.mediaRecorder.onstop = function(e) {
console.log("data available after MediaRecorder.stop() called.");
var blob = new Blob(chunks, { 'type' : 'audio/mp3; codecs=opus' });
chunks = [];
if(!$("#recordBtn").hasClass("private"))
$.globals.lastRecorded.audio.src = window.URL.createObjectURL(blob);
else
$.globals.lastRecordedPrivate.audio.src = window.URL.createObjectURL(blob);
console.log("audio created");
};
$.globals.mediaRecorder.ondataavailable = function(e) {
chunks.push(e.data);
};
$.globals.mediaRecorder.start();
console.log("recording start");
}
function onErrorMedia(err) {
console.log('The following error occured: ' + err);
}
这里我将 mediaRecorder.start() 移动到 onSuccess 函数,而不是在开始记录的内部...
然后我把开始录音功能改成了
function startRecording(event) {
if(audioRecordingInit()) {
//here is all of the visual changes
}
}
就是这样,一切正常