使用离子媒体插件录制语音备忘录不适用于IOS

时间:2018-02-16 10:05:01

标签: ios angular ionic2 cordova-plugins firebase-storage

我正在尝试使用离子cordova 媒体文件插件在ios设备上录制语音备注,然后将其推送到firebase存储。

  

在Android上运行良好。

这是我的代码

首先我创建了init()函数

  init(): Promise < any > {
    this.date = moment().format('x');
    return new Promise((resolve, reject) => {
      let currentFile: File;
      this.fileName = this.date + `-rnb.mp3`;
      this.file.createFile(this.platform.is('ios') ? cordova.file.tempDirectory : cordova.file.dataDirectory, this.fileName, true).then((result) => {
        this.current_file_playing = this.createAudioFile(this.storageDirectory, this.fileName);
        resolve();
      }, (e) => {
        console.log(JSON.stringify(e, null, 2));
        reject(e);
      })
    });
  }

this.storageDirectory它是在提供者constructor()中定义的等于目录路径的变量取决于平台。这是以下代码:

this.platform.ready().then(() => {
  if (this.platform.is('ios')) {
    this.storageDirectory = this.file.tempDirectory;
  } else if (this.platform.is('android')) {
    this.storageDirectory = this.file.externalDataDirectory;
  }
});

然后record()函数是监听器记录按钮

  record(){
    return new Promise((resolve,reject)=>{
      this.init().then((media:Media) => {
        try {
          this.startRecording(media);
          resolve(media);
        } catch (e) {
          console.log(e);
        }
      });
    });
  }

这是startRecording()函数:

  startRecording(mediaPlugin: any) {
    this.current_file_playing.startRecord();
  }

此外stopRecording()函数是一个停止按钮的监听器:

  stopRecording(mediaPlugin: any) {
    return new Promise((resolve,reject)=>{
      this.current_file_playing.stopRecord();
      this.current_file_playing.play();
      this.current_file_playing.setVolume(0.0); //trick
      this.saveFirebase().then((downloadUrl) => {
        resolve(downloadUrl);
      });
    });
  }

最后,这就是我使用saveFirebase()函数推送firebase的方法

  saveFirebase() {
    return new Promise((resolve, reject) => {
      let storageRef = firebase.storage().ref();
      let metadata = {
        contentType: 'audio/mp3',
      };
      this.file.readAsDataURL(this.storageDirectory, this.fileName).then((file) => {
        let voiceRef = storageRef.child(`voices/${this.fileName}`).putString(file, firebase.storage.StringFormat.DATA_URL);
        voiceRef.on(firebase.storage.TaskEvent.STATE_CHANGED, (snapshot) => {
          console.log("uploading");
        }, (e) => {
          console.log('inside the error');
          reject(e);
          console.log(JSON.stringify(e, null, 2),'this.error');
        }, () => {
          var downloadURL = voiceRef.snapshot.downloadURL;
          resolve(downloadURL);
        });
      });
    });
  }

saveFirebase()函数的解释

首先,我使用this.file.readAsDataURL(...)将文件转换为 base64 ,然后使用putString方法推送Firebase存储。

  

音频文件已成功推送到Firebase存储,但字节大小为0。这意味着推送到Firebase运行良好,但录制到文件的语音不起作用。

This is my Firebase Storage

  

具有大小的音频文件是从Android设备录制的。

任何人都知道我的问题是什么?

感谢。

1 个答案:

答案 0 :(得分:0)

问题是:

音频文件应为 .wav 。所以,当我改变音频类型成为wav。

  let metadata = {
    contentType: 'audio/wav',
  };

this.fileName = this.date + `-rnb.mp3`;

它对我有用。

感谢。