【发布时间】:2017-04-30 21:54:16
【问题描述】:
我正在使用 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();
现在我想取消缓冲流的过程,但我做不到。功能:
media.pause();
media.stop();
在 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
media.release() 命令停止加载流!然而,仅仅释放流而不停止它会导致其他相当大的问题:
如果您在媒体对象上调用media.release(),大多数情况下系统的反应非常缓慢并挂起几秒钟。但如果您经常这样做,系统会完全冻结。这意味着它不再接受远程控制命令。
Adb-log 仍在工作,但在这种情况下没有显示任何错误。只有电源按钮仍在工作(它锁定和解锁屏幕)。从这种搞砸的状态中恢复的唯一方法是重新启动设备。
如果媒体流尚未播放,我应该如何取消它?这是插件中的错误吗?
附加的是code-sn-p,我用它来处理媒体流逻辑。如上所述...它基本上可以工作,但如果您多次调用它,它会减慢甚至冻结设备。
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 if(media.src != media_src){
mediaReleaseRessources();
mediaCreateObject(media_src);
}
//interrupt_timer = false;
if(media === null){
mediaCreateObject(media_src);
}
media.play();
}
else if (action === 'pause') {
//If we get "pause", but it didn't even start yet
if(media._duration == -1){
mediaReleaseRessources();
}
else{
media.pause();
}
}
}
function mediaCreateObject(media_src){
media = new Media(media_src, mediaPlayerSuccess, mediaPlayerFail, mediaPlayerStatus);
}
function mediaReleaseRessources(){
media.release();
}
【问题讨论】:
-
这是离子 1 或 2 还是其他离子?
-
没有离子,只有科尔多瓦
6.4.0 -
@MichaelB 我觉得你得先调用 media.stop() 然后调用 media.release() 来释放资源。请试用
-
正如我在问题中已经写过的......在媒体对象上调用
media.stop(),尚未播放会导致以下错误:D/AudioPlayer( 3362): AudioPlayer Error: stopPlaying() called during invalid state: 1 -
@MichaelB 您是否尝试过像这样在停止和释放之前执行检查 - if (lastMedia != null && lastMedia.isPlaying()) ??
标签: android cordova cordova-media-plugin