2017-02-20 7 views
0

を変更し、ここでは、現在のコードであるフレームごとにビデオをシークは問題があるアンドロイド:とき動画シークバードローないseekto:シークバーときonSeekbarは、私はビデオのビューを使用し、私のプロジェクトでシークバーを

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, 
       boolean fromUser) { 

      if (fromUser) { 
       // this is when actually seekbar has been seeked to a new 
       // position 
       videoView.seekTo(progress); 
      } 
     } 
    }); 

を変更しました滑らかで、スキップフレームです。例えば

:ポイント2へ

ポイント1:

所要時間:1秒

フレーム:3

videoView.start(でプレイビデオの場合)、それはOKですが、もしシークバーをポイント1からポイント2に描画すると、スキップされたフレーム2になります。

答えて

0

ビデオストリームをエンコードするときは、通常、Iフレーム(Iピクチャ)またはKeyフレームは、このフレームが多くの情報を持ち、フレーム全体をデコードするために使用できることを意味します。スペースの量を減らすために、すべてのフレームはキーフレームとしてエンコードされず、代わりにP(予測)フレームまたは予測フレームとしてエンコードされます。つまり、キーフレームのヘルプでPフレームをデコードできます。

したがって、シーク操作の間、この場合、シークは、所与の時間の間、最も近いキーフレームに対して行われる。例えば、ユーザが40秒間シークし、最も近いキーフレームが35秒目にある場合、シークは35秒目に行われ、40秒目には行われない。

まだ動作しているかどうかは、次のように試すことができます。 Iピクチャまでの距離は通常0.5秒です。だから1ミリ秒ごとに求めるのではなく、秒を使って直接Iピクチャにジャンプしてみてください。

@Override 
    public void onProgressChanged(SeekBar seekBar, int progress, 
      boolean fromUser) { 

     if (fromUser) { 
      // this is when actually seekbar has been seeked to a new 
      // position 
      videoView.seekTo(progressx1000); 
     } 
    } 
enter code here 

次のように)(onStopTrackingTouchでそれを呼び出すようにしてください:

public void onStopTrackingTouch(SeekBar seekBar) { 
    videoView.seekTo(seekBar.getProgress()); 
} 

これは私が私のプロジェクトでそれを行う方法です。

+0

申し訳ありません、このソリューションは私のケースでは機能しません。 – Nicky

+0

@Nickyこのソリューションを使用して、どのような問題が発生していますか?動作する必要があります! –

+0

このビデオ[link](https://youtu.be/mAnfzJlfmSM)(ケースseekTo onProgressChanged)をご覧ください。 ご覧のとおり、seekBarをドラッグすると遅れます。 seekTo onStopTrackingTouchを置くと、ドラッグを停止するとseekToだけになります。 ありがとう – Nicky

関連する問題