我正在尝试使用离子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运行良好,但录制到文件的语音不起作用。
具有大小的音频文件是从Android设备录制的。
任何人都知道我的问题是什么?
感谢。
答案 0 :(得分:0)
问题是:
音频文件应为 .wav 。所以,当我改变音频类型成为wav。
let metadata = {
contentType: 'audio/wav',
};
this.fileName = this.date + `-rnb.mp3`;
它对我有用。
感谢。