【copy from Android MediaRecorder录制视频】
视频录制也可以通过 MediaRecorder 类完成,其步骤与音频录制基本相同,只是添加了一些对视频进行处理的操作。

视频录制的基本步骤如下:

  1. 调用Camera.open()方法打开摄像头。

  2. 调用 Camera.setPreviewDisplay() 连接预览窗口
    以便将从摄像头获取的图像放置到预览窗口中显示出来。

  3. 调用 Camera.startPreview()启动预览
    显示摄像头拍摄到的图像。

  4. 使用 MediaRecorder 进行视频录制。

1.使用 Camera.unlock() 方法解锁摄像头,以使 MediaRecorder 获得对摄像头的使用权。

2.配置 MediaRecorder。

1)建立 MediaRecorder 类的对象,并设置音频源和视频源:

MediaRecorder recorder=new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

2)设置视频的输出和编码格式。在 Android 2.2(API Level 8)以上版本的 SDK 中,可以直接调用 MediaRecorder.setProfile 方法进行相关配置:

recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));

其中,MediaRecorder.setProfile() 方法为 Android 2.2(API Level 8)之后 MediaRecorder 类新提供的方法,通过 CamcorderProfile 对象可用于对 MediaRecorder 进行相关设置。

CamcorderProfile 为预先定义好的一组视频录制相关配置信息。

Android SDK 共定义了 14 种 CamcorderProfile 配置,如 CamcorderProfile. QUALITY_HIGH、CamcorderProfile. QUALITY_LOW、CamcorderProfile. QUALITY_TIME_LAPSE_1080P 等。其中,QUALITY_LOW 和 QUALITY_HIGH 两种配置是所有的摄像头都支持的,其他配置则根据硬件性能决定。

每一种配置都涉及文件输出格式、视频编码格式、视频比特率、视频帧率、视频的高和宽、音频编码格式、音频的比特率、音频采样率和音频录制的通道数几个方面。通过使用这些预定义配置能够降低代码复杂度,提高编码效率。

3)设置录制的视频文件的保存位置及文件名:

MediaRecorder.setOutputFile(PATH_NAME);

4)使用 MediaRecorder.setPreviewDisplay() 方法指定 MediaRecorder 的视频预览窗口。

需要注意的是,以上配置过程必须按照顺序进行,否则会发生错误。

3.将录像器置于准备状态:

MediaRecorder.prepare();

4.启动录像器

MediaRecorder.start();

5.进行视频录制:

  1. 视频录制完成后,可使用以下方法停止视频录制。

1.停止录像器:

MediaRecorder.stop();

2.重置录像器的相关配置:

MediaRecorder.reset()

3.释放录像器对象:

MediaRecorder.release();

4.调用 Camera.lock() 方法锁定摄像头。从 Android N 开始,该调用也不再必需,除非 MediaRecorder.prepare() 方法失败。

6) 调用Camera.stopPreview()方法停止预览。
7) 调用Camera.release()方法释放摄像头 。

另外,在 Android N 系统下,Camera.unlock() 方法和 Camera.lock() 方法可由 Android 框架来完成。

实例 VideoRecorderDemo 演示了使用 MediaRecorder 进行视频录制的过程,该实例的运行效果如图 1 所示。

实例 VideoRecorderDemo 使用的布局文件 main.xml 的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello" /><SurfaceViewandroid:id="@+id/surfaceView1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="0.58" /><LinearLayoutandroid:id="@+id/linearLayout1"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/opBtn" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/play" /><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/cloBtn" /></LinearLayout>
</LinearLayout>

其对应的资源文件 strings.xml 的内容如下:

<resources><string name="hello">使用MediaRecorder进行视频录制实例</string><string name="app_name">VideoRecorder</string><string name="opBtn">打开摄像头</string><string name="play">录制</string><string name="cloBtn">关闭摄像头</string>
</resources>

由于实例 VideoRecorderDemo 中涉及音频录制、使用摄像头、向 SD 卡写文件等操作,因此需要在该工程的 AndroidManifest.xml 文件中声明相应权限。该文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="introduction.android.mycamerademo"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="14" /><uses-feature android:name="android.hardware.camera.autofocus" /><uses-feature android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

实例 VideoRecorderDemo 的主 Activity 为 VideoRecorderDemoActivity,其代码如下:

package introduction.android.mycamerademo;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.media.MediaRecorder;
import android.os.Bundle;
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;
public class MainActivity extends Activity {private Button opbtn;private Button playbtn;private Button clobtn;private SurfaceView surfaceView;private SurfaceHolder surfaceHolder;private Camera camera;private MediaRecorder videoRecorder;private String myVideofilepath = "sdcard/myvideo.3gp";/*** Called when the activity is first created.*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);opbtn = (Button) this.findViewById(R.id.button1);playbtn = (Button) this.findViewById(R.id.button2);clobtn = (Button) this.findViewById(R.id.button3);videoRecorder = new MediaRecorder();surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView1);surfaceHolder = surfaceView.getHolder();surfaceHolder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubLog.i("camera", "surface destroyed.");surfaceHolder = null;stopRecording();releaseCamera();}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubLog.i("camera", "surface destroyed");surfaceHolder = holder;}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// TODO Auto-generated method stubLog.i("camera", "surface changed.");surfaceHolder = holder;}});opbtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View argO) {// TODO Auto-generated method stubopenCamera();}});playbtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbenginRecording();}});clobtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstopRecording();}});}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();stopRecording();releaseCamera();}protected void stopRecording() {// TODO Auto-generated method stubLog.i("videoRecorder", "stopRecording...");if (videoRecorder != null) {videoRecorder.stop();videoRecorder.reset();videoRecorder.release();videoRecorder = null;camera.lock();}}private void releaseCamera() {if (camera != null) {camera.release();camera = null;}}protected void benginRecording() {Log.i("videoRecorder", "beginRecording");//给摄像头解锁camera.unlock();//MediaRecorder获取到摄像头的访问权videoRecorder.setCamera(camera);//设置视频录制过程中所录制的音频来自手机的麦克风videoRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);//设置视频源为摄像头videoRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置视频录制的输出文件为3gp文件videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频编码方式为AACvideoRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//设置录制的视频编码为H.264videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);videoRecorder.setVideoSize(176, 144);videoRecorder.setVideoFrameRate(20);if (!checkSDCard()) {Log.e("videoRecorder", "未找到SD卡!");return;}videoRecorder.setOutputFile(myVideofilepath);videoRecorder.setPreviewDisplay(surfaceHolder.getSurface());try {videoRecorder.prepare();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}videoRecorder.start();}private void openCamera() {// TODO Auto-generated method stubLog.i("videoRecorder", "openCamera.");try {camera = Camera.open(); // attempt to get a Camera instance} catch (Exception e) {// Camera is not available (in use or does not exist)Log.e("camera", "open camera error!");e.printStackTrace();return;}try {camera.setPreviewDisplay(surfaceHolder);} catch (IOException e) {// TODO Auto-generated catch blockLog.e("camera", "preview failed.");e.printStackTrace();}camera.startPreview();}private boolean checkSDCard() {// 判断SD存储卡是否存在if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {return true;} else {return false;}}
}

该实例中,在对 MediaRecorder 进行设置时,没有使用:

videoRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));

而是使用以下代码对 MediaRecorder 进行设置:

//设置视频录制的输出文件为3gp文件
videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置音频编码方式为AAC
videoRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
//设置录制的视频编码为H.264
videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//设置视频录制的分辨率,必须放在设置编码和格式的后面,否则报错
videoRecorder.setVideoSize(176, 144);
//设置录制的视频的视频帧率,必须放在设置编码和格式的后面,否则报错
videoRecorder.setVideoFrameRate(20);

Android MediaRecorder录制视频相关推荐

  1. Android MediaRecorder录制视频详细步骤

    使用MediaRecorder能够编写从设备麦克风与相机捕获音视频,保存音频并(使用MediaPlayer)进行播放的应用. 1.添加权限: <uses-permission android:n ...

  2. Android MediaRecorder录制视频音量小问题解决 (音视频转码合成)

    之前写得太乱,回头看看感觉自己都有点看不懂,重新写下. 在android上需要做一个录像留言功能,需要生成MP4或者waw格式视频.但是使用MediaRecorder录制出的MP4视频格式音量太小,几 ...

  3. Android MediaRecorder录制视频提示start failed的解决办法

    转自https://blog.csdn.net/w815878564/article/details/49247411 今天测试MediaRecorder录制功能的时候出现一个蛋疼的BUG,按照官方提 ...

  4. Android多媒体四:MediaRecorder录制视频短片

    Android多媒体四:MediaRecorder录制视频短片 MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同. 只 ...

  5. Android音视频之MediaRecorder录制视频

    1 MediaRecorder 录制视频步骤 这篇文章介绍了Android录音MediaRecorder使用和SoundPool的使用 主要讲解了音频的录制和播放,这篇AudioRecord和Audi ...

  6. android 横屏录制视频,MediaRecorder怎么在竖屏的时候录像结果是横屏录的结果

    public class VideoActivity extends Activity implements SurfaceHolder.Callback { private Button start ...

  7. 使用MediaRecorder录制视频短片

    MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同.只是录制视频时不仅需要采集声音,还需要采集图像.为了让MediaRe ...

  8. mediaRecorder录制视频与播放

    1.添加权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-p ...

  9. 前端 mediaRecorder 录制视频源代码实例,和本地播放器无法定位进度条问题分析和解决

    问题 mediaRecorder 本质上录制的是webm 当我们使用getUserMedia.MediaRecorder等API生成的webm视频时,会发现最终的webm是无法拖动进度条的 解决方案 ...

  10. MediaRecorder录制视频时计算文件大小

    MediaRecorder录制视频时通过音频编码率和视频编码率计算文件大小或时间 计算公式:(音频编码率(单位k)+视频编码率(单位k))/8*时间(秒) = 文件大小(kb) 例: mediaRec ...

最新文章

  1. 查看linux虚拟机信息,虚拟机:Linux查看线程信息的步骤
  2. 机器视觉应用软件开发步骤及流程
  3. nvidia:未找到命令
  4. C++ 基本的输入输出
  5. SAP 修改物料价格那些事
  6. Jmeter_前端RSA加密下的登陆模拟_引用js文件实现(转)
  7. 面向区块链的高效物化视图维护和可信查询论文学习
  8. cmd255command.executereader()打印连接错误_打印经常遇到的几个问题,轻松解决
  9. linux otl 连接mysql_Linux下用OTL操作MySql(包括自己封装的类库及示例代码下载)...
  10. 遗留非springboot传统项目接入eureka注册与服务发现
  11. 2020 安装 nacos
  12. Netty高性能之道
  13. `ECS弹性计算服务
  14. Linux红帽认证最全介绍
  15. CodeSmith 7.01破解
  16. 小米路由器4C刷机(以OpenWrt为例)
  17. 四 树莓派系统配置及进入图形桌面
  18. xp显示连接上不了网络连接服务器地址,xp本地连接受限制|windows xp系统本地连接提示受限制或无连接怎么办...
  19. 全球与中国医疗AR VR市场深度研究分析报告
  20. window跳转,重定向

热门文章

  1. Processing笔记04—鼠标键盘识别
  2. 是时候关注邮件安全了
  3. 游戏服务器更新文件,如何配置网吧游戏更新服务器
  4. 山东农业大学计算机考研资料汇总
  5. Unity编辑器(Editor)的问题全解以及使用
  6. 阿里巴巴sentinel限流
  7. 免费DNS服务器地址,谁家速度快
  8. c#进行三角形周长面积计算公式_C#程序设计 输入三角形三边长,并计算的周长和面积...
  9. 反向跟单——羊群效应
  10. python构造自定义数据包_Python发送网络封包,自定义封包结构与内容并发出去