Android视频录制、播放的两种方式一
1、注意:这里播放camera录制的视频使用VideoView,不使用MediaPlayer和SurfaceView的结合。用帧布局Framelayout布局,VideoView和ImageView,播放时隐藏视频缩略图,暂停时或初始化时显示视频缩略图。
因为VideoView没有设置监听播放和暂停状态的事件,所以我自定义一个CustomVideoView继承了VideoView,在里面创建一个监听方法和重写VideoView的播放、暂停的方法。
使用相机intent获取视频是使用最少代码使得你的应用获取视频的捷径.一个视频获取intent可以包含以下额外信息:
MediaStore.EXTRA_OUTPUT-此设置需要一个保存视频的路径和文件名的Uri.此设置是可选的但是强列推荐的.如果你不指定此值,相机应用就把请求到的图像以默认的文件名保存到默认的文件夹下,这些信息保存在返回的intent的Intent.getData()字段中.
MediaStore.EXTRA_VIDEO_QUALITY- 此值在最低质量最小文件尺寸时是0,在最高质量最大文件尺寸时是1.
MediaStore.EXTRA_DURATION_LIMIT- 此值设置获取视频的长度,以秒为单位.
MediaStore.EXTRA_SIZE_LIMIT- 此值设置获取视频文件的大小,以字节为单位.
2、空白窗口Activity的XML布局视图:

3、Activity的代码如下:
public class MainActivity extends AppCompatActivity { private static int REQUST_VIDEO = 1; private Button btn; private Button btn_start; private FrameLayout fl; private CustomVideoView video; private ImageView iv; private String sdCard; private String videoPath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init(){ btn = ((Button) findViewById(R.id.btn_recoder)); btn_start = ((Button) findViewById(R.id.btn_start)); fl = ((FrameLayout) findViewById(R.id.fl_video)); video = ((CustomVideoView) findViewById(R.id.video)); iv = ((ImageView) findViewById(R.id.iv)); sdCard = Environment.getExternalStorageDirectory().getPath(); String currenTimeMillis = new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date(System.currentTimeMillis())); videoPath = sdCard + "/" + "0000.mp4"; MediaController controller = new MediaController(this); video.setMediaController(controller); if (video.isPlaying()){ iv.setVisibility(View.INVISIBLE); } video.setPlayPauseListener(new CustomVideoView.PlayPauseListener() { @Override public void onPlay() { Toast.makeText(MainActivity.this,"播放",Toast.LENGTH_SHORT).show(); iv.setVisibility(View.INVISIBLE); } @Override public void onPause() { Toast.makeText(MainActivity.this,"暂停",Toast.LENGTH_SHORT).show(); iv.setVisibility(View.VISIBLE); } }); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT,videoPath); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1); startActivityForResult(intent,REQUST_VIDEO); } }); } private Bitmap getVideoBitmap(String videoPath){ MediaMetadataRetriever retriever = null; try { retriever = new MediaMetadataRetriever(); retriever.setDataSource(videoPath); Bitmap bitmap = retriever.getFrameAtTime(); return bitmap; }finally { retriever.release(); } } private Bitmap getVideoBitmap2(Uri uri){ MediaMetadataRetriever retriever = null; try { retriever = new MediaMetadataRetriever(); retriever.setDataSource(this,uri); Bitmap bitmap = retriever.getFrameAtTime(); return bitmap; }finally { retriever.release(); } } public void start(View view){ iv.setVisibility(View.INVISIBLE); video.start(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK){ if (requestCode == REQUST_VIDEO){ fl.setVisibility(View.VISIBLE); btn_start.setVisibility(View.VISIBLE); Uri uri = data.getData(); video.setVideoURI(uri);// Bitmap bitmap = getVideoBitmap(videoPath); Bitmap bitmap = getVideoBitmap2(uri); iv.setImageBitmap(bitmap); } } }}
//自定义VideoViewpublic class CustomVideoView extends VideoView { private PlayPauseListener listener; public CustomVideoView(Context context) { super(context); } public CustomVideoView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomVideoView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setPlayPauseListener(PlayPauseListener listener){ this.listener = listener; } @Override public void pause() { super.pause(); if (listener!=null){ listener.onPause(); } } @Override public void start() { super.start(); if (listener!=null){ listener.onPlay(); } } interface PlayPauseListener{ void onPlay(); void onPause(); }}
4、最终效果图如下:
