标签: cordova-media-plugin

Ionic cordova媒体记录用户音频不起作用

我正在使用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有完整的说明

ionic-framework ionic2 cordova-media-plugin

13
推荐指数
1
解决办法
600
查看次数

Cordova媒体插件 - 停止流式传输 - release()冻结设备

我使用cordova 6.4.0cordova-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)

android cordova cordova-media-plugin

7
推荐指数
1
解决办法
1216
查看次数

如何使用 ionic Media 插件顺序播放多个音频

我正在尝试使用离子媒体插件播放多个音频文件: 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

5
推荐指数
1
解决办法
1522
查看次数