您的位置:首页 > 移动开发 > Android开发

Android MediaRecorder视频录制

2016-07-03 23:59 489 查看
Android视频录制有两种方法,一种是使用内置的摄像头应用程序,利用Intent启动摄像头,这种比较方便,,但是功能和布局都已经固定了,适合只需简单调用摄像头功能的app。另一种就是利用mediarecorder来自定义app。前面一种比较简单,这里写了一个利用mediarecorder录制视频的demo

先上效果图



MainActivity.java

package com.example.administrator.mediarecordertest;

import android.content.pm.ActivityInfo;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;

public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private SurfaceView sView;
private Button btn_start, btn_stop;
private MyMediaRecorder mRecorder;
private File mVideoFile, mFileFolder;
private String path;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sView = (SurfaceView) findViewById(R.id.sv);
// 设置横屏显示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

btn_start = (Button) findViewById(R.id.btn_start);
btn_stop = (Button) findViewById(R.id.btn_stop);

btn_stop.setEnabled(false);//设置stop不可按

btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
// 设置预览分辨率
sView.getHolder().setFixedSize(640, 480);
// 设置该组件不会让屏幕自动关闭
sView.getHolder().setKeepScreenOn(true);
//创建MyMediaRecord对象
mRecorder = new MyMediaRecorder(640, 480);

path = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()
+ File.separator
+ "Video";// 设定存放视频的文件夹的路径

mFileFolder = new File(path); // 声明存放视频的文件夹的File对象
if (!mFileFolder.exists()) {  // 如果不存在此文件夹,则创建
mFileFolder.mkdirs();
}

String nowTime = java.text.MessageFormat.format(
"{0,date,yyyyMMdd_HHmmss}",
new Object[]{new java.sql.Date(System.currentTimeMillis())});//得到系统时间,精确到秒,作为录制文件的名字
mVideoFile = new File(mFileFolder.getAbsoluteFile()
+ File.separator + "video" + nowTime + ".3gp");// 声明视频文件对象

mVideoFile.createNewFile();// 创建此视频文件
// 指定SurfaceView来预览视频
mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
//设置存储文件路径
mRecorder.setOutputFile(mVideoFile.getAbsolutePath());
//以上设置参数有先后顺序,不可随意改变,具体参见MediaRecord类API

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

btn_stop.setEnabled(true);//设置stop可按
btn_start.setEnabled(false);//设置start不可按
} catch (Exception e) {
Log.d(TAG, "start failed");
}
}
});

btn_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 停止录制
mRecorder.stop();
// 释放资源
mRecorder.release();
mRecorder = null;
btn_start.setEnabled(true);
btn_stop.setEnabled(false);
Toast.makeText(MainActivity.this, "文件存储成功,存放在Video文件夹下",
Toast.LENGTH_SHORT).show();
}
});

}

public class MyMediaRecorder extends MediaRecorder {
public MyMediaRecorder(int n, int m) {
super.setAudioSource(MediaRecorder.AudioSource.MIC);
super.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置视频、音频的输出格式
super.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置音频的编码格式
super.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 设置图像编码格式
super.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
//设置图像角度
super.setOrientationHint(0);
//设置录制文件分辨率
super.setVideoSize(640, 480);//不同机型所支持的分辨率不同,设置的参数和机型支持的不匹配会导致无法录像
//设置帧率
super.setVideoFrameRate(30);
//设置编码率
super.setVideoEncodingBitRate(5 * n * m);//上面视频文件的分辨率不能改的情况下,增大这个参数可以使视频清晰,但相应的视频文件会变大
}
}
}


这里我写了一个内部类MyMediaRecorder继承自MediaRocroder,将各种参数都写好了,可以直接调用。这里需要说一下图像角度的问题,设置为横屏,预览和录制视频都是正常的。但是如果是竖屏,预览和录制视频都是90度旋转,可以将super.setOrientationHint(0)改为super.setOrientationHint(90),这样录制的视频就是正常的了,但是预览时还是有90度旋转,所以直接设置为横屏模式。

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:orientation="vertical"
tools:context="com.example.administrator.mediarecordertest.MainActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:id="@+id/btn_start"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="start" />

<Button
android:id="@+id/btn_stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="stop" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/sv" />

</LinearLayout>
</LinearLayout>


AndroidManifest.xml里面添加权限

<!-- 授予该程序录制声音的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 授予该程序使用摄像头的权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 授予使用外部存储的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


最后还要说一下,在模拟器上录制视频可能会有问题,最好用真机测试。

下面是android studio项目

http://download.csdn.net/detail/amazinguu/9566502
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 视频