我正在使用Ionic,并希望将音频录制到文件中,然后对文件执行某些操作.
运行于:Galaxy S4
首先,我创建文件:
await this.file.createFile(this.getFileDirectory(), this.getFileName(), true);
Run Code Online (Sandbox Code Playgroud)
准备好后,我创建一个新Media实例:
this.currentRecording = this.media.create(this.getFilePath());
Run Code Online (Sandbox Code Playgroud)
附加成功和错误侦听器:
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));
Run Code Online (Sandbox Code Playgroud)
然后我开始录音:
this.currentRecording.startRecord();
几秒钟后,我停止录制this.currentRecording.stopRecord(),并执行成功回调.
在控制台中,我现在看到了
-1 // console.log(this.currentRecording.getDuration());
ArrayBuffer {} // console.warn(file);
难道我做错了什么?它怎么解决成功,但没有文件,没有持续时间?
编辑
复制存储库:https://github.com/AmitMY/ionic-media-record-repro
README有完整的说明
我使用cordova 6.4.0与cordova-plugin-media用于在Android应用程序流媒体广播站.不幸的是,有一种情况,应用程序不再正常响应.
假设用户想要流式传输无线电,但是当流加载时,他想要中止它(例如,因为流已关闭,或者需要很长时间才能加载).
在这种情况下,我无法取消该过程!
media = new Media("http://direct.franceinfo.fr/live/franceinfo-midfi.mp3?ID=f9fbk29m84", mediaPlayerSuccess, mediaPlayerFail, mediaPlayerStatus);
media.play();
Run Code Online (Sandbox Code Playgroud)
现在我想取消缓冲流的过程,但我无法做到.功能:
media.pause();
media.stop();
Run Code Online (Sandbox Code Playgroud)
在ADB日志中抛出错误消息并调用mediaPlayer-onError回调.
D/AudioPlayer( 3362): AudioPlayer Error: pausePlaying() called during invalid state: 1
...
D/AudioPlayer( 3362): AudioPlayer Error: stopPlaying() called during invalid state: 1
Run Code Online (Sandbox Code Playgroud)
该media.release()命令停止加载流!然而,只是在不停止流的情况下释放流,会导致其他相当大的问题:
如果你调用media.release()媒体对象,大多数时候系统反应非常慢并且挂起几秒钟.但如果经常这样做,系统会完全冻结.这意味着它不再接受远程控制命令.Adb-log仍然有效,但在这种情况下不会显示任何错误.只有POWER按钮仍在工作(它锁定并解锁屏幕).从这种搞砸状态恢复的唯一方法是重启设备.
如果没有播放,我该如何取消媒体流呢?这是插件中的错误吗?
附件是代码片段,我用它来处理媒体流逻辑.如上所述...它基本上有效,但如果你多次调用它会减慢甚至冻结设备.
function radioControl(action, media_src){
//media_src is a webradio-streamurl.
if(action == 'play') {
// Initial Play
if(media === null){
mediaCreateObject(media_src);
}
// If we get PLAY but on antoher station
else …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用离子媒体插件播放多个音频文件: https://ionicframework.com/docs/native/media。但我很难在不使用超时功能的情况下使其作为播放列表工作。
这是我尝试过的
playOne(track: AudioFile): Promise<any> {
return new Promise(async resolve =>{
const AudFile = await this.media.create(this.file.externalDataDirectory+track.trackUrl);
await resolve(AudFile.play())
});
}
Run Code Online (Sandbox Code Playgroud)
然后玩 All ,我有这个:
async playAll(tracks: AudioFile[]): Promise<any>{
let player = (acc, track:AudioFile) => acc.then(() =>
this.playOne(track)
);
tracks.reduce(player, Promise.resolve());
}
Run Code Online (Sandbox Code Playgroud)
这样他们就可以同时玩了。
但是如果 PlayOne 方法包裹在超时函数中,则播放列表中存在超时设置的毫秒间隔,但一个播放列表不一定先于另一个播放列表完成,有时会等待很长时间才能播放后续文件是格子的。
超时实现如下所示:
playOne(track: AudioFile): Promise<any> {
return new Promise(async resolve =>{
setTimeout(async ()=>{
const AudFile = await this.media.create(this.file.externalDataDirectory+track.trackUrl);
await resolve(AudFile.play())
},3000)
});
}
Run Code Online (Sandbox Code Playgroud)
深入研究插件的离子包装器,创建方法如下所示:
/**
* Open a media file
* @param src {string} A …Run Code Online (Sandbox Code Playgroud) javascript ionic-framework cordova-media-plugin angular ionic4