直接上代码。
一、AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.devin.simplevideorecorder">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@drawable/rec_video"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<activity android:name=".MainActivity"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
二、布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.devin.simplevideorecorder">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@drawable/rec_video"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<activity android:name=".MainActivity"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
三、主程序MainActivity.java
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
@Bind(R.id.btn_recordVideo)
ImageView btnRecordVideo;//录制视频
@Bind(R.id.btn_stop)
ImageView btnStop;//停止录制
@Bind(R.id.sfv_preview)
SurfaceView surfaceView;//预览窗口
private Camera camera = null;//摄像头
private SurfaceHolder holder;//SurfaceView控制器
private MediaRecorder recorder;//媒体录制器
private File savePath;//保存文件夹
private String saveFileName;//保存文件名
private File saveFile;//保存文件
private int scnWidth;//屏幕宽
private int scnHeight;//屏幕高
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initView();
}
/**
* 初始化
*/
private void initView() {
holder = surfaceView.getHolder();
holder.setKeepScreenOn(true);//设置屏幕常亮
holder.addCallback(this);//添加回调监控
//获取屏幕宽高
WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
scnWidth = metrics.widthPixels;
scnHeight = metrics.heightPixels;
holder.setFixedSize(scnWidth, scnHeight);//录制区域的尺寸的尺寸
btnRecordVideo.setEnabled(true);
btnStop.setEnabled(false);
}
/**
* 鼠标点击事件监听
*
* @param view
*/
@OnClick({R.id.btn_recordVideo, R.id.btn_stop})
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_recordVideo:
startRecordVideo();//录制视频
break;
case R.id.btn_stop:
stopRecord();//停止录制
break;
default:
break;
}
}
/**
* 停止录制
*/
private void stopRecord() {
if (recorder != null) {
recorder.stop();
Toast.makeText(this, "录制文件保存在" + saveFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
camera = getCamera();
startPreview(camera, holder);//重新开始预览
btnRecordVideo.setEnabled(true);
btnStop.setEnabled(false);
}
}
/**
* 视频录制
*/
private void startRecordVideo() {
savePath = Environment.getExternalStorageDirectory();
saveFileName = "record" + System.currentTimeMillis() + ".3gp";
saveFile = new File(savePath, saveFileName);
if (recorder == null) {
recorder = new MediaRecorder();
}
recorder.reset();
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置视频源
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频源
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出格式
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置视频编码
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码
recorder.setOutputFile(saveFile.getAbsolutePath());//设置输出文件
recorder.setVideoSize(1920, 1080);//设置分辨率
recorder.setVideoFrameRate(15);//设置帧率
releaseCamera();//摄像头停止预览
recorder.setPreviewDisplay(holder.getSurface());//给recorder设置预览窗口
try {
recorder.prepare();
recorder.start();
Toast.makeText(this, "开始录制视频...", Toast.LENGTH_SHORT).show();
btnRecordVideo.setEnabled(false);
btnStop.setEnabled(true);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
if (camera == null) {
camera = getCamera();
}
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
/**
* 获取相机
*
* @return
*/
private Camera getCamera() {
Camera camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();//获得相机的参数
parameters.setPreviewSize(scnWidth, scnHeight);//设置预览尺寸
return camera;
}
/**
* 开始预览
*/
private void startPreview(Camera camera, SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);//设置预览窗口
// camera.setDisplayOrientation(90);//旋转镜头
camera.startPreview();//开始预览
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 释放资源
*/
public void releaseCamera() {
if (camera != null) {
camera.setPreviewCallback(null);//取消回调
camera.stopPreview();//停止预览
camera.release();//释放资源
camera = null;//清除对象
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
startPreview(camera, holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
camera.stopPreview();
startPreview(camera, holder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
}
运行结果不错。录完接着预览。不过像素比的问题依然存在。