首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测缓冲错误(或超时) Android MediaPlayer -使用计时器进行超时?

检测缓冲错误(或超时) Android MediaPlayer -使用计时器进行超时?
EN

Stack Overflow用户
提问于 2013-03-18 16:39:42
回答 4查看 6.8K关注 0票数 3

显然,没有异常抛出,这样我就可以在缓冲流音频内容时识别错误。例如,我已经断开了我的路由器和应用程序将继续尝试缓冲所有的时间。当我重新连接,然后它完成缓冲,并继续,即使是在断开超过一分钟!

所以问题是我不能让我的用户在那里坐那么久而不考虑这个问题。什么是检测Android媒体播放器缓冲问题的正确方法?

我正在考虑使用计时进行超时。我可能从15秒开始(使用一个代理,我测试了一个5 5kbps的连接,这将是最糟糕的情况,它能够在6-10秒内开始播放,所以我认为15秒将是一个合理的超时时间)。这听起来像是个好计划吗?如果是这样的话,我应该在每次尝试缓冲区时创建一个新的计时器,还是应该在回放服务的整个生命周期中保持相同的计时器?

基本上,我要问两个问题:

1)检测缓冲区是否有问题的正确方法是什么?有我忽略的听众吗?我已经尝试过MediaPlayer.OnErrorListener,当然这在我的测试中不起作用。我的结论是,我必须有一个超时来检测缓冲错误。

2)如果我说的第一位是正确的,那么使用计时器的正确方法是什么?每次尝试或重复使用相同的缓冲区创建一个?编辑也应该重新启动(或者取消并创建一个新的)计时器onBufferUpdate吗?对于onBufferUpdate侦听器,我应该知道一些数据正在返回,所以可能会用它来重置计时器。

EN

回答 4

Stack Overflow用户

发布于 2013-03-23 01:04:26

从你的问题,我知道,主要的目标是发现一个情况,如果你的球员因为缓冲而陷入停滞,并采取一些行动。为了处理这种情况,我认为以下两个侦听器可能有助于识别相同的情况。

MediaPlayer.onBufferingUpdate将提供缓冲的及时进展。因此,如果有两个具有相同percent值的回调,这可能是潜在缓冲的指示。

还有另一个侦听器MediaPlayer.onInfoListener,它有一些您可能感兴趣的特定事件。在此侦听器上,如果whatMEDIA_INFO_BUFFERING_START,这将指示播放机暂停播放以缓冲逻辑的触发器。类似地,MEDIA_INFO_BUFFERING_END表示填充缓冲区后重放的重新启动。

票数 4
EN

Stack Overflow用户

发布于 2013-03-18 16:46:57

你应该看看这篇文章。mediaplayer有一个ErrorListener来获取任何错误。

http://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener.html

票数 1
EN

Stack Overflow用户

发布于 2014-11-12 15:46:29

代码语言:javascript
复制
int count=40;//for 40 seconds to wait for buffering after it will finish the activity
//boolean timeoutflag=false;

timeout = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(Message msg) {
                System.out.println("value of count="+msg.getData().getLong("count"));
                if (msg.getData().getBoolean("valid")) {
                    if (msg.getData().getLong("count") == 0 && !timeoutflag) 
                    {

                        if (pDialog != null && pDialog.isShowing()) 
                                {   
                                try
                                {
                                pDialog.dismiss();
                                }catch(Exception e)
                                {
                                    e.printStackTrace();
                                }
                                }
                            Toast.makeText(getApplicationContext(),
                                    "Unable To Load This Video", Toast.LENGTH_LONG).show();
                        finish();

                    } else {
                    }

                }

            }
        };
        timeout.postDelayed(null, 0);
        new Thread(new Runnable() {

            @Override
            public void run() {
                while (count > 0) {
                    try {
                        Thread.sleep(1020);
                    } catch (Exception e) {
                    }

                    Message msg = new Message();
                    Bundle b = new Bundle();
                    b.putBoolean("valid", true);
                    b.putLong("count", --count);
                    msg.setData(b);
                    timeout.sendMessage(msg);

                }

            }
        }).start();
        // set timeoutflag=true; in setOnPreparedListener of video view
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15482168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档