【问题标题】:upload/download audio from firebase从 Firebase 上传/下载音频
【发布时间】:2016-12-08 02:37:52
【问题描述】:

我正在尝试上传音频并稍后下载。 我正在为这个过程使用 firebase 服务器。

我遇到了 2 个问题。解决任何一个都会解决目的:

  1. 如何将文件作为文件而不是 blob 上传。我相信应该有一种方法可以按原样上传文件,而不是先将文件转换为 blob 然后上传(我现在正在这样做)。
  2. 我可以下载文件但无法播放。由于文件首先转换为 DataURL/ArrayBuffer 然后上传,如何将其转换回音频(mp3/wav)?

要上传的代码:

  $scope.uploadFile = function(){ // uploading file
var storageRef= firebase.storage().ref();
var filename= $scope.audio.src.substring($scope.audio.src.lastIndexOf("/")+1,$scope.audio.src.length);
$scope.fname= filename;
// fetching file to upload
baseServ.dirEntry.getFile(filename, {}, function(entry){
  entry.file(function(gotfile){
    var reader= new FileReader();

    reader.onloadend= function(resultFile){
      console.log(resultFile);
      var blob= new Blob([resultFile], {type:"audio/mp3"});
      // uploading to firebase server
      var uploadTask = storageRef.child(filename).put(blob);
      uploadTask.on('state_changed', function(snapshot){
        console.log("state_changed:" + filename + "::::Current State:" +snapshot.state);
      }, function(error) {
        alert("upload error");
      }, function() {
        $scope.downloadURL = uploadTask.snapshot.downloadURL;
      });
    }
    //reading as dataUrl or ArrayBuffer
    reader.readAsDataURL(gotfile);
  })
});

}

然后下载:

  $scope.downloadFile= function(){
var ft= new FileTransfer();
ft.download($scope.downloadURL, baseServ.dirDownloads.nativeURL + $scope.fname, function(entry) {
  // download is successful but unable to play when opening in my device
    console.log("download complete: " + entry.toURL());
},
function(error) {
    console.log("download error source " + error.source);
},
false,
{});

}

谢谢。

【问题讨论】:

    标签: javascript angularjs cordova firebase firebase-storage


    【解决方案1】:

    实时数据库是存储音频文件的错误工具。您应该为此使用 Firebase 存储。见Firebase Features

    存储和检索用户生成的内容,例如图像、音频和视频 直接来自 Firebase 客户端 SDK。

    强大的后台上传和下载,不受网络影响 质量安全的客户端授权,集成 由 Google Cloud 支持的 PB 级数据存储 整个 Firebase 或 Google Cloud Storage API 的 Storage API 访问权限

    【讨论】:

    • 我只使用 firebase。我只需要将 mp3 文件上传为 mp3,而不是 blob。有办法吗?
    • Firebase 包括 Firebase 存储。尊敬的,如果您使用实时数据库来存储音频,那么您使用的工具是错误的。
    • 说得对,在与 firebase 进一步合作之后,我可以说实时数据库应尽可能保持轻量级。作为管理员也给你带来了困难。另一方面,存储可以播放重型文件。谢谢。
    【解决方案2】:

    您似乎无法上传音频本身。

    在我看到的示例中,数据(用于图像文件)以 dataURL/Base64 字符串的形式上传,下载后重建文件。

    由于我的音频文件很小,60-70 kb,我正在使用相同的文件并使用 HTMLAudio 元素再次重建文件。

    【讨论】:

      【解决方案3】:

      为了给你一个简单的方法,只需在你的程序中使用这两种方法(来自下面给出的链接)。

      private void startRecording() {
              mRecorder = new MediaRecorder();//mRecoreder has been declared globally
              mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
              mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
              mRecorder.setOutputFile(mFileName);
              mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
      
              try {
                  mRecorder.prepare();
              } catch (IOException e) {
                  Log.e(LOG_TAG, "prepare() failed");//initiallize LOG_TAG as a string anything u like to get an indication
              }
      
              mRecorder.start();
          }
      
          private void stopRecording() {
              mRecorder.stop();
              mRecorder.release();
              mRecorder = null;
      
              uploadAudio();//it is'nt in the link. it has been added by me to upload ur audio to firebase storage cloud 
      
          }
      

      现在要上传代码,添加调用方法uploadAudio(),它的主体是:-

      private void uploadAudio() {

      mProgressDialog.setMessage("Uploading Audio...");//declare it globally and initialize it with passing the current activity i.e this
      mProgressDialog.show();
      
      StorageReference mFilePath = mStorageRef.child("Audio").child("new_audio.3gp");
      
      Uri u = Uri.fromFile(new File(mFileName));
      mFilePath.putFile(u).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
          @Override
          public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
      
              mProgressDialog.dismiss();
              mTextView.setText("Audio has been Uploaded Successfully !!!");
          }
      });
      

      }

      这对于简单的音频上传应该足够了。查看链接以进一步定制。 https://developer.android.com/guide/topics/media/mediarecorder.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 2021-10-19
        • 2013-12-04
        • 1970-01-01
        • 2017-04-20
        相关资源
        最近更新 更多