0

編集済み - 投稿の下部で更新

phonegapを使用してAndroid用のWebベースのアプリを構築しています.getusermediaの初期化後、ボリュームダウン/アップボタンを使用すると、ボリュームコントロールは通話用であり、スピーカー用ではありません.新しい録音を開始します...さらに、アプリの実行中に電話が実際に電話の中で考えていることに気付きました。キャンセル。

次のセグメントが問題であることはわかっています(コメントしましたが、問題はありませんでした)

/***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);

  }

startRecording は touchstarts on record ボタンで開始します stopRecording は touchend on record ボタンで呼び出されます 助けてくれてありがとう

更新

ストリームは録音時だけでなく常にライブであったため、競合はマイクにありました。今は問題なく動作しますが、通話中に録音ボタンを無効にする必要があります。そうしないと、競合してアプリがクラッシュしたり、マイクをすべてから切断したり、切断したりする可能性があります。

4

1 に答える 1

1

わかりましたので、MediaRecorder、MediaStream、および MediaStreamTrack について多くのことを読んだ後です。問題が見つかりました。オーディオのストリームはアクティブなままで、マイクを使用していたため、whatsapp での通話や音声メッセージへのアクセスが拒否されました。以下に私のソリューションを追加します。

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;
}
}

この関数がブール値を返すようにし、成功関数とエラー関数を分離したことに注意してください。

 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
      }
      }

以上で、すべてが正しく機能しています

于 2016-12-10T12:44:20.503 に答える