Android MediaPlayer没有从prepareAsync返回 [英] Android MediaPlayer not returning from prepareAsync

查看:679
本文介绍了Android MediaPlayer没有从prepareAsync返回的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Logcat中得到以下回复,启动具有SPECIFIC URI的MediaPlayer。通常情况下,每个Uri,好的或者坏的,都会玩或回来,除了这个特定的一个错误。

  I / MPS: PrepAsync启动
V / MediaPlayer:收到消息msg = 8,ext1 = 0,ext2 = 0
V / MediaPlayer:无法识别的消息:(8,0,0)
V / MediaPlayer:回调应用程序
V / MediaPlayer:从回调

...并挂在那里。 p>

我真的只是看一下如何在错误处理程序中捕获此对话,但如果有人知道实际的问题更好。



源代码FWIW:

  mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mediaPlayer){
mediaPlayer.start();
}
});
}

try {
mediaPlayer.setDataSource(sUrl);
mediaPlayer.prepareAsync();
} catch(Exception e){
Log.d(TAG,Exception:+ e;
}

此外,我已经尝试创建一个OnInfoListener,OnError和OnBufferingUpdateListener,这些从不被调用。看来mediaPlayer在onPrepareAsync期间就消失了。



如果有人受到启发,这是URL。

  http://54.196.206.122 / entercom-koitfmaac-64 

我只是复制/粘贴到VLC来验证链接是否有效。



更新:看了更多之后,如果我等待足够长的时间,最终我得到这个:

  I / dalvikvm:threadid = 3:反应信号3 
I / dalvikvm:将堆栈跟踪写入'/data/anr/traces.txt'

更新:Shubhang Malviya指出的问题是我需要使用URI.parse作为:

  mMediaPlayer.setDataSource(mContext,Uri.parse(http://54.196.206.122 /企通信-koitfmaac-64\" )); 


解决方案

我以为会很好如果我分享我的实现:



尝试以下方式初始化您的媒体播放器

  try {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnSeekCompleteListener(this);
mMediaPlayer.setDataSource(mContext,Uri.parse(http://54.196.206.122/entercom-koitfmaac-64));
mMediaPlayer.prepareAsync();
} catch(IOException e){
//重置媒体播放器
}


$ b $只需几秒钟就可以打电话,而且正在播放您的音乐文件。


$ b $($)



另外FYI无法在客户端打开文件,尝试服务器端不是错误消息,而是来自MediaPlayer的调试消息。当试图播放网络视频流时,Logcat总是这样说。


I'm getting the following back in Logcat starting MediaPlayer with a SPECIFIC URI. Normally every Uri, good or bad, will either play or come back with an error except this particular one.

I/MPS﹕ PrepAsync started
V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
V/MediaPlayer﹕ unrecognized message: (8, 0, 0)
V/MediaPlayer﹕ callback application
V/MediaPlayer﹕ back from callback

... and hangs there.

I'm really just looking at how do I capture this conversation in an error handler but if someone knows the actual problem that's even better.

Source code FWIW:

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            mediaPlayer.start();
        }
    });
}

try {
    mediaPlayer.setDataSource(sUrl);
    mediaPlayer.prepareAsync();
} catch (Exception e) {
    Log.d(TAG, "Exception:"+e;
}

Also, I've tried creating an OnInfoListener, OnError and OnBufferingUpdateListener. These are never called. It's seems that mediaPlayer just goes away during onPrepareAsync.

Here is the URL if anyone is inspired to play with this.

http://54.196.206.122/entercom-koitfmaac-64

I just copy/pasted this into VLC to verify that the link is valid.

UPDATE: After looking at it more, if I wait long enough, eventually I get this:

I/dalvikvm﹕ threadid=3: reacting to signal 3
I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'

UPDATE: This problem as was pointed out by Shubhang Malviya was that I needed to use URI.parse as:

mMediaPlayer.setDataSource(mContext, Uri.parse("http://54.196.206.122/entercom-koitfmaac-64"));

解决方案

I thought It would be good If I share my implementation:

Try the following way of initialising your media player

try {
                    mMediaPlayer = new MediaPlayer();
                    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mMediaPlayer.setOnPreparedListener(this);
                    mMediaPlayer.setOnCompletionListener(this);
                    mMediaPlayer.setOnErrorListener(this);
                    mMediaPlayer.setOnBufferingUpdateListener(this);
                    mMediaPlayer.setOnInfoListener(this);
                    mMediaPlayer.setOnSeekCompleteListener(this);
                    mMediaPlayer.setDataSource(mContext, Uri.parse("http://54.196.206.122/entercom-koitfmaac-64"));
                    mMediaPlayer.prepareAsync();
                } catch (IOException e) {
                 // reset media player
                }

Mine onPrepared(MediaPlayer mp) is getting called after only a few seconds and it is playing your Music File.

Also FYI "Couldn't open file on client side, trying server side" is not an error message, but a debug message from the MediaPlayer. Logcat always says this when trying to play a network video stream.

这篇关于Android MediaPlayer没有从prepareAsync返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆