转载:https://blog.csdn.net/u011506413/article/details/51704445
Android 播放视频并获取指定时间的帧画面
六.VideoView播放视频,MediaMetadataRetriever获取帧画面(就是你了!)
能够正常获取帧画面,并且画面之间不重复,即不是只取关键帧,而是去取相应时间点的帧画面。若不保存为图片(.png/.jpg),耗时最多为0.4s,基本达到要求。
参考:http://yashirocc.blog.sohu.com/175636801.html
public class MoviePlayerActivity extends Activity implements OnTouchListener, OnClickListener, Runnable { private static final String TAG = "ImageLight"; private String file_path; private VideoView videoView; private Button movie_play; private boolean playButtonVisible; private boolean playPause; @Override protected void onCreate(Bundle savedInstanceState) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // full screen requestWindowFeature(Window.FEATURE_NO_TITLE); // no title setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // landscape or horizontal screen super.onCreate(savedInstanceState); setContentView(R.layout.movie_player_activity); movie_play = (Button) findViewById(R.id.movie_videoview_play); movie_play.setOnClickListener(this); movie_play.setText("Play"); Intent intent = getIntent(); file_path = intent.getStringExtra("file_path"); videoView = (VideoView) findViewById(R.id.movie_palyer_videoview); videoView.setMediaController(null); // videoView.setMediaController(new MediaController(this)); videoView.setVideoPath(file_path); videoView.start(); videoView.requestFocus(); Thread screenShootThread = new Thread(this); screenShootThread.start(); videoView.setOnTouchListener(this); } @Override public void run() { MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever(); metadataRetriever.setDataSource(file_path); for (int i = 40000 * 1000; i < 50 * 1000 * 1000; i += 500 * 1000) { // try { // Thread.sleep(500); // } catch (InterruptedException e) { // e.printStackTrace(); // } Bitmap bitmap = metadataRetriever. getFrameAtTime(videoView.getCurrentPosition()*1000, MediaMetadataRetriever.OPTION_CLOSEST); Log.i(TAG, "bitmap---i: " + i/1000); String path = Environment.getExternalStorageDirectory() + "/bitmap/" + i + ".png"; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(path); bitmap.compress(Bitmap.CompressFormat.PNG, 90, fileOutputStream); Log.i(TAG, "i: " + i/1000); } catch (Exception e) { Log.i(TAG, "Error: " + i/1000); e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } bitmap.recycle(); } } @Override public boolean onTouch(View v, MotionEvent event) { if (!playButtonVisible) { movie_play.setVisibility(View.VISIBLE); movie_play.setEnabled(true); } else { movie_play.setVisibility(View.INVISIBLE); } playButtonVisible = !playButtonVisible; return false; } @Override public void onClick(View view) { switch (view.getId()) { case R.id.movie_videoview_play: if (!playPause) { movie_play.setText("Pause"); } else { movie_play.setText("Play"); } playPause = !playPause; break; default: break; } } }