【问题标题】:how to pause and resume voice recording in android using cordova media plugin如何使用cordova媒体插件在android中暂停和恢复录音
【发布时间】:2017-02-12 04:11:39
【问题描述】:

我在 Visual Studio 中使用 angularjs。使用 cordova 媒体插件 startRecord() 和 stopRecord() 正在工作,但无法暂停和恢复录制。我没有使用媒体捕获插件,因为我没有默认记录器已安装。

这是我的代码:

var audurl = '///storage/emulated/0/New/';
audurl += 'Voice_' + '.amr';
var mediaRec;
function recordAudio() {
  mediaRec = new Media(audurl, onSuccess, onError);
  mediaRec.startRecord();
}
function pauseAudio() {
  mediaRec = new Media(audurl, onSuccess, onError);
  mediaRec.pauseRecord();
}

谢谢...

【问题讨论】:

  • This 示例显示了您想知道的所有内容。虽然它会自动暂停和恢复(通过使用 setTimeout),但它显示了如何恢复录制。
  • 我可以在点击按钮时暂停和恢复吗?
  • 我认为根据文档暂停和恢复工作仅在 iOS 中。
  • 我认为根据文档暂停和恢复工作仅适用于 iOS:乍一看是的,但是当您查看 android 源代码 here 时,android 也支持暂停和恢复.
  • 我可以在单击按钮时暂停和恢复吗?当然可以。您必须定义一个调用 pauseRecord 的点击处理程序和一个调用 resumeRecord 的点击处理程序。

标签: javascript cordova cordova-plugins audio-recording cordova-media-plugin


【解决方案1】:

在我的手机上,方法 media.resumeRecord 不可用,尽管在这个 soure-code 中定义了它。不过,您可以利用所有其他方法(例如 startRecord 和 stopRecord)来重建一种 resumeRecord 函数,就像在下面的处理程序中完成的那样:

var myRecordHandler = function () {

  // ALL RECORDED FILES ARE SAVED IN THIS ARRAY
  var recordedAudioFiles = [];

  // REMEMBER POSITION WHEN PLAYING IS STOPPED
  var currentPosition = {index:0,shift:0};

  // PAUSE-MODE
  var paused = false;

  // SET A SPECIFC DIRECTORY WHERE THE FILES ARE STORED INTO
  // DEFAULT: ''
  this.setDirectory = function(dir) {this.dir=dir;};

  // SET FILENAME
  // DEFAULT: recoredFilesX
  this.setFilename = function(filename) {this.filename=filename;};

  // SET MIME/Type of THE FILES; 
  // DEFAULT: mp3
  this.setFileType = function(type) {this.filetype=type;};

  // GET ALL RECORED FILES 
  this.getAllFiles = function() {return recordedAudioFiles;};

  // STOP/PAUSE RECORDED FILES
  var handleRecordedFileHold = function () {
    for (var r = 0; r < recordedAudioFiles.length; r++) {

      var recordedAudioFile = recordedAudioFiles[r];

      if(recordedAudioFile.isBeingRecorded){
         if(paused)recordedAudioFile.media.pause();
         else recordedAudioFile.media.stop();
         continue;
      }

      recordedAudioFile.duration = new Date().getTime() - recordedAudioFile.startTime;
      // call release to free this created file so that it could get deleted for instance
      recordedAudioFile.media.stopRecord();
      recordedAudioFile.media.release();
      recordedAudioFile.isBeingRecorded = true;
    }
  } 

  // START RECORDING
  this.startAudioRecording = function() {

    paused = false;
    handleRecordedFileHold();

    var dir = this.dir ? this.dir : '';
    var filename = this.filename ? this.filename : 'recoredFiles';
    var type = this.filetype ? this.filetype : 'mp3';

    var src = dir + filename + (recordedAudioFiles.length + 1) + '.' + type;
    var mediaRec = new Media(src, 
       function () {
         console.log('recordAudio():Audio Success');
       }, 
       function (err) {
         console.log('recordAudio():Audio Error: ' + err.code);
    });
    recordedAudioFiles.push({
      media: mediaRec,
      startTime: new Date().getTime()
    });
    mediaRec.startRecord();
  } 

  // PAUSE RECORDING
  this.pauseRecoredFiles = function () {
    if(recordedAudioFiles.length){
       paused = true;
       clearTimeout(currentPosition.timeout);
       handleRecordedFileHold();
       var recoredMedia = recordedAudioFiles[currentPosition.index].media;
       recoredMedia.getCurrentPosition(
           function (position) {
              currentPosition.shift = position;
           },
           function (e) {
              console.log("Error getting pos=" + e);
           }
       );
    }
  } 

  // PLAY RECORD
  this.playRecordedFiles = function () {
    handleRecordedFileHold();
    var playNextFile = function () {
      var recoredMedia = recordedAudioFiles[currentPosition.index];
      if (recoredMedia) {
        if(paused){
          recoredMedia.media.seekTo(currentPosition.shift*1000);
          paused = false;
        }
        recoredMedia.media.play();
        currentPosition.timeout = setTimeout(function () {
          currentPosition.index++;
          recoredMedia.media.stop();
          playNextFile();
        }, recoredMedia.duration ? recoredMedia.duration : 0);
      }
      else{
        paused = false;
        currentPosition.index = currentPosition.shift = 0;
      }
    };
    playNextFile();
  } 

  // RESET PLAY
  this.stopRecordedFiles = function () {
    currentPosition.index = currentPosition.shift = 0;
    clearTimeout(currentPosition.timeout);
    handleRecordedFileHold();
  }

  // REMOVE ALL RECORDED FILES 
  this.removeRecordedFiles = function() {
    paused = false;
    currentPosition.index = currentPosition.shift = 0;
    clearTimeout(currentPosition.timeout);
    handleRecordedFileHold();
    recordedAudioFiles = [];
  }

};

var handler = new myRecordHandler();

// you can use this handler in your functions like this:
function recordAudio() {
  // records one track and stops former track if there is one
  handler.startAudioRecording();
}

function playAudio() {
  handler.playRecordedFiles();
}

function pauseAudio() {
  handler.pauseRecoredFiles();
}

function resumeAudio() {
  pauseAudio();
  recordAudio();
}

function stopAudio() {
  handler.stopRecordedFiles();
}

虽然我无法测试您的目录/文件名,因为我没有在我的手机上创建此目录,但这些方法可能会帮助您将文件存储在特定目录中以及使用某些文件名:

handler.setDirectory('__YOUR_DIR__');

handler.setFilename('__YOUR_FILENAME__');

handler.setFileType('__YOUR_FILETYPE__');

【讨论】:

  • 也试过这样但同样的问题。另外如果每次都生成ID,stopRecord()是如何工作的。
  • 您是否再次播放了录制的音频文件?录制时是否有红色 LED 灯发光?这些方法应该有效,否则您必须自己通知开发人员,抱歉。
  • 是的,但是没有 LED 灯发光。实际上我没有使用任何默认记录器,我创建了一个 UI 来执行此操作
  • 好吧,红灯只是一个想法,有些设备确实有这样的灯。
  • 希望我的小管理员能帮到你。仅供参考:延迟调用 playAudio 和 pauseAudio 以查看您录制的音频是否真正被逐个附加。
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多