7

バッファリングの開始時と終了時に取得するために作成した mediaplayer の 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;
}

誰かがなぜこれが起こっているのか理解するのを手伝ってもらえますか? ありがとう

4

1 に答える 1

7

どうやらそれはAndroidの既知のバグです。HLS ストリームを再生するときは、OnInfoListener または OnBuffering を呼び出すことはありません。

詳細はこちら

私のいわゆる解決策は、プレーヤーの側で実行されるスレッドを作成し、その進行状況を時々チェックして、再生が停止しているかどうかを判断することでした-それはプレーヤーがバッファリングしていることを意味します。

これが欲しい人のための私のコードです

    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;
    }
}

それが役に立てば幸い

于 2013-07-25T13:27:17.347 に答える