2017-08-09 68 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