检测缓冲错误(或超时)Android MediaPlayer语言 - 使用定时器超时



显然没有抛出异常,因此我可以在缓冲流音频内容时识别错误。例如,我已经断开了路由器,应用程序将继续尝试缓冲整个时间。当我重新连接时,它完成缓冲,甚至在断开连接超过一分钟后继续!

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

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

所以基本上我问了两个问题:

1)检测缓冲区是否有问题的正确方法是什么?是不是有听众被我忽略了?我试过MediaPlayer。OnErrorListener当然在我的测试中不会触发。我的结论是,我必须有一个超时来检测缓冲错误。

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

从你的问题中,我了解到主要目标是检测玩家因缓冲而停滞的情况,并采取相应的行动。为了处理这种情况,我觉得下面两个听众可能会对识别相同的情况有所帮助。

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

还有另一个监听器MediaPlayer.onInfoListener,它有一些您可能感兴趣的特定事件。在这个监听器上,如果whatMEDIA_INFO_BUFFERING_START,这将表明播放器暂停播放缓冲,即触发你的逻辑。同样,MEDIA_INFO_BUFFERING_END表示填充缓冲区后重新开始播放。

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

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

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

为了在准备过程中缓冲,你必须设置自己的计时器,在间隔一段时间后调用player.reset()。这会让玩家回到初始状态。

对于准备后的缓冲(在游戏期间),您必须监视getPosition()。如果它低于某个最大值,则调用reset()。这允许您为播放设置体验阈值。不仅处理失败的连接,还处理不稳定的连接。

最好的解决方案是不使用MediaPlayer。使用公共VLC衍生工具代替。MP有太多内部化的私人设计限制,需要可怕的变通方法。不能添加编解码器)。在这种情况下,RTFM给了你虚假的希望。

除非你正在做一个非常简单的android应用程序,否则不要依赖任何android api。一些开源替代品得到了更好的支持,这是有充分理由的。

(删去了非常令人愉快的评论)

最新更新