Android音视频之MediaRecorder音视频录制 下载本文

Android音视频之MediaRecorder音视频录制 效果图:

MediaRecorder类介绍:

MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息。

MediaRecorder主要函数:

setAudioChannels(int numChannels) 设置录制的音频通道数 setAudioEncoder(int audio_encoder) 设置audio的编码格式 setAudioEncodingBitRate(int bitRate) 设置录制的音频编码比特率 setAudioSamplingRate(int samplingRate) 设置录制的音频采样率 setAudioSource(int audio_source) 设置用于录制的音源

setAuxiliaryOutputFile(String path) 辅助时间的推移视频文件的路径传递

setAuxiliaryOutputFile(FileDescriptor fd)在文件描述符传递的辅助时间的推移视频 setCamera(Camera c) 设置一个recording的摄像头 setCaptureRate(double fps) 设置视频帧的捕获率

setMaxDuration(int max_duration_ms) 设置记录会话的最大持续时间(毫秒) setMaxFileSize(long max_filesize_bytes) 设置记录会话的最大大小(以字节为单位) setOutputFile(FileDescriptor fd) 传递要写入的文件的文件描述符 setOutputFile(String path) 设置输出文件的路径

setOutputFormat(int output_format) 设置在录制过程中产生的输出文件的格式 setPreviewDisplay(Surface sv) 表面设置显示记录媒体(视频)的预览 setVideoEncoder(int video_encoder) 设置视频编码器,用于录制 setVideoEncodingBitRate(int bitRate) 设置录制的视频编码比特率 setVideoFrameRate(int rate) 设置要捕获的视频帧速率

setVideoSize(int width, int height) 设置要捕获的视频的宽度和高度

setVideoSource(int video_source) 开始捕捉和编码数据到setOutputFile(指定的文件) setLocation(float latitude, float longitude) 设置并存储在输出文件中的地理数据(经度和纬度)

setProfile(CamcorderProfile profile) 指定CamcorderProfile对象 setOrientationHint(int degrees)设置输出的视频播放的方向提示

setOnErrorListener(MediaRecorder.OnErrorListener l)注册一个用于记录录制时出现的错误的监听器

setOnInfoListener(MediaRecorder.OnInfoListener listener)注册一个用于记录录制时出现的信息事件

getMaxAmplitude() 获取在前一次调用此方法之后录音中出现的最大振幅 prepare()准备录制。 release()释放资源

reset()将MediaRecorder设为空闲状态 start()开始录制 stop()停止录制

MediaRecorder主要配置参数:

1.)视频编码格式MediaRecorder.VideoEncoder

default,H263,H264,MPEG_4_SP,VP8

2.)音频编码格式MediaRecorder.AudioEncoder

default,AAC,HE_AAC,AAC_ELD,AMR_NB,AMR_WB,VORBIS

3.)视频资源获取方式MediaRecorder.VideoSource

default,CAMERA,SURFACE

4.)音频资源获取方式MediaRecorder.AudioSource

defalut,camcorder,mic,voice_call,

voice_communication,voice_downlink,voice_recognition, voice_uplink

5.)资源输出格式MediaRecorder.OutputFormat

amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp,aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm

MediaRecorder录制视频简单实现:

1.)需要添加权限

android:name=\ />

2.)简单实现录制视频

public class MediaRecorderActivity extends Activity implements SurfaceHolder.Callback {

private SurfaceView mSurfaceView;

private SurfaceHolder mSurfaceHolder; private Button btnStartStop;

private boolean isRecording = false;//标记是否已经在录制 private MediaRecorder mRecorder;//音视频录制类 private Camera mCamera = null;//相机

private Camera.Size mSize = null;//相机的尺寸 private int mCameraFacing =

Camera.CameraInfo.CAMERA_FACING_BACK;//默认后置摄像头

private static final SparseIntArray orientations = new SparseIntArray();//手机旋转对应的调整角度

static {

orientations.append(Surface.ROTATION_0, 90);

orientations.append(Surface.ROTATION_90, 0); orientations.append(Surface.ROTATION_180, 270); orientations.append(Surface.ROTATION_270, 180); }

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setWindow();

setContentView(R.layout.activity_media_recorder); initViews(); }

private void setWindow() {

requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏

// 设置竖屏显示

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 选择支持半透明模式,在有surfaceview的activity中使用。 getWindow().setFormat(PixelFormat.TRANSLUCENT); }

private void initViews() {

mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); btnStartStop = (Button) findViewById(R.id.btnStartStop); btnStartStop.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) { if (!isRecording) { startRecord(); } else {

stopRecord(); } } });

SurfaceHolder holder = mSurfaceView.getHolder();// 取得holder

holder.setFormat(PixelFormat.TRANSPARENT); holder.setKeepScreenOn(true);

holder.addCallback(this); // holder加入回调接口 }

/**

* 初始化相机 */

private void initCamera() {

if (Camera.getNumberOfCameras() == 2) { mCamera = Camera.open(mCameraFacing); } else {

mCamera = Camera.open(); }

CameraSizeComparator sizeComparator = new CameraSizeComparator();

Camera.Parameters parameters = mCamera.getParameters();

if (mSize == null) {

List vSizeList = parameters.getSupportedPreviewSizes();

Collections.sort(vSizeList, sizeComparator);

for (int num = 0; num < vSizeList.size(); num++) { Camera.Size size = vSizeList.get(num);

if (size.width >= 800 && size.height >= 480) { this.mSize = size; break; } }

mSize = vSizeList.get(0);

List focusModesList = parameters.getSupportedFocusModes();

//增加对聚焦模式的判断 if

(focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

} else if

(focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); }

mCamera.setParameters(parameters); }

int rotation =

getWindowManager().getDefaultDisplay().getRotation(); int orientation = orientations.get(rotation); mCamera.setDisplayOrientation(orientation); }

@Override

protected void onResume() { super.onResume(); initCamera(); }

@Override

public void onPause() { releaseCamera(); super.onPause(); }

/**

* 开始录制 */

private void startRecord() {

if (mRecorder == null) {

mRecorder = new MediaRecorder(); // 创建MediaRecorder }

if (mCamera != null) { mCamera.stopPreview(); mCamera.unlock();

mRecorder.setCamera(mCamera); } try {

// 设置音频采集方式

mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); //设置视频的采集方式

mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //设置文件的输出格式

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm //设置audio的编码格式

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置video的编码格式

mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //设置录制的视频编码比特率

mRecorder.setVideoEncodingBitRate(1024 * 1024); //设置录制的视频帧率,注意文档的说明: mRecorder.setVideoFrameRate(30); //设置要捕获的视频的宽度和高度

mSurfaceHolder.setFixedSize(320, 240);//最高只能设置640x480

mRecorder.setVideoSize(320, 240);//最高只能设置640x480 //设置记录会话的最大持续时间(毫秒) mRecorder.setMaxDuration(60 * 1000);

mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); String path = getExternalCacheDir().getPath(); if (path != null) {

File dir = new File(path + \ if (!dir.exists()) { dir.mkdir(); }

path = dir + \\

//设置输出文件的路径

mRecorder.setOutputFile(path); //准备录制

mRecorder.prepare(); //开始录制

mRecorder.start(); isRecording = true;

btnStartStop.setText(\停止\ }

} catch (Exception e) { e.printStackTrace(); } } /**

* 停止录制 */

private void stopRecord() { try {

//停止录制

mRecorder.stop(); //重置

mRecorder.reset();

btnStartStop.setText(\开始\ } catch (Exception e) { e.printStackTrace(); }

isRecording = false; }

/**

* 释放MediaRecorder */

private void releaseMediaRecorder() { if (mRecorder != null) { mRecorder.release(); mRecorder = null; } }

/**

* 释放相机资源 */

private void releaseCamera() { try {

if (mCamera != null) {

mCamera.stopPreview();

mCamera.setPreviewCallback(null); mCamera.unlock(); mCamera.release(); }

} catch (RuntimeException e) { } finally {

mCamera = null; } }

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

// 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder

mSurfaceHolder = holder; if (mCamera == null) { return; } try {

//设置显示

mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); releaseCamera(); finish(); } }

@Override

public void surfaceCreated(SurfaceHolder holder) {

// 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder

mSurfaceHolder = holder; }

@Override

public void surfaceDestroyed(SurfaceHolder holder) { // surfaceDestroyed的时候同时对象设置为null if (isRecording && mCamera != null) { mCamera.lock(); }

mSurfaceView = null; mSurfaceHolder = null; releaseMediaRecorder(); releaseCamera(); }

private class CameraSizeComparator implements Comparator {

public int compare(Camera.Size lhs, Camera.Size rhs) { if (lhs.width == rhs.width) { return 0;

} else if (lhs.width > rhs.width) { return 1; } else {

return -1; } } } }

3.)布局文件

xmlns:android=\ xmlns:tools=\ android:layout_width=\ android:layout_height=\ android:orientation=\

android:id=\

android:layout_width=\ android:layout_height=\ android:layout_weight=\ />