ksvc / KSYMediaPlayer_Android

金山云Android播放SDK(KSYUN Live Streaming player SDK),支持RTMP HTTP-FLV HLS 协议(supporting RTMP HTTP-FLV HLS protocol),直播延时2-3秒(Living delay 2 or 3 seconds),supporting jitter control,software&hardware decode
http://v.ksyun.com/
Apache License 2.0
855 stars 246 forks source link

TextureView seekTo 成功後 getCurrentPosition() 錯誤 #171

Open bingdow opened 7 years ago

bingdow commented 7 years ago

在調用 seekTo 並成功繼續播放後 getCurrentPosition() 總是回傳錯誤位置,seekbar 又被拉回起點(但影片播放正常),導致影片播放進度和 seekbar 不一致,代碼如下:

public int setVideoProgress(int currentProgress, boolean b) {
    if (mVideoView == null)
        return -1;

    long time = currentProgress > 0 ? currentProgress : mVideoView.getCurrentPosition();
    long length = mVideoView.getDuration();
    if(b){
        Log.v(TAG, "setVideoProgress: "+time + " (note: onStopTrackingTouch)");
    } else {
        Log.v(TAG, "setVideoProgress: "+time + " (note: UPDATE_SEEKBAR)");
    }

    // Update all view elements
    mPlayerSeekbar.setMax((int) length);
    mPlayerSeekbar.setProgress((int) time);

    if (time >= 0) {
        String progress = time + "/" + length;
        mPlayerPosition.setText(progress);
    }

    Message msg = new Message();
    msg.what = UPDATE_SEEKBAR;

    if (mHandler != null)
        mHandler.sendMessageDelayed(msg, 1000);
    return (int) time;
}

private int mVideoProgress = 0;
private SeekBar.OnSeekBarChangeListener mSeekBarListener = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            mVideoProgress = progress;
            mHandler.removeMessages(HIDDEN_SEEKBAR);
            Message msg = new Message();
            msg.what = HIDDEN_SEEKBAR;
            mHandler.sendMessageDelayed(msg, 3000);
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        mVideoView.seekTo(mVideoProgress);
        setVideoProgress(mVideoProgress, true);
    }
};

private IMediaPlayer.OnPreparedListener mOnPreparedListener = new IMediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(IMediaPlayer mp) {
        if (mVideoView != null) {
            mVideoView.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
            mVideoView.start();
            setVideoProgress(0, false);
        }
    }
};

mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case UPDATE_SEEKBAR:
                    setVideoProgress(0, false);
                    break;
                case HIDDEN_SEEKBAR:
                    mPlayerControlShow = false;
                    mPlayerControl.setVisibility(View.GONE);

                    break;
            }
        }
    };

系統日誌:

08-11 23:06:19.193 20910-20910: setVideoProgress: 212743 (note: onStopTrackingTouch)
08-11 23:06:19.214 20910-20910: Buffering Start.
08-11 23:06:19.567 20910-20910: Buffering End.
08-11 23:06:19.682 20910-20910: setVideoProgress: 14 (note: UPDATE_SEEKBAR)

版本:2.4.1 Android 版本: 5.0

FirmianaRain commented 7 years ago

你播放的是什么视频呢

bingdow commented 7 years ago

@FirmianaRain mp4 和 flv

dengchu817 commented 7 years ago

@bingdow 你试过demo播相同的视频吗

bingdow commented 7 years ago

@dengchu817 Demo 可以而且沒啥問題。在我的專案裡我只保留了和 seekbar 相關的代碼(如敘述所示),但是無法正常運作

dengchu817 commented 7 years ago

@bingdow 1.Log.v(TAG, "setVideoProgress: "+time + " (note: UPDATE_SEEKBAR)"); 打印的time是多少 2.还有你不做seek操作,seekbar会正常往前走吗?

bingdow commented 7 years ago

@dengchu817

  1. 如 log 所示:是 14 (單位:毫秒)
  2. 會正常往前走,但操作開始播放後就會出錯。如果我不去操作 seekbar 會正常地跑完。
dengchu817 commented 7 years ago

1.那你播放其他视频也有这样的问题,先确定和视频有没有关系? 2.每次seek之后OnSeekCompleteListener有回调吗?

  1. seek 之后getCurrentPosition()都是14吗,日志可以多提供一些
bingdow commented 7 years ago

@dengchu817

  1. 我測試了 mp4 flv 皆如此
  2. OnSeekCompleteListener 回調
    private IMediaPlayer.OnSeekCompleteListener mOnSeekCompletedListener = new IMediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(IMediaPlayer mp) {
            Log.e(TAG, "onSeekComplete...............");
        }
    };
  3. 不一定每次都是 14 有時候會是 0,總之結果都是又從頭開始播放了
dengchu817 commented 7 years ago

我用你提供的代码没有出现你说的问题,可能是你其他代码有问题。你可以试一下seekTo(long msec, boolean accurate)接口,accurate = true表示精准seek

shirongmiao commented 6 years ago

我也遇到了这个问题,用的KSYTextureView,OnSeekCompleteListener拿到的进度值为0