微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 永远不会调用OnInfoListener

我正在尝试收听我创建的媒体播放器的OnInfoListener,以便在缓冲开始和结束时获取.

由于某种原因,事件永远不会发生.

这是我的初始化代码

private void initPlayer(Surface s){
    mPlayer = new MediaPlayer();
    mPlayer.setSurface(s);


    mPlayer.setonCompletionListener(this);
    mPlayer.setonErrorListener(this);
    mPlayer.setonInfoListener(this);
    mPlayer.setonPreparedListener(this);
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    try {
        mPlayer.setDataSource(file_url);
        mPlayer.prepare();
    } catch (IllegalArgumentException e) {
        OnError(PLAYER_ERRORS.player_not_loaded,e.getMessage() + "");
    } catch (SecurityException e) {
        OnError(PLAYER_ERRORS.player_not_loaded,e.getMessage() + "");
    } catch (IllegalStateException e) {
        OnError(PLAYER_ERRORS.player_not_loaded,e.getMessage() + "");
    } catch (IOException e) {
        OnError(PLAYER_ERRORS.no_connection,e.getMessage() + "");
    }
}

这是我的倾听者

@Override
public boolean onInfo(MediaPlayer mp,int what,int extra) {


    if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START)
    {
        OnEvent(PLAYER_EVENT.buffering_start);
    }
    else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_END)
    {
        OnEvent(PLAYER_EVENT.buffering_end);
        OnGotDuration(getDuration());
    }

    return what == MediaPlayer.MEDIA_INFO_BUFFERING_START || what == MediaPlayer.MEDIA_INFO_BUFFERING_END;
}

有人可以帮我理解为什么会这样吗?
谢谢

解决方法

显然这是Android中的一个已知错误.
在播放HLS流时,它永远不会调用OnInfoListener或OnBuffering.

查看here了解更多详情

我所谓的解决方案是创建一个现在沿着播放器一侧运行的线程,并不时检查其进度以确定播放是否停止 – 假设这意味着播放器正在缓冲.

这是我想要的代码

private class BufferingThread extends Thread{

    WeakReference<NewDefaultPlayer> player;
    long currentPos,lastSecond;
    boolean isBuffering,alreadyBuffering;
    private Object locker = new Object();

    public BufferingThread(NewDefaultPlayer player) {
        this.player = new WeakReference<NewDefaultPlayer>(player);
    }

    private Runnable BufferStart = new Runnable() {
        public void run() {
            player.get().OnEvent(PLAYER_EVENT.buffering_start);
        }
    };

    private Runnable BufferStop = new Runnable() {
        public void run() {
            player.get().OnEvent(PLAYER_EVENT.buffering_end);
        }
    };

    @Override
    public void run() {
        super.run();

        while(true)
        {
            synchronized (locker) {
                currentPos = player.get().getCurrentPosition();
                isBuffering = currentPos == 0 ? true : currentPos <= lastSecond;
                lastSecond = (int) currentPos;
                if(alreadyBuffering){
                    if(!isBuffering)
                    {
                        if(player.get().getPlayerState().equals(PLAYER_STATES.IS_PLAYING))
                        {
                            alreadyBuffering = isBuffering;
                            TvinciSDK.getMainHandler().post(BufferStop);
                        }
                    }
                } else {
                    if(isBuffering){
                        alreadyBuffering = isBuffering;
                        TvinciSDK.getMainHandler().post(BufferStart);
                    }
                }
                try {
                    sleep(1500);
                } catch (InterruptedException e) {
                    break;
                }
            }
        }

    }
}

//Stop the thread if the user has stopped the video
private void handleBufferingWorkaround(boolean work){
    if(bThread == null)
        bThread = new BufferingThread(this);
    if(work){
        if(!bThread.isAlive())
            bThread.start();
    }
    else if(bThread.isAlive())
    {
        bThread.interrupt();
        bThread = null;
    }
}

希望能帮助到你

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐