我正在使用Ionic,并希望将音频录制到文件中,然后对该文件执行某些操作。
继续运行:Galaxy S4
首先,我创建文件:
for k in current:
new_key = f'{key}.{k}' if len(key) > 0 else k
flatten(current[k], new_key, result)
准备好后,我创建一个新的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();
,并执行成功回调。
在控制台中,我现在看到了
-1 // console.log(this.currentRecording.getDuration());
ArrayBuffer {} // console.warn(file);
我做错了吗?它如何解决成功,但没有文件,没有持续时间?
修改
复制存储库:https://github.com/AmitMY/ionic-media-record-repro
README有完整说明
答案 0 :(得分:0)
@Amit,我克隆了您的回购并获得了与您相同的结果。我花了一段时间摆弄它,肯定会有一些奇怪的事情发生在媒体插件上。我会尝试花一些时间发送一些拉取请求来添加一些功能并修复一些不良行为,就像使用getDuration()一样。
原来getDuration()函数不会询问插件的原生部分是什么时间,它会返回javascript中保存的值,并且此值仅在本机时更新代码发送消息。 因此您无法获得新的当前持续时间值。 您可以更改插件,使用cordova exec()获取本机代码中的持续时间。
关于文件,我开始使用文件插件,但最终将其抛弃了。 仅使用媒体插件进行尝试,仅传递文件名,无路径。该文件存储在/storage/emulated/0/file.3gp中。 它被记录,有内容,并且可以播放。我的猜测是使用文件插件并传递完整路径字符串将使它创建您想要的文件。但是当你将相同的路径传递给媒体插件时,它并不尊重它,因为当我使用它时,文件被分配但是在录制之后它有0个字节,但我仍然可以播放录音,所以它必须将它存储在某个地方其他
如果单独使用媒体插件可以解决您的问题,就像它对我一样,太棒了!如果它没有,你仍然想继续这个,我建议你在Android Studio中使用Android监视器来监视本机消息并查看插件的代码。这就是我发现这些事情的方式。
希望有所帮助