前言

在前几篇博客中我分别介绍了一下SurfaceView以及Camera的水印预览和拍照,专题地址请看:传送门,下面我就来介绍下如何使用Camera进行录像功能。

流程

1、首先初始化一个Camera并且开启预览,方法可以查看前几篇博客。

2、使用Camera的unlock()方法解锁Camera,因为系统在同一时刻只允许一个进程访问摄像头,所以需要调用这个方法让其"解锁"。

3、通过MediaRecorder的 setCamera(Camera)将Camera数据设置给MediaRecorder,然后给MediaRecorder设置好属性即可开始录制。

4、当完成录制以后需要通过Camera的reconnect()方法去重新"锁住"相机。

5、如果不需要使用像极了,那么回收相机资源

实现

视频录像主要使用的是MediaRecorder。根据官方文档,基本用法为如下:

MediaRecorder recorder = new MediaRecorder();

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

recorder.setOutputFile(PATH_NAME);

recorder.prepare();

recorder.start(); // Recording is now started

...

recorder.stop();

recorder.reset(); // You can reuse the object by going back to setAudioSource() step

recorder.release(); // Now the object cannot be reused

如上仅仅实现了录音功能,如果我们想加入录像功能也仅仅只需要一并设置视频来源而已,代码如下。

public void startRecorder() {

File outputPath = new File(Environment.getExternalStorageDirectory(), "recoder.mp4");

if (mMediaRecorder == null) {

// Initial 状态

mMediaRecorder = new MediaRecorder();

}

if (mCamera != null) {

mCamera.unlock();

}

mMediaRecorder.setCamera(mCamera);

// 前置摄像头需要旋转90度,原因见前几篇博客

mMediaRecorder.setOrientationHint(90);

// 进入Initialized状态

// 设置音频来源为麦克风

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

// 设置视频来源为摄像头

mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

// 进入DataSourceConfigured状态

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

// 设置文件保存路径

mMediaRecorder.setOutputFile(outputPath.getAbsolutePath());

mMediaRecorder.setVideoSize(1280, 720);

// 设置帧数率 30fps

mMediaRecorder.setVideoFrameRate(30);

// 设置bit率

mMediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);

try {

// 进入prepare状态

mMediaRecorder.prepare();

// 进入Recording状态

mMediaRecorder.start();

Toast.makeText(getContext(), "开始录像", Toast.LENGTH_SHORT).show();

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

上面的代码注释已经写得很清楚了。首先使用mCamera.unlock();解锁,然后设置好属性就可以录制啦,请注意上面的方法调用顺序!!!请注意上面的方法调用顺序!!!请注意上面的方法调用顺序!!!在不同的状态下不能调用其他状态的方法,不然会抛出非法状态异常。关于各个状态的转变以及每个状态可以调用的方法,贴出一张官文文档里面的图片。

停止录像需要进行资源回收工作。类似于Camera的回收。

public void stopRecorder() {

if (mMediaRecorder != null) {

mMediaRecorder.stop();

mMediaRecorder.release();

mMediaRecorder = null;

Toast.makeText(getContext(), "停止录像", Toast.LENGTH_SHORT).show();

if (mCamera != null) {

try {

mCamera.reconnect();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

一些暗坑

1、注意方法调用顺序!!!注意方法调用顺序!!!注意方法调用顺序!!!

2、注意资源回收的时机,当SurfaceView被销毁的时候以及Activity进入onPause()的时候,需要停止录像与相机预览并回收资源。

3、如果录制的视频方向不对,请查看前几篇博客的说明,后置90°,前置270°!!!

android加入摄像功能,Android Camera使用之录像功能相关推荐

  1. Android添加拍照功能,Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...

  2. android 静默拍照功能,Android实现静默拍照功能

    本文实例为大家分享了Android实现静默拍照功能的具体代码,供大家参考,具体内容如下 1.申请权限(6.0以后要动态申请) 2.创建相机工具类 CameraPreview: public class ...

  3. android裁剪图片功能,Android实现图片区域裁剪功能

    今天做的就是关于实现图片的区域裁剪功能.由于项目功能的需要笔者需要实现PDF文档的阅读,并且就某个页面实现"图片"裁剪(一个页面理解为一张图片).笔者对着方面是一点儿也不熟悉,因此 ...

  4. android 微信相册功能,Android仿微信选择图片和拍照功能

    本文实例为大家分享了 Android微信选择图片的具体代码,和微信拍照功能,供大家参考,具体内容如下 1.Android6.0系统,对于权限的使用都是需要申请,选择图片和拍照需要申请Manifest. ...

  5. android实现相机功能,Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...

  6. android的UDC功能,Android实现搜索历史功能

    本文实例为大家分享了Android实现搜索历史的具体代码,供大家参考,具体内容如下 SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空 1. 判断搜索内容是否含表情,不 ...

  7. android 添加附件功能,Android实现带附件的邮件发送功能

    本文实例讲解了基于基于jmail实现android邮件发送功能,分享给大家供大家参考,具体内容如下 在android上发送邮件方式: 第一种:借助gmail app客户端,缺点是必须使用gmail帐号 ...

  8. android sharesdk分享功能,Android ShareSDK快速实现分享功能

    第一步 :获取ShareSDK 为了集成ShareSDK,您首先需要到ShareSDK官方网站注册并且创建应用,获得ShareSDK的Appkey,然后到SDK的下载页面下载SDK的压缩包,解压以后可 ...

  9. android系统应用功能,Android系统应用(12)

    如何成为系统应用 方法一:在Manifest中声明android:sharedUserId的值为:android.uid.system,android.uid.phone,android.uid.lo ...

最新文章

  1. 爱奇艺手机客服端储存的视频,如何在手机文件夹里面找到啊?
  2. 我靠这份无人机完全指南吹了一整年牛!
  3. LFD-A-Light-and-Fast-Detector
  4. jquery - 动态绑定事件
  5. 重新想象 Windows 8.1 Store Apps (85) - 警报通知(闹钟), Tile 的新特性
  6. MATLAB语言初步学习(二)
  7. 阶段3 1.Mybatis_09.Mybatis的多表操作_5 完成user的一对多查询操作
  8. 使用Q-Vision软件Kvaser硬件产品,支持ADAS测试,实现对总线网络的分析
  9. 电脑打印机print spooler服务总是自动停止的解决方法...
  10. 富文本编辑器在Java中使用
  11. 中国各地区工业COD排放量面板数据(1998-2017年)
  12. c花体复制_求类似ℒℴѵℯ 这样的花体英文字母符号,可以直接复制的
  13. oracle 月份中日的值必须介于 1 和当月最后一日之间,ora-01847:月份中日的值必须介于 1 和当月最后一日之间...
  14. uniapp 开发视频解析app
  15. c语言win32课程表,用C语言怎么编出来课程表
  16. GPS/BD陶瓷天线
  17. idea中maven完美配置解析
  18. 前端简单动画组件animation
  19. java正则表达式保姆级教程,从小白到高手
  20. 解决matlab中文乱码

热门文章

  1. 线程池原理——生产者/消费者
  2. 52.最后一块石头的重量II
  3. kali linux 小米卸载软件,Kali Linux on Android # 实测:小米2s离线安装Kali Linux
  4. 纳米颗粒多肽偶连物|二氧化锰纳米粒MnO2修饰多肽cTAT/GE11/CPP/R8/CTT2/CCK8/RVG29/SP94(cTAT-MnO2)
  5. python+gurobi 带时间窗带容量限制的路径规划 cvrptw
  6. Winform DataGridView数据绑定,数据读取
  7. 可达编程 一元三次方程求解
  8. ESP32S3 VSCODE openocd JTAG调试设置
  9. python批量读取dbf_python下用dbfread操作DBF文件
  10. 虚拟ldap服务器,什么是LDAP,LDAP服务器是什么?