如何显示来自 Cordova 媒体捕获的图像和播放音频

Posted

技术标签:

【中文标题】如何显示来自 Cordova 媒体捕获的图像和播放音频【英文标题】:How to display image and playback audio from Cordova media capture 【发布时间】:2014-12-20 05:20:14 【问题描述】:

我正在尝试使用 cordova 和 ngCordova 设置媒体捕获 在我拍照并录制音频后,我应该使用哪个函数或属性来显示图像和播放音频?

我尝试将 fullPath 和 cdvfile 作为图像 src 但不起作用。也尝试使用图像数据作为 base64 数据,这也不起作用

有什么提示吗?

$cordovaCamera 工作

   $scope.captureImage = function() 
      var options = 
        limit: 3
      ;

       $cordovaCamera.getPicture(options).then(function(imageData) 
         var i, prop;
         $scope.debug = '';
         for (prop in imageData[i]) 
           $scope.debug += prop + ':' + imageData[i][prop] + '\n';
         

         $scope.imgs.push(

           src: "data:image/jpeg;base64," + imageData
         );

       , function(error) 
//        // An error occured. Show a message to the user
        str = 'code: ' + error.code + '\n' + 'message: ' + error.message + '\n';
alert(str);
       );
      );

但我实际上想使用 $cordovaCapture 来捕获图像和音频。我使用 FileService 返回可以使用的文件路径 按照建议尝试 window.resolveLocalFileSystemURL 但没有运气。 那么我在这里做错了什么?

.controller('MyCtrl', [
  '$scope', '$cordovaCapture', '$cordovaCamera', 'FileService',
  function($scope, $cordovaCapture, $cordovaCamera, FileService) 
    $scope.imgs = [];
    $scope.ados = [];
    $scope.debug = '';

    $scope.captureAudio = function() 
      var options = 
        limit: 3,
        duration: 20
      ;

      $cordovaCapture.captureAudio(options).then(function(audioData) 
        // Success! Audio data is here
        var i, path, len, prop;
        for (i = 0, len = audioData.length; i < len; i += 1) 
          // path = mediaFiles[i].fullPath;
          // do something interesting with the file
          $scope.ados.push(audioData[i]);  // fullPath at file:///var/xxxxxxx results in 404
        
      , function(error) 
        // An error occured. Show a message to the user
      );
    ;

    $scope.captureImage = function() 
      var options = 
    quality : 75,
    destinationType: Camera.DestinationType.FILE_URI,
    sourceType : Camera.PictureSourceType.CAMERA,
    allowEdit : true,
    encodingType: Camera.EncodingType.JPEG,
    targetWidth: 720,
    targetHeight: 1280,
    saveToPhotoAlbum: false
  ;

  $cordovaCamera.getPicture(options).then(function(imageData) 

    var path = imageData;  // this gives /var/mobile/Containers/Data/Application/91036FB8-4195-4902-99E1-ED943E738DB3/tmp/cdv_photo_001.jpg

    FileService.readFile(path).then(function(result) 

      $scope.imgs.push(
        path: result
      );
    , function(error) 
      var prop, msg;
      msg += 'Read file error:\n';
      for (prop in error.target) 
        msg += prop + ': ' + error.target[prop] + '\n';
      
      alert(msg);
    );


  , function(err) 
    // An error occured. Show a message to the user
    alert(err);
  );
    ;
  
])

.service('FileService', [
  '$cordovaFile', '$q',
  function($cordovaFile, $q) 
    this.readFile = function(path) 
      // Reads a file as TEXT
      var deferred = $q.defer();

      function onFileSystemSuccess(fileSystem) 
        alert('onFileSystemSuccess:'+fileSystem.name);  // this is OK
      

      function onResolveSuccess(fileEntry) 
        alert('onResolveSuccess:'+fileEntry.name);
// can resolve to "cdv_photo_001.jpg" fine

        fileEntry.file(function(file) 
          var reader = new FileReader();

          reader.onloadend = function(evt) 
// this triggers second "Loaded: null"

            alert('Loaded: ' + evt.target.result);
            deferred.resolve(evt);
          ;
          reader.onerror = function(evt) 
// this triggers first "Error: null"

            alert('Error: ' + evt.target.result);
            deferred.reject(evt);
          ;

          reader.readAsText(file);
        );
      

      function fail(evt) 
        alert('fail:'+evt.target.error.code);
      

      window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, fail);
      window.resolveLocalFileSystemURL(path, onResolveSuccess, fail);

      return deferred.promise;
    ;
  
])

【问题讨论】:

【参考方案1】:

这与this question 有点相同,但我仍不会将其视为重复。首先看看我的答案,它应该对图像和音频都这样做。正则表达式 (/^data:audio/mpeg;base64,/) 当然应该更改以匹配您的格式,对于正确的 MIME 类型,请参阅 here。如果这对你不起作用,请告诉我!

【讨论】:

更新了原帖中的代码。还是不行。 似乎任何与文件相关的函数都以错误代码 5 结尾,包括通过 $ngCordovaFile 的 createFile / checkFile【参考方案2】:

要显示图像,我必须使用 imageData[i].localURL 作为 src,即 cdvfile://xxxx

【讨论】:

以上是关于如何显示来自 Cordova 媒体捕获的图像和播放音频的主要内容,如果未能解决你的问题,请参考以下文章

phoneGap/Apache Cordova 媒体捕获插件 - 多视频录制

如何显示来自相机的捕获图像并从文件路径显示在图像视图中? [复制]

Cordova 媒体捕获插件错误(Nexus 6、Android 6)

在 cordova/phonegap Android 应用程序上关闭屏幕后媒体停止播放

WebRTC音视频采集和播放示例及MediaStream媒体流解析

无法使用cordova在android上播放视频