Android实现视频录制
安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder。
每种方法都有自己的优缺点。接下来,把两种方法的代码写出来。
先说第一种方法,也是最简单的方法,那就是直接调用系统的视频功能。
代码很简单:
- //这是跳转至录制视频界面的按钮监听
- class VideoListener implements OnClickListener {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
- //在这里的QUALITY参数,值为两个,一个是0,一个是1,代表录制视频的清晰程度,0最不清楚,1最清楚
- //没有0-1的中间值,另外,使用1也是比较占内存的,测试了一下,录制1分钟,大概内存是43M多
- //使用0,录制1分钟大概内存是几兆
- intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
- // 限制时长 ,参数61代表61秒,可以根据需求自己调,最高应该是2个小时。
- //当在这里设置时长之后,录制到达时间,系统会自动保存视频,停止录制
- intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 61);
- // 限制大小 限制视频的大小,这里是100兆。当大小到达的时候,系统会自动停止录制
- intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024 * 1024 * 100);
- //在这里有录制完成之后的操作,系统会默认把视频放到照片的文件夹中
- startActivityForResult(intent, 11);
- }
接下来是第二方法 ,也是比第一次麻烦的方法 ,使用MediaRecorder:
- //跳转至录制视频页面的按钮事件
- class VideoListener implements OnClickListener {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(context,MovieRecorder.class);
- startActivity(intent);
- }
- }
MovieRecorder.class 中的代码:
- package com.titan.ti_yuqiao.video;
- import java.io.File;
- import android.app.Activity;
- import android.content.pm.ActivityInfo;
- import android.graphics.PixelFormat;
- import android.media.MediaRecorder;
- import android.os.Bundle;
- import android.os.Environment;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.ImageButton;
- import android.widget.Toast;
- import com.titan.ti_yuqiao.R;
- public class MovieRecorder extends Activity implements OnClickListener {
- // 程序中的两个按钮,录制和停止
- ImageButton record, stop;
- // 系统的视频文件
- File videoFile;
- MediaRecorder mRecorder;
- // 显示视频预览的SurfaceView
- SurfaceView sView;
- // 记录是否正在进行录制
- private boolean isRecording = false;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 去掉标题栏 ,必须放在setContentView之前
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.video);
- // 设置横屏显示
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- // 设置全屏
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- // 选择支持半透明模式,在有surfaceview的activity中使用。
- getWindow().setFormat(PixelFormat.TRANSLUCENT);
- // 获取程序界面中的两个按钮
- record = (ImageButton) findViewById(R.id.record);
- stop = (ImageButton) findViewById(R.id.stop);
- // 让stop按钮不可用。
- stop.setEnabled(false);
- // 为两个按钮的单击事件绑定监听器
- record.setOnClickListener(this);
- stop.setOnClickListener(this);
- // 获取程序界面中的SurfaceView
- sView = (SurfaceView) this.findViewById(R.id.sView);
- // 设置分辨率
- sView.getHolder().setFixedSize(1280, 720);
- // 设置该组件让屏幕不会自动关闭
- sView.getHolder().setKeepScreenOn(true);
- }
- @Override
- public void onClick(View source) {
- switch (source.getId()) {
- // 单击录制按钮
- case R.id.record:
- if (!Environment.getExternalStorageState().equals(
- android.os.Environment.MEDIA_MOUNTED)) {
- Toast.makeText(MovieRecorder.this, "SD卡不存在,请插入SD卡!",
- Toast.LENGTH_SHORT).show();
- return;
- }
- try {
- // 创建保存录制视频的视频文件,视频结果会保存在sd卡的根目录20141205123345.3gp
- videoFile = new File(Environment.getExternalStorageDirectory()
- .getCanonicalFile() + "/20141205123345.3gp");
- // 创建MediaPlayer对象
- mRecorder = new MediaRecorder();
- mRecorder.reset();
- // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER)
- mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
- // 设置从摄像头采集图像
- mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
- // 设置视频文件的输出格式
- // 必须在设置声音编码格式、图像编码格式之前设置
- mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- // 设置声音编码的格式
- mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
- // 设置图像编码的格式
- mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
- //我一开始将这里的分辨率调成了640,480调完之后,发现录出的视频会花屏,改成1280,720则没事
- mRecorder.setVideoSize(1280, 720);
- // 每秒 4帧
- mRecorder.setVideoFrameRate(20);
- //数值越大,越清晰,占用内存越大,一开始我使用的是5*1024*1024,画面的质量和第一种方法质量为0的时候差不多,
- //后来改成7*1024*1024,清晰度立马提升,后来写成了8*1024*1024
- mRecorder.setVideoEncodingBitRate(8*1024*1024);
- mRecorder.setOutputFile(videoFile.getAbsolutePath());
- // 指定使用SurfaceView来预览视频
- mRecorder.setPreviewDisplay(sView.getHolder().getSurface()); // ①
- mRecorder.prepare();
- // 开始录制
- mRecorder.start();
- // 让record按钮不可用。
- record.setEnabled(false);
- // 让stop按钮可用。
- stop.setEnabled(true);
- isRecording = true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- break;
- // 单击停止按钮
- case R.id.stop:
- // 如果正在进行录制
- if (isRecording) {
- // 停止录制
- mRecorder.stop();
- // 释放资源
- mRecorder.release();
- mRecorder = null;
- // 让record按钮可用。
- record.setEnabled(true);
- // 让stop按钮不可用。
- stop.setEnabled(false);
- }
- break;
- }
- }
- }
以下是该MovieRecorder.class对应的xml配置
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <!-- 显示视频预览的SurfaceView -->
- <SurfaceView
- android:id="@+id/sView"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_alignParentBottom="true"
- android:layout_centerHorizontal="true">
- <ImageButton
- android:id="@+id/record"
- android:layout_width="66dp"
- android:layout_height="66dp"
- android:scaleType="fitCenter"
- android:src="@drawable/red_no_problem" />
- <ImageButton
- android:id="@+id/stop"
- android:layout_width="66dp"
- android:layout_height="66dp"
- android:scaleType="fitCenter"
- android:src="@drawable/red_success" />
- </LinearLayout>
- </RelativeLayout>
对该程序添加权限:
- <!-- 授予该程序录制声音的权限 -->
- <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"/>
通过对这两种方法的测试,:也发现两种方法的优缺点,以下为对比
一:使用第一种方法,方便快捷,不需要太多的代码量;使用第二种方法,代码量稍大;
二:第一种方法视频清晰度只有两种,一个是最不清楚,一个是最清楚;第二种方法视频清晰度可根据数值自动往上调 ;
三:第一种方法,清晰度为1的时候,会占用大内存;第二种方法 :清晰度越高的时候,内存也会增大;
经测试:第一种方法清晰度为1,录制一分钟,大小在43M左右;第二种方法当为8*1024*1024时,录制一分钟,大小在57M;
四:第一种方法在录制过程中,操作方便,有自己的暂停、录制、播放按钮 ;第二种只能自己去写暂停、录制或播放按钮;
综上,如果内存足够大的时候,推荐使用第一种方法,方便快捷。
以上内容分享给大家学习。
Android实现视频录制的更多相关文章
- Android(java)学习笔记144:Android音视频录制类MediaRecorder用法举例
Android语音录制可以通过MediaRecorder和AudioRecorder.MediaRecorder本来是多媒体录制控件,可以同时录制视频和语音,当不指定视频源时就只录制语音(默认录制语言 ...
- 【Android】20.3 拍照和视频录制
分类:C#.Android.VS2015: 创建日期:2016-03-13 一.简介 Android提供的Camera有两个典型的版本,一个是在Android 5.0以前提供的,称为Camera:另一 ...
- android 视频录制 混淆打包 之native层 异常的解决
原文地址:http://www.cnblogs.com/linguanh/ (滑至文章末,直接看解决方法) 问题起因: 前5天,因为项目里面有个类似 仿微信 视频录制的功能, 先是上网找了个 开 ...
- Android音视频之MediaRecorder音视频录制
前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...
- Android多媒体录制--MediaRecorder视频录制
Android使用MediaRecorder类进行视频的录制. 需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1.设置视频源, ...
- Android 仿微信小视频录制
Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章
- Android 中使用MediaRecorder进行录像详解(视频录制)
在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. package com.video; import java.io.IOException; import android.ap ...
- android视频录制、另一部手机实时观看方案
最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...
- Android多媒体-MediaRecorder 录制音视频
不多说,直接上代码,有具体凝视 MyAudioRecord.java import java.io.File; import java.io.IOException; import android.a ...
随机推荐
- glib源码安装使用方法
glib库是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事 ...
- H3C交换配置PBR最佳实践
简要说明 PBR算是比较常用的功能,需要我们去掌握一下 配置步骤简要 配置BFD 配置track 配置acl 配置policy-based-route 在接口上面应用policy-based-rout ...
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good
上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...
- c++程序内存泄露检測工具
功能: 用于检測c++程序的内存泄露. 原理: 事实上非常easy,就是通过函数的重载机制,捕获应用程序的new, new[] , delete , delete[], malloc,calloc,f ...
- Spring 构造注入 传參数
1. 提供相应的构造方法 //构造器注入 public class Bean6 { private String name; private Integer age; // 服务于构造器 ...
- 虎记:强大的nth-child(n)伪类选择器玩法
写在前面的戏: 最近参加了度娘前端IFE的春季班,刷任务,百度真是有营销头脑,让咱们这帮未来的技术狂人为他到处打广告(我可不去哪),其中做的几个任务中有几个以前没有用到的东西, 也算是有些许收获(现在 ...
- jQuery 插件 flexslider 初步使用
发现了个不错的 jQuery 幻灯片插件 flexslider,有 接近 3000 Star,应该说是很靠谱的,下面是简单使用教程. 引入代码 所有代码都可以在 flexlslider 的 Githu ...
- JavaSE学习总结第27天_反射 & 设计模式 & JDK5、7、8新特性
27.01 反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读 ...
- CUG 数学进阶
题目链接:http://acm.cug.edu.cn/JudgeOnline/contest.php?cid=1047 . . . I 题目链接:http://acm.cug.edu.cn/Judge ...
- USACO Section 5.3 Milk Measuring (IDDFS+dp)
迭代加深搜索,从小到大枚举桶数的上限maxd:对每个maxd,枚举每个组合,判断是否能够倒出q:直到得到answer.判断的部分就用dp(完全背包). ------------------------ ...