不喜勿喷,谢谢,有问题多沟通
* 主界面 * * */ public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button mBtn_Record; Button mBtn_Video; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onContentChanged() { super.onContentChanged(); initView(); } private void initView() { mBtn_Record = (Button) findViewById(R.id.btn_Record); mBtn_Video = (Button) findViewById(R.id.btn_Video); mBtn_Video.setOnClickListener(this); mBtn_Record.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_Record: startActivity(new Intent(MainActivity.this, RecordActivity.class)); break; case R.id.btn_Video: startActivity(new Intent(MainActivity.this, VideoActivity.class)); break; } }}
===========================================================================================
/** * 录制视频界面 */ public class RecordActivity extends AppCompatActivity implements SurfaceHolder.Callback { //显示视频预览的SurfaceView SurfaceView mSurfaceView; //系统的视频文件 File videoFile; //录制视频的封装类 MediaRecorder mRecorder; //记录是否正在进行视频录制 private boolean isRecording; private Camera mCamera; private SurfaceHolder mHolder; private ToggleButton mToggleButton; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_record); } @Override public void onContentChanged() { super.onContentChanged(); //设置CallBack回调 mSurfaceView = (SurfaceView) this.findViewById(R.id.record_surfaceView); mHolder = mSurfaceView.getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //设置开关按钮 mToggleButton = (ToggleButton) findViewById(R.id.togbtn); mToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { if (isChecked) {//true时,从关闭状态到开启状态 startmediaRecorder(); Toast.makeText(RecordActivity.this, "开始录像", Toast.LENGTH_SHORT).show(); } else {//false时,从开启状态到关闭状态 stopmediaRecorder(); Toast.makeText(RecordActivity.this, "录像完成", Toast.LENGTH_SHORT).show(); } } }); } @Override protected void onResume() { super.onResume(); openCamera(); if (mHolder != null) { setStartPreview(mHolder, mCamera); } } /** * 获取Camera硬件对象 */ private void openCamera() { if (mCamera == null) { mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); } } /** * 释放相机资源 */ private void releaseCamera() { if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } } /* * 开始前的准备 * */ private void setStartPreview(SurfaceHolder surfaceHolder, Camera camera) { try { camera.setPreviewDisplay(surfaceHolder); //将系统预览的角度设为横屏 camera.setDisplayOrientation(90); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { setStartPreview(mHolder, mCamera); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { mCamera.stopPreview(); setStartPreview(mHolder, mCamera); } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { releaseCamera(); } /* * 结束录制的方法 * */ private void stopmediaRecorder() { if (mRecorder != null) { if (isRecording) {//如果正在录制 mRecorder.stop(); mRecorder.reset(); mRecorder.release(); mRecorder = null; isRecording = false; try { mCamera.reconnect(); } catch (IOException e) { Toast.makeText(this, "reconect fail", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } } } /* * 开始录制的方法 * */ private void startmediaRecorder() { if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Toast.makeText(RecordActivity.this, "SD卡不存在,请插入SD卡", Toast.LENGTH_SHORT).show(); return; } //创建保存录制视频的视频文件 try { Integer i = 0; videoFile = new File(Environment.getExternalStorageDirectory().getCanonicalFile() + "/" + new Date() + ".mp4"); } catch (IOException e) { e.printStackTrace(); } mCamera.unlock(); isRecording = true; mRecorder = new MediaRecorder(); mRecorder.reset(); mRecorder.setCamera(mCamera); mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //设置录像机拍摄参数, mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mRecorder.setVideoFrameRate(5); mRecorder.setVideoSize(640, 480); mRecorder.setOutputFile(videoFile.getAbsolutePath()); mRecorder.setPreviewDisplay(mHolder.getSurface()); try { mRecorder.prepare(); } catch (IOException e) { isRecording = false; mCamera.lock(); Toast.makeText(RecordActivity.this, "fail", Toast.LENGTH_LONG).show(); e.printStackTrace(); } mRecorder.start(); } }===============================================================================================public class VideoPath { File videoFile=new File(Environment.getExternalStorageDirectory().getCanonicalFile()+"/myvideo.mp4"); public VideoPath() throws IOException { } }===========================================================================================//播放视频界面 public class VideoActivity extends AppCompatActivity { //播放视频的SurfaceView SurfaceView mSurfaceView; SurfaceHolder mSurfaceHolder; //播放视频的封装类使用的是vitamio包的 MediaPlayer mMediaPlayer; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video); } @Override public void onContentChanged() { super.onContentChanged(); mSurfaceView = (SurfaceView) findViewById(R.id.video_surface); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.setFormat(PixelFormat.RGBA_8888); mSurfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { // 初始化MediaPlayer mMediaPlayer = new MediaPlayer(getApplicationContext()); //将MediaPlayer与surfaceHolder进行绑定 mMediaPlayer.setDisplay(mSurfaceHolder); //设置数据 try { mMediaPlayer.setDataSource(new VideoPath().videoFile.getCanonicalPath()); } catch (IOException e) { e.printStackTrace(); } //准备播放 mMediaPlayer.prepareAsync(); //播放,监听是否准备好 mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mMediaPlayer.start(); } }); //无法播放,黑屏 mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { if (what == MediaPlayer.MEDIA_INFO_FILE_OPEN_OK) { //对audio进行处理 mMediaPlayer.audioInitedOk(mMediaPlayer.audioTrackInit()); return true; } return false; } }); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { } }); } }========================================================================================demo地址:
链接:http://pan.baidu.com/s/1bHtGK2 密码:cs87