录像
Android提供了2种方案去录像。
方案一:
最简单的方式就是使用Intents去启动App来帮助你完成。这个方案使你能够指定输出的位置和视频的质量。这方案通常是最好的方法,应该可以用在多种情形下。
MediaStore.EXTRA_OUTPUT 指定输出的位置。
MediaStore.EXTRA_VIDEO_QUALITY 0-1之间, 1 质量最高,默认的话是1.
MediaStore.EXTRA_DURATION_LIMIT 指定最大的录像长度。(秒单位)
01 |
private static final int RECORD_VIDEO = 0; |
03 |
private void startRecording() { |
04 |
// Generate the Intent. |
05 |
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); |
07 |
// Launch the camera app. |
08 |
startActivityForResult(intent, RECORD_VIDEO); |
12 |
protected void onActivityResult(int requestCode, |
13 |
int resultCode, Intent data) { |
14 |
if (requestCode == RECORD_VIDEO) { |
15 |
VideoView videoView = (VideoView)findViewById(R.id.videoView); |
16 |
videoView.setVideoURI(data.getData()); |
方案二:
使用MediaRecorder类去录音频或者视频。
你可能需要以下权限:
1 |
<uses-permission android:name=”android.permission.RECORD_AUDIO”/> |
2 |
<uses-permission android:name=”android.permission.RECORD_VIDEO”/> |
3 |
<uses-permission android:name=”android.permission.CAMERA”/> |
MediaRecorder可以让你指定音频和视频资源,输出文件格式,还指定视频、音频编码器。
Android 2.2引入配置文件,可以预先定义这些属性配置。
很像MediaPlayer,MediaRecorder管理录制,作为其状态机。这就意味着配置的顺序和管理变得尤为重要。最简单的:
1.创建一个MediaRecorder
2.解锁照相机,然后使其与MediaRecorder关联。
3.指定输入源
4.选择一个配置文件,或者定义输出格式和指定音频和视频编码器,帧率,输出大小。
5.选择输出文件
6.分配一个预览Surface.
7.准备MediaRecorder录制。
8.录制
9.结束录制。
当你结束录制的时候,记得mediaRecorder.release();
配置VideoRecorder
setAudioSource和setVideoSource方法,可以分别让你指定一个MediaRecorder.AudioSource.*和MediaRecorder.VideoSource.*静态常量,来定音频或者视频资源。
当你选择你的输入源后,你需要去指定要使用的录制配置文件。Android 2.2引入setProfile方法,使用CamcorderProfile类的get方法创建profile,使用CamcorderProfile.Quality_*常量指定录制质量。不是每个设备都支持所有的配置文件,你可以用CamcorderProfile.hasProfile方法去确认可用性:
1 |
if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) { |
2 |
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P); |
3 |
mediaRecorder.setProfile(profile); |
作为选择,你可以手动指定录制文件,通过选择输出格式,使用setOutputFormat方法去指定一个MediaRecorder.OutputFormat常量和使用set[audio/video]Encoder方法去指定一个音频或者视频编码,通过MediaPlayer.[Audio/Video]Encoder类。
例子:
01 |
// Unlock the Camera to allow the Media Recorder to own it. |
04 |
// Assign the Camera to the Media Recorder. |
05 |
mediaRecorder.setCamera(camera); |
07 |
// Configure the input sources. |
08 |
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); |
09 |
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); |
11 |
// Set the recording profile. |
12 |
CamcorderProfile profile = null; |
14 |
if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) |
15 |
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_1080P); |
16 |
else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)) |
17 |
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P); |
18 |
else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_480P)) |
19 |
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P); |
20 |
else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH)) |
21 |
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); |
24 |
mediaRecorder.setProfile(profile); |
26 |
// Specify the output file |
27 |
mediaRecorder.setOutputFile(“/sdcard/myvideorecording.mp4”); |
30 |
mediaRecorder.prepare(); |
注意:setOutputFile方法必须在prepare之前和setOutputFormat之后。否则,会抛出异常。
Android 4.0引入一个新的技术去改善MediaRecoder的表现,通过减少其启动时间。当你的Activity准备只是去录音频或者视频,你可以使用Camera.Parameters.setRecordingHint方法去告诉照相机你只是想去录音或者录像:
1 |
Camera.Parameters parameters = camera.getParameters(); |
2 |
parameters.setRecordingHint(true); |
3 |
camera.setParameters(parameters); |
控制录制
启动
当你录完后:
3 |
// Reset and release the media recorder. |
5 |
mediaRecorder.release(); |
Android 4.0.3引入可以使图像稳定化,通过修改参数:
1 |
Camera.Parameters parameters = camera.getParameters(); |
2 |
if (parameters.isVideoStabilizationSupported()) |
3 |
parameters.setVideoStabilization(true); |
4 |
camera.setParameters(parameters); |
注意:不是所有的照相机设备都支持图像稳定化,所以程序中你可能要先检查下(上例)。
创建一个延时的视频
1 |
// Capture an image every 30 seconds. |
2 |
mediaRecorder.setCaptureRate(0.03); |
MediaRecorder也必须设置一系列预定义的配置优化。使用setProfile方法,使用QUALITY_TIME_LAPSE_*中的一个配置:
1 |
CamcorderProfile profile = |
2 |
CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH); |
4 |
mediaRecorder.setProfile(profile); |
- android之多媒体篇(一)
Android 4.0.3(Api Level 15)支持的多媒体格式. 注意:有些设备可能支持其他的文件格式. 1.Audio AAC LC/LTP.HE-AACv1(AAC+).AMR-NB.AM ...
- Android核心服务解析篇(三)——Android系统的启动
从大的方面来说.Android系统的启动能够分为两个部分:第一部分是Linux核心的启动,第二部分是Android系统的启动. 第一部分主要包含系统引导,核心和驱动程序等,因为它们不属于本篇要讲的内容 ...
- android之多媒体篇(二)
管理音频焦点 情景:当你的app隐退到后台,而其他也有播放能力的app浮现在前台,这个时候,你可能要暂停你原有app的播放功能,和解除监听Media Button,把控制权交给前台的APP. 这就需要 ...
- Android之实战篇(三)
先给出我们用到的工具类 1.发送请求的工具类 本实例采用HttpClient与服务器通信,用到了一个工具类对Httpclient进行封装:定义了两个方法来发送请求 getRequest:发送GET请求 ...
- 【转】android 电容屏(三):驱动调试之驱动程序分析篇
关键词:android 电容屏 tp 工作队列 中断 坐点计算 电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310( ...
- Android UI开发第三十九篇——Tab界面实现汇总及比较
Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...
- Android UI开发第三十篇——使用Fragment构建灵活的桌面
http://www.lupaworld.com/article-222973-1.html 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android ...
- Android APP压力测试(三)之Monkey日志自动分析脚本
Android APP压力测试(三) 之Monkey日志自动分析脚本 前言 上次说要分享Monkey日志的分析脚本,这次贴出来分享一下,废话不多说,请看正文. [目录] 1.Monkey日志分析脚本 ...
- Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具
Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...
随机推荐
- 【Android】以SimpleAdapter做适配器的ListView和GridView
SimpleAdapter介绍 SimpleAdapter是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图. 构造函数 public SimpleAdapter (Context co ...
- PHP 正则表达式总结
可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符.例如,正则表达式:.at可以与"cat"."sat"."#at"和" ...
- LeetCode题解——Longest Common Prefix
题目: 给定一系列的字符串,找出这些字符串的最长公共前缀. 解法: 暴力法,依次比较每个字符串的每个字符,碰到第一个不同的就返回之前找到的前缀. 代码: class Solution { public ...
- mapreduce的调度算法和job调优
调度算法: mapreduce当有很多的作业在执行的时候,是按照什么顺序去执行的? 调度算法顺序需要关注: 1.提高作业的吞吐量. 2.要考虑优先级. 三种调度器:如果作业跑不完,并且机器资源利用率比 ...
- android sdk manager 闪退 打不开问题
android sdk manager 闪退 打不开问题 环境 win8系统 如果访问不了 dl-ssl.google.com 网址,在C:\Windows\System32\Drivers\etc ...
- 1分钟内检查Linux服务器性能的10条命令
如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?Netflix性能工程团队的Brendan Gregg写下了这篇博文,来看他们是怎样通过十条命 ...
- Linux内存中的Cache真的能被回收么?
在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: [root@tencent64 ~]# free ...
- Android实例-全屏显示程序(XE10+小米2)(无图)
方法一:选中窗体->BorderStyle改为“None” 方法二: 1.下载第三方控件QAndroid.Shell 2.执行FShell.Execute('su -c mount -o rem ...
- hadoop conf中xml文件修改
core-site.xml <?xml version="1.0"?><?xml-stylesheet type="text/xsl" hre ...
- Mybatis中实体类中的字段跟对应表的字段不一致时解决办法
解决字段名与实体类属性名不相同的冲突 实体类字段: public class Order { private int id; private String orderNo; private float ...