0

나는 내 ionic app에서 오디오 녹음 기능을 만들고있다. 나는 오디오를 기록하고 다음과 같이 성공적으로 재생할 수 있습니다file.mp3를 ionic의 firebase storage에 업로드하는 방법은 무엇입니까?

$ ionic cordova plugin add cordova-plugin-media 
$ npm install --save @ionic-native/media 

:

constructor(private media: Media,private base64: Base64) { 

this.file = this.media.create('file.mp3'); 

} 

record_audio(){ 

this.file.startRecord(); 
} 

내가 직접 file.mp3을 업로드 할 수 없습니다 중포 기지에 uplaod하기 위해, 내가 필요 같다 나는 미디어 플러그인을 사용하고 있습니다 나는이 일을 시도하지만 "미디어 오브젝트가 문자열에 할당 할 수 없습니다"라고 그래서 BLOB 또는 최초의 64 기수로 변환 :

let filePath: string = 'this.file.mp3'; 
this.base64.encodeFile(filePath).then((base64File: string) => { 
console.log(base64File); 
}, (err) => { 
console.log(err); 
}); 

목적은 중포 기지하기 위해 녹음 된 오디오 파일을 업로드하는 것입니다. 이 파일을 base64로 변환해야합니다.

답변

0
 startRecording() { 
    console.log("Started Recording"); 
    this.recording = true; 
    this.file.createFile(this.file.tempDirectory, 'my_file.m4a', true).then(() => { 
     const audio: MediaObject = this.media.create(this.file.tempDirectory.replace(/^file:\/\//, '') + 'my_file.m4a'); 
     console.log("Audio assigned to constant audio media object"); 
     console.log(audio); 
     this.audio = audio; 
     console.log("Audio assigned to this.audio media object"); 
     console.log(this.audio); 
     this.audio.startRecord(); 
     this.listenToAudioEvents(); 
     window.setTimeout(() => { 
     if (this.recording) this.stopRecording(); 
     }, 10000); 
    }); 
    } 

    listenToAudioEvents() { 
    this.audio.onStatusUpdate.subscribe(status => { 
     console.log("Status of this.audio updated"); 
     console.log(status); 
     if (status == 4 && this.playingAudio) { 
     console.log("Time to stop playback") 
     this.stopPlayback(); 
     } 
    }); 
    } 

    stopRecording() { 
    this.audio.stopRecord(); 
    console.log("Stopped Recording"); 
    console.log(this.audio); 
    this.recording = false; 
    this.audioReady = true; 
    this.audio.getDuration(); 
    console.log("Audio Duration: " + this.duration); 
    console.log("Audio Duration Property: " + this.audio.duration); 
    } 

    playAudio() { 
    console.log("Playing Audio"); 
    this.playingAudio = true; 
    this.audio.play(); 
    } 

    stopPlayback() { 
    console.log("Stopping Playback"); 
    this.playingAudio = false; 
    this.audio.stop(); 
    } 

    uploadAudio() { 
    console.log("Uploading record"); 
    this.storeRecord().subscribe((downloadURL) => { 
     console.log("Finished storing record"); 
     console.log("Download URL is " + downloadURL); 
     this.audioURL = downloadURL; 
     this.audioURLReady = true; 
    }); 
    } 

    storeRecord() { 
    return Observable.create((observer) => { 
     console.log('Saving record'); 
     const filePath = `${this.file.tempDirectory}my_file.m4a`; 
     console.log("Path to record is " + filePath); 
     const readFile: any = window['resolveLocalFileSystemURL']; 
     return readFile(filePath, (fileEntry) => { 
     return fileEntry.file((file) => { 
      const fileReader = new FileReader(); 
      fileReader.onloadend = (result: any) => { 
      let arrayBuffer = result.target.result; 
      let blob = new Blob([new Uint8Array(arrayBuffer)], { type: 'audio/m4a' }); 
      console.log("Blob is "); 
      console.log(blob); 
      var storageRef = firebase.storage().ref('content/' + this.firebase.user.uid + '/my-file.m4a'); 
      console.log("Storage reference is " + storageRef); 
      var uploadTask = storageRef.put(blob); 
      console.log('Upload started:'); 
      uploadTask.on('state_changed', (snapshot) => { 
       console.log("state changed"); 
       let percent = uploadTask.snapshot.bytesTransferred/uploadTask.snapshot.totalBytes * 100; 
       console.log(percent + "% done"); 
      }, (e) => { 
       console.error(e); 
       observer.error(e); 
      },() => { 
       var downloadURL = uploadTask.snapshot.downloadURL; 
       console.log('Storage Download URL:' + downloadURL); 
       observer.next(downloadURL); 
      }); 
      }; 
      fileReader.onerror = (e: any) => { 
      console.error(e); 
      observer.error(e); 
      }; 
      fileReader.readAsArrayBuffer(file); 
     }, (e) => { 
      console.error(e); 
      observer.error(e); 
     }); 
     }, (e) => { 
     console.error(e); 
     observer.error(e); 
     }); 
    }); 
    } 

    downloadAudio() { 
    console.log("Downloading Audio") 
    const fileTransfer: FileTransferObject = this.fileTransfer.create(); 
    var destPath = (cordova.file.externalDataDirectory || cordova.file.dataDirectory) + "my_file.m4a" 
    fileTransfer.download(this.audioURL, destPath,).then((entry) => { 
     let rawAudioURI = entry.toURL(); 
     this.audioURI = rawAudioURI.replace(/^file:\/\//, '/private'); 
     this.audioURIReady = true; 
     console.log("Audio URI: " + this.audioURI); 
    }, (error) => { 
     console.error(error); 
    }); 
    } 

    playAudioURI() { 
    console.log("Playing AudioURI"); 
    let downloadedAudio: MediaObject = this.media.create(this.audioURI); 
    console.log("Downloaded audio: " + downloadedAudio); 
    downloadedAudio.play(); 
    } 
} 
관련 문제