Android多媒体四:MediaRecorder录制视频短片
MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同。
只是录制视频时不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int audio_source)方法时
再调用setVideoSource(int video_source)方法来设置图像来源。
除此之外,还需要在调用setOutputFormat()设置输出文件格式之后进行如下步骤:
1、调用MediaRecorder对象的setVideoEncoder()、setVideoEncodingBitRate(int bitRate)、setVideoFrameRate()设置所录制的视频的编码格式、
编码位率、每秒多少帧等,这些参数将可以控制所录制的视频的品质、文件的大小。一般来说,视频品质越好,视频文件越大。
2、调用MediaRecorder的setPreviewDisplay(SurfaceView sv)方法设置使用哪个SurfaceView来显示视频预览。
实例:录制视频并保存
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal">
<Button
android:id="@+id/recode"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="录制" />
<Button
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止" />
</LinearLayout>
<!-- 显示视频预览的SurfaceView -->
<SurfaceView
android:id="@+id/sView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
com/example/administrator/MainActivity.java
package com.example.administrator;
import android.Manifest;
import android.app.Activity;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.example.administrator.Permission.PermissionManager;
import java.io.File;
import java.io.IOException;
public class MainActivity extends Activity implements OnClickListener, PermissionManager.PermissionsResultListener {
private final String TAG = "MainActivity";
//程序中的两个按钮
Button recode;
Button stop;
//系统的视频文件
File videoFile;
MediaRecorder mRecorder;
//显示视频预览的SurfaceView
SurfaceView sView;
//记录是否正在进行录制
private boolean isRecoding = false;
private Camera mCamera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PermissionManager.requestPermission(this, "录制视频", 5, this, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE);
//获取程序界面中的两个按钮
recode = findViewById(R.id.recode);
stop = findViewById(R.id.stop);
//让stop按钮不可用
stop.setEnabled(false);
//为按钮的单击事件绑定监听器
recode.setOnClickListener(this);
stop.setOnClickListener(this);
//获取程序界面中的SurfaceView
sView = this.findViewById(R.id.sView);
//下面设置Surface不需要自己维护缓冲区
sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置分辨率
sView.getHolder().setFixedSize(320, 280);
//设置该组件让屏幕不会自动关闭
sView.getHolder().setKeepScreenOn(true);
}
@Override
public void onClick(View source) {
switch (source.getId()) {
//单击录制按钮
case R.id.recode:
Toast.makeText(this, "SD卡不存在,请插入SD卡!", 5000).show();
if (!Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
return;
}
//创建保存录制视频的视频文件
try {
videoFile = new File(Environment.getDownloadCacheDirectory().getCanonicalFile() + "/myvideo.mp4");
} catch (IOException e) {
e.printStackTrace();
}
Log.i(TAG, "onClick: path = " + videoFile.toString());
//创建MediaRecorder对象
mRecorder = new MediaRecorder();
mCamera = Camera.open();
Camera.Parameters params = mCamera.getParameters();
mCamera.setDisplayOrientation(90);//旋转了90度,最好先判断下JDK的版本号,再决定旋转不
mCamera.setParameters(params);
mCamera.stopPreview();
mCamera.unlock();//解锁
mRecorder.setCamera(mCamera);
mRecorder.reset();
//设置从麦克风采集声音
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置从摄像头采集图像
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//设置视频文件的输出格式(必须在设置声音编码格式、图像编码格式之前设置)
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
//设置声音编码的格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//设置图像编码的格式
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
// mRecorder.setVideoSize(320, 280);
//每秒4帧
mRecorder.setVideoFrameRate(30);
mRecorder.setOutputFile(videoFile.getAbsolutePath());
//指定使用SurfaceView来预览视频
mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
try {
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
//开始录制
mRecorder.start();
System.out.println("----recoding----");
//让recorde按钮不可用
recode.setEnabled(false);
//让stop按钮可用
stop.setEnabled(true);
isRecoding = true;
break;
//单击停止按钮
case R.id.stop:
//如果正在进行录制
if (isRecoding) {
//停止录制
mRecorder.stop();
//释放资源
mRecorder.release();
//让record按钮可用
recode.setEnabled(true);
//让stop按钮不可用
stop.setEnabled(false);
mCamera.release();
}
break;
}
}
@Override
public void onPermissionGranted(int requestCode) {
}
@Override
public void onPermissionDenied(int requestCode) {
}
}