如何在播放前在视频中设置预览图像

Vig*_*esh 57 android android-videoview

VideoView在我的活动中创建了一个,下面是代码.

VideoView vvVideos = (VideoView) rootView.findViewById(R.id.videoView);
MediaController mediacontroller = new MediaController(ctx);
mediacontroller.setAnchorView(vvVideos);
    Uri video = Uri.parse("android.resource://" + packageName +"/"+R.raw.sample);
    vvVideos.setMediaController(mediacontroller);

    LayoutParams params=vvVideos.getLayoutParams();
    params.height=150;
    vvVideos.setLayoutParams(params);

    vvVideos.setVideoURI(video);
    vvVideos.requestFocus();
    vvVideos.setOnPreparedListener(new OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
            vvVideos.start();
        }
    });
Run Code Online (Sandbox Code Playgroud)

现在,视频在创建活动时开始播放.我想让我的活动如下

  1. 当活动开放时,视频不应该播放.
  2. 它应该显示起始视频图像(目前显示黑色)
  3. 它应该只在用户点击视频时播放.
    请帮我.

Jos*_*ter 105

使用seekTo( 1 )以显示第一帧.

确保影片已暂停,然后用于seekTo()显示视频的第一帧:

VideoView mVideoView = (VideoView) findViewById( R.id.video_preview );

mVideoView.setVideoURI( yourVideoPath );

mVideoView.seekTo( 1 );                 // 1 millisecond (0.001 s) into the clip.
Run Code Online (Sandbox Code Playgroud)

注意:我们使用.seekTo( 1 )因为设置.seekTo( 0 )在Android 9上不起作用.

@Lingviston在另一个答案中回答了点击时播放的内容.

  • 在Android 5上不起作用(至少在我的Nexus 5上) (18认同)
  • thnaks man,你救了我的一天!顺便说一下,调用`mVideoView.seekTo(0);`与加载第一帧的结果相同 (4认同)
  • 它也适用于Android 5,如果你去开发者设置并将媒体播放器设置为"AwesomePlayer"(旧的).这不是生产修复(显然),但它清除了问题所在. (3认同)

Shi*_*jil 27

使用此创建视频缩略图

Bitmap thumb = ThumbnailUtils.createVideoThumbnail("file path/url",
                            MediaStore.Images.Thumbnails.MINI_KIND);
Run Code Online (Sandbox Code Playgroud)

并设置为videoview

BitmapDrawable bitmapDrawable = new BitmapDrawable(thumb);
            mVideoView.setBackgroundDrawable(bitmapDrawable);
Run Code Online (Sandbox Code Playgroud)

  • @Apurva用户setBackground(可绘制的背景)代替. (4认同)
  • 不推荐使用`setBakgroundDrawable` (2认同)

Lin*_*ton 9

1)删除你的onPrepareListener.我不知道为什么你的视频在活动创建后开始播放,但是在videoView.start()之后调用onPrepareListener.

2)在VideoView顶部的布局中添加一个ImageView小部件.然后像这样设置另一个onPrepareListener:

vvVideos.setOnPreparedListener(new OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                previewImage.setVisibility(View.GONE);
            }
        });
Run Code Online (Sandbox Code Playgroud)

我注意到onPreparedListener太早启动,所以你可以使用

new Handler().postDelay(Runnable, timeInMilis)

取消预览图像.

3)向您添加带有任何手势检测的OnTouchListener VideoView.这是我现在使用的一个例子:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video);

    mGestureDetector = new GestureDetector(this, mGestureListener);

    ((VideoView) findViewById(R.id.activity_video_videoview)).setOnTouchListener(mTouchListener);
}
    private OnTouchListener mTouchListener = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mGestureDetector.onTouchEvent(event);
        return true;
    }
};
private SimpleOnGestureListener mGestureListener = new SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    if(mVideoView.isPlaying())
        mVideoView.pause();
    else
        mVideoView.start();
    return true;
};
};
Run Code Online (Sandbox Code Playgroud)

它通过点击开始/停止播放.

  • 尝试使用任何小值(例如100-200)的seekTo(). (2认同)

Sai*_*i N 7

只需要使用seekTo()方法将视频显示到100毫秒即可显示缩略图

videoView.seekTo(100);
Run Code Online (Sandbox Code Playgroud)


N.D*_*oid 5

您可以使用Glide 4.x。它将获取视频的第一帧,并在ImageView

添加到您的 build.gradle

implementation 'com.github.bumptech.glide:glide:4.x.x'
Run Code Online (Sandbox Code Playgroud)

在你班上

GlideApp.with(context)
                .load("your video URL")
                .into(videoImageView);;
Run Code Online (Sandbox Code Playgroud)