android加入摄像功能,Android Camera使用之录像功能
前言
在前几篇博客中我分别介绍了一下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使用之录像功能相关推荐
- Android添加拍照功能,Android开发实现拍照功能的方法实例解析
本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...
- android 静默拍照功能,Android实现静默拍照功能
本文实例为大家分享了Android实现静默拍照功能的具体代码,供大家参考,具体内容如下 1.申请权限(6.0以后要动态申请) 2.创建相机工具类 CameraPreview: public class ...
- android裁剪图片功能,Android实现图片区域裁剪功能
今天做的就是关于实现图片的区域裁剪功能.由于项目功能的需要笔者需要实现PDF文档的阅读,并且就某个页面实现"图片"裁剪(一个页面理解为一张图片).笔者对着方面是一点儿也不熟悉,因此 ...
- android 微信相册功能,Android仿微信选择图片和拍照功能
本文实例为大家分享了 Android微信选择图片的具体代码,和微信拍照功能,供大家参考,具体内容如下 1.Android6.0系统,对于权限的使用都是需要申请,选择图片和拍照需要申请Manifest. ...
- android实现相机功能,Android开发实现拍照功能的方法实例解析
本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Ca ...
- android的UDC功能,Android实现搜索历史功能
本文实例为大家分享了Android实现搜索历史的具体代码,供大家参考,具体内容如下 SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空 1. 判断搜索内容是否含表情,不 ...
- android 添加附件功能,Android实现带附件的邮件发送功能
本文实例讲解了基于基于jmail实现android邮件发送功能,分享给大家供大家参考,具体内容如下 在android上发送邮件方式: 第一种:借助gmail app客户端,缺点是必须使用gmail帐号 ...
- android sharesdk分享功能,Android ShareSDK快速实现分享功能
第一步 :获取ShareSDK 为了集成ShareSDK,您首先需要到ShareSDK官方网站注册并且创建应用,获得ShareSDK的Appkey,然后到SDK的下载页面下载SDK的压缩包,解压以后可 ...
- android系统应用功能,Android系统应用(12)
如何成为系统应用 方法一:在Manifest中声明android:sharedUserId的值为:android.uid.system,android.uid.phone,android.uid.lo ...
最新文章
- 爱奇艺手机客服端储存的视频,如何在手机文件夹里面找到啊?
- 我靠这份无人机完全指南吹了一整年牛!
- LFD-A-Light-and-Fast-Detector
- jquery - 动态绑定事件
- 重新想象 Windows 8.1 Store Apps (85) - 警报通知(闹钟), Tile 的新特性
- MATLAB语言初步学习(二)
- 阶段3 1.Mybatis_09.Mybatis的多表操作_5 完成user的一对多查询操作
- 使用Q-Vision软件Kvaser硬件产品,支持ADAS测试,实现对总线网络的分析
- 电脑打印机print spooler服务总是自动停止的解决方法...
- 富文本编辑器在Java中使用
- 中国各地区工业COD排放量面板数据(1998-2017年)
- c花体复制_求类似ℒℴѵℯ 这样的花体英文字母符号,可以直接复制的
- oracle 月份中日的值必须介于 1 和当月最后一日之间,ora-01847:月份中日的值必须介于 1 和当月最后一日之间...
- uniapp 开发视频解析app
- c语言win32课程表,用C语言怎么编出来课程表
- GPS/BD陶瓷天线
- idea中maven完美配置解析
- 前端简单动画组件animation
- java正则表达式保姆级教程,从小白到高手
- 解决matlab中文乱码
热门文章
- 线程池原理——生产者/消费者
- 52.最后一块石头的重量II
- kali linux 小米卸载软件,Kali Linux on Android # 实测:小米2s离线安装Kali Linux
- 纳米颗粒多肽偶连物|二氧化锰纳米粒MnO2修饰多肽cTAT/GE11/CPP/R8/CTT2/CCK8/RVG29/SP94(cTAT-MnO2)
- python+gurobi 带时间窗带容量限制的路径规划 cvrptw
- Winform DataGridView数据绑定,数据读取
- 可达编程 一元三次方程求解
- ESP32S3 VSCODE openocd JTAG调试设置
- python批量读取dbf_python下用dbfread操作DBF文件
- 虚拟ldap服务器,什么是LDAP,LDAP服务器是什么?