安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用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实现视频录制的更多相关文章

  1. Android(java)学习笔记144:Android音视频录制类MediaRecorder用法举例

    Android语音录制可以通过MediaRecorder和AudioRecorder.MediaRecorder本来是多媒体录制控件,可以同时录制视频和语音,当不指定视频源时就只录制语音(默认录制语言 ...

  2. 【Android】20.3 拍照和视频录制

    分类:C#.Android.VS2015: 创建日期:2016-03-13 一.简介 Android提供的Camera有两个典型的版本,一个是在Android 5.0以前提供的,称为Camera:另一 ...

  3. android 视频录制 混淆打包 之native层 异常的解决

    原文地址:http://www.cnblogs.com/linguanh/    (滑至文章末,直接看解决方法) 问题起因: 前5天,因为项目里面有个类似 仿微信 视频录制的功能, 先是上网找了个 开 ...

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

    前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...

  5. Android多媒体录制--MediaRecorder视频录制

    Android使用MediaRecorder类进行视频的录制. 需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1.设置视频源, ...

  6. Android 仿微信小视频录制

    Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章

  7. Android 中使用MediaRecorder进行录像详解(视频录制)

    在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. package com.video; import java.io.IOException; import android.ap ...

  8. android视频录制、另一部手机实时观看方案

    最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...

  9. Android多媒体-MediaRecorder 录制音视频

    不多说,直接上代码,有具体凝视 MyAudioRecord.java import java.io.File; import java.io.IOException; import android.a ...

随机推荐

  1. 利用Console来调试JS程序、Console用法总结

    http://blog.163.com/zhangmihuo_2007/blog/static/27011075201452522824347/ http://blog.163.com/zhangmi ...

  2. brief introduction JAVA new I/O (NIO)

    Reference document: Getting started with new I/O (NIO) Preface: NIO was introduced with JDK1.4 for h ...

  3. jquery 小插件,完成“输入字段预期值的提示信息”,防html5 placeholder属性

    前言:在很多时候,我们需要文本框中显示默认值,获取焦点时,文字框中就会清空给的值,当失去焦点时,如果没有值,继续显示默认的文字,如果有输入值,就显示输入的值.现在项目中需要用到这个地方的功能比较多,于 ...

  4. Protel99se教程一:建立一个数据库文件

    学习Protel99 SE的第一步,是建立一个DDB文件,也就是说,使用protel99se进行电路图和PCB设计,以及其它的数据,都存放在一个统一的DDB数据库中的 一.打开protel 99se后 ...

  5. centos6.4-x86-64系统更新系统自带Apache Http Server

    系统自带Apache Http Server 版本比较老,有漏洞.现在对Apache Http Server进行升级.总体思路:先删除老的,再安装新的.详细步骤如下: 1 删除老版本 1.1 删除老A ...

  6. cpan安装及其使用

    cpan安装及其使用 Perl是一种相当灵活的程序编程语言,现有的许有程序都是使用它进行编程的.它的优点之一就是无需自己编写编码,你就能利用许多增加的模块,创建新的功能. 程序利用这些模块的编码,而程 ...

  7. BZOJ 4300 绝世好题(位运算)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4300 [题目大意] 给出一个序列a,求一个子序列b,使得&和不为0 [题解] ...

  8. openstack nova修改实例路径,虚拟磁盘路径

    #实例路径 --instances_path=$state_path/instances #日志的目录 --logdir=/var/log/nova #nova的目录 --state_path=/va ...

  9. 有道翻译API

    轻奢侈品_百度百科 轻奢侈品 有道翻译API 有道翻译API申请成功 API key:72763558 keyfrom:lexus-studio

  10. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...