2017-08-09 90 views
13

我正在使用Ionic,並且想要將音頻記錄到文件中,然後對文件執行某些操作。Ionic cordova媒體記錄用戶音頻不起作用

運行於:銀河S4

因此,首先,我創建文件:

await this.file.createFile(this.getFileDirectory(), this.getFileName(), true); 

當它準備好了,我創建了一個新的Media實例:

this.currentRecording = this.media.create(this.getFilePath()); 

連接成功和錯誤聽衆:

this.currentRecording.onSuccess.subscribe((e) => { 
    console.log(this.currentRecording.getDuration()); 
    this.file.readAsArrayBuffer(this.getFileDirectory(), this.getFileName()) 
      .then(file => console.warn(file)) 
}); 
this.currentRecording.onError.subscribe((err) => console.error(err)); 

然後我開始記錄: this.currentRecording.startRecord();

幾秒鐘後,我停止錄製,this.currentRecording.stopRecord(),並執行成功回調。

在控制檯中,我現在看到

-1 //的console.log(this.currentRecording.getDuration());

ArrayBuffer {} // console.warn(file);

我做錯了什麼?它如何解決成功,但沒有文件,也沒有持續時間?

編輯

繁殖庫:https://github.com/AmitMY/ionic-media-record-repro

自述有完整的說明

+0

1)你使用這個插件? https://ionicframework.com/docs/native/media/ 2)您是否在移動設備上試用您的代碼? – saperlipopette

+0

正確,那就是插件。我正在Android設備上運行 – Amit

+0

您可以放置​​TS組件的entiere代碼嗎?有一些像'this.getFileName()'這樣的方法,我不能真正理解這個目的。 – saperlipopette

回答

0

@Amit,我已經克隆你的回購和像你一樣得到了相同的結果。我花了一段時間擺弄它,這裏有一些與媒體插件有關的奇怪現象。我會嘗試花一些時間發送一些pull請求來添加一些功能並修復一些不良行爲,就像getDuration()一樣。

原來,getDuration()函數不問插件是什麼時間的天然組成部分,它與在JavaScript中保存的值返回,該值僅被更新時,本地代碼發送消息。 所以你不會得到新的當前持續時間值你可以通過使用cordova exec()來更改插件,讓它在本機代碼中獲得持續時間。

關於文件,我開始使用文件插件,但最終拋出了它。 只試用媒體插件,只傳遞文件名,沒有路徑。該文件存儲在/storage/emulated/0/file.3gp中。 它被記錄下來,有內容,並且可以播放。我的猜測是使用文件插件並傳遞完整路徑字符串會讓它創建你想要的文件。但是,當你將相同的路徑傳遞給媒體插件時,它並不尊重這一點,因爲當我使用它時,文件被分配,但在錄製之後它有0個字節,但仍然可以播放錄製內容,所以它必須將它存儲在某處其他。

如果單獨使用媒體插件解決您的問題,就像它爲我做的那樣,太棒了!如果它不是,你仍然想繼續工作,我建議你在Android Studio中使用android監視器來監視本地消息並查看插件的代碼。這是我發現關於這些事情的方式。

希望它有幫助

+1

謝謝!我轉而使用'cordova-plugin-audioinput'代替,這看起來工作得很好。 – Amit