jithinroy
jithinroy

Reputation: 1885

Control the playback speed of video in android

I am using a VideoView to play a video file kept in res/raw. I couldnt find a way to control the playback speed of the video. Basically i want to reduce and increase the playback while moving a scroll bar. Is there any work around for implementing this?

Upvotes: 10

Views: 11666

Answers (5)

vladimir ulianitsky
vladimir ulianitsky

Reputation: 136

I want to say than Mk Kamal's solution have an unexpected side effect: calling setPlaybackParams in OnPreparedListener will force VideoView to repeat the latest played video when the app was returned from the background. I don't know is it a bug or a feature, but I found a way to avoid such behavior:

private float speed = 0.8f;
private final MediaPlayer.OnInfoListener listener = (mp, what, extra) -> {

    if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
        mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(speed));
        return true;
    }
    return false;
};


videoView.setOnPreparedListener(
                mp -> {
                    mp.setOnInfoListener(listener);
                }
        );

MEDIA_INFO_VIDEO_RENDERING_START will be sent only if the palyer was already started.

And I want to emphasize that getPlaybackParams is annotated as @NonNull, so it's not necessary to create a new PlaybackParams object.

Upvotes: 2

Dmitry Eloev
Dmitry Eloev

Reputation: 1

Kotlin variant, API above 23

val playerView = itemView.findViewById<VideoView>(R.id.videoview)
playerView.setVideoURI(Uri.parse("android.resource://" + context.packageName + "/" + R.raw.123.mp4))

playerView.setOnPreparedListener { mediaPlayer ->
   playerView.seekTo(1) // for video preview
   mediaPlayer.playbackParams = mediaPlayer.playbackParams.apply {
      speed = 0.6f
   }
   playerView.start()
}

Upvotes: 0

Mk Kamal
Mk Kamal

Reputation: 191

you can use this but it works on api 23 and above

 mVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {

            //works only from api 23
            PlaybackParams myPlayBackParams = null;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                myPlayBackParams = new PlaybackParams();
                myPlayBackParams.setSpeed(0.8f); //you can set speed here
                mp.setPlaybackParams(myPlayBackParams);
            }

        }
    });

Upvotes: 16

Daniel Lee
Daniel Lee

Reputation: 1

DicePlayer works perfectly on my Asus Transformer. It has a speed control onscreen display.

I'm not sure what res/raw is though.

Upvotes: -3

shihpeng
shihpeng

Reputation: 5381

No, you cannot change the playback rate by simply using VideoView. VideoView and MediaPlayer only provide limited media functions.

You have to use some third party library, e.g., PVPlayer, and implement that yourself.

That's also why good media players on Android are so valuable:)

Upvotes: 4

Related Questions