如何在播放前在videoview中设置预览图像
我在我的活动中创build了一个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(); } });
现在video开始在活动创build时播放。 我想按以下方式进行我的活动
- 当活动开放时,video不应播放。
- 它应该显示开始的video图像(目前它显示黑色)
- 只有当用户点击video时才应该播放。
请帮帮我。
使用seekTo()
来显示第一帧。
确保电影已暂停,然后使用seekTo()
显示video的第一帧:
VideoView mVideoView = (VideoView) findViewById(R.id.video_preview); mVideoView.setVideoURI(yourVideoPath); mVideoView.seekTo(100); // 100 milliseconds (0.1 s) into the clip.
点击时播放它已被@Lingviston在另一个答案中回答。
使用这个创buildvideo缩略图
Bitmap thumb = ThumbnailUtils.createVideoThumbnail("file path/url", MediaStore.Images.Thumbnails.MINI_KIND);
并设置为videoview
BitmapDrawable bitmapDrawable = new BitmapDrawable(thumb); mVideoView.setBackgroundDrawable(bitmapDrawable);
1)删除你的onPrepareListener。 我不知道为什么你的video在活动创build后开始播放,但在videoView.start()之后调用onPrepareListener。
2)在VideoView顶部添加一个ImageView小部件到你的布局。 然后像这样设置另一个onPrepareListener:
vvVideos.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { previewImage.setVisibility(View.GONE); } });
我注意到,onPreparedListener触发得太早,所以你可以使用
new Handler().postDelay(Runnable, timeInMilis)
closures预览图像。
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; }; };
它通过水龙头开始/停止播放。
以为我会分享我的解决scheme。 seekTo
方法很好,但只适用于某些设备。 这是我的工作。 我在onPreparedListener的onPrepared方法中处理这个问题,但是它取决于你。
@Override public void onPrepared(MediaPlayer mp) { MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(uri.getPath()); try { Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(currentPosition); videoView.setBackgroundDrawable(new BitmapDrawable(bitmap)); } catch (OutOfMemoryError outOfMemoryError) { //Not entirely sure if this will ever be thrown but better safe than sorry. videoView.seekTo(currentPosition); } }
现在,当你播放video时,你需要删除这样的背景图片:
private void play() { ... videoView.setBackgroundDrawable(null); .. }
请享用!
我知道这是一个古老的问题,但我需要相同的解决scheme,无法在其他地方find答案,所以我做了解决scheme,我在这里分享爱:
我刚刚为它创build了一个小类:
public class LoadFirstVideoFrame implements Runnable { private static Handler uiHandler = new Handler(Looper.getMainLooper()); private VideoView videoView; private LoadFirstVideoFrame(VideoView videoView) { this.videoView = videoView; videoView.start(); videoView.resume(); uiHandler.post(this); } public void stop() { videoView = null; uiHandler.removeCallbacks(this); } @Override public void run() { if (videoView == null) return; if (videoView.isPlaying()) { videoView.pause(); videoView.seekTo(0); videoView = null; } else { uiHandler.post(this); } } }
它只是简单地要求开始播放,并在第一帧暂停video,只要它真的在播放(意味着它已经加载了文件,并且已经在SurfaceView中渲染了)。
这里需要注意的一点是记得在这个类上调用stop()
,这样可以正确清理,而不是内存泄漏任何东西。
我希望它有帮助。
只要寻求video100毫秒,它显示缩略图使用seekTo()方法
videoView.seekTo(100);