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;

四:第一种方法在录制过程中,操作方便,有自己的暂停、录制、播放按钮 ;第二种只能自己去写暂停、录制或播放按钮;

综上,如果内存足够大的时候,推荐使用第一种方法,方便快捷。

以上内容分享给大家学习。

时间: 2024-10-05 14:56:07

Android实现视频录制的相关文章

Android &amp; IOS视频录制技术方案

屡次想经营一个技术博客,总因为各种理由推脱.这次下定决心开写,不为自我营销,不为扩大社交,只为了督促自己学习.近几个月定时更新两条线,一个是短视频处理技术,一个是<算法导论>笔记,也借机温故知新.精力有限而且学习也不能贪多,所以每周仅各一篇. 警告诸多网站:原创博客,未经本人允许不得转载. 移动端视频录制的技术方案,我所能想到并且尝试过的,有如下几种: 方案一: 用系统开发sdk录制的接口. 弊端: 1):不能更改视频比例,一般都有该手机屏幕分辨率所对应得视频录制分辨率,另外手机系统提供得分辨

Android 实现视频录制播放

实现类似微信的小视频功能,可以录制一个视频然后播放该视频. 视频录制,使用一个自定义控件. <span style="font-size:14px;">/** * 视频录制控件 * * @author lip * * @date 2015-3-16 */ public class MovieRecorderView extends LinearLayout implements OnErrorListener { private SurfaceView mSurfaceVi

android 截图,视频录制命令 screencap screenrecord screenshot

时间限制视频录制: screenrecord  --time-limit 20 /sdcard/demo.mp4 抓屏: screencap -p /sdcard/screen.png screenshot /sdcard/screen.png 视频录制命令screenrecord # screenrecord --help Usage: screenrecord [options] <filename> Records the device's display to a .mp4 file.

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

Android语音录制可以通过MediaRecorder和AudioRecorder.MediaRecorder本来是多媒体录制控件,可以同时录制视频和语音,当不指定视频源时就只录制语音(默认录制语言):AudioRecorder只能录制语音.二者录制的区别在于,MediaRecorder固定了语音的编码格式,具体平台支持类型可以在http://developer.android.com/guide/appendix/media-formats.html这里查看,而且使用时指定输出文件,在录制的

【Android】20.3 拍照和视频录制

分类:C#.Android.VS2015: 创建日期:2016-03-13 一.简介 Android提供的Camera有两个典型的版本,一个是在Android 5.0以前提供的,称为Camera:另一个是从Android 5.0开始提供的,称为Camera2. 这里仅演示使用系统Camera程序实现拍照的基本用法. 二.Camera基本概念 用Camera实现拍照和摄像功能时,有以下两种实现办法: 一是直接利用Intent启动系统自带的Camera App打开相机实现拍照和摄像功能,然后通过An

Android短视频开发

Android短视频录制 又拍云Android短视频录制SDK功能说明: Android 短视频播放 又拍云 Android 短视频播放器SDK功能说明:完美兼容Android2.3 (API)及其以上 支持多种视频协议:HLS,RTMP,HTTP-FLV等,支持HLS多种分辨率切换: 支持本地视频播放: 支持自由设置短视频播放窗口大小 支持全屏播放 支持缓冲区大小设置 提供UpVideoView控件 支持ARM.ARMv7a.ARM64v8a.X86等主流芯片体系架构. 进入又拍云短视频服务页

Android视频录制从不入门到入门系列教程(三)————视频方向

运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子的: 就是说,即使你是竖着拿手机的,Camera提供给你的视频图像的方向还是上图那样横着的图片. 我们可以通过下述方向改变Camera提供的视频图像的方法: camera.setDisplayOrientation(90); 让图像顺时针旋转90度,视频图像的方向就正常的. 本篇文章DEMO下载.

Android 微信小视频录制功能实现

目录 开发之前 开发环境 相关知识点 开始开发 案例预览 案例分析 搭建布局 视频预览的实现 自定义双向缩减的进度条 录制事件的处理 长按录制 抬起保存 上滑取消 双击放大(变焦) 实现视频的录制 实现视频的停止 完整代码 总结 开发之前 这几天接触了一下和视频相关的控件, 所以, 继之前的微信摇一摇, 我想到了来实现一下微信小视频录制的功能, 它的功能点比较多, 我每天都抽出点时间来写写, 说实话, 有些东西还是比较费劲, 希望大家认真看看, 说得不对的地方还请大家在评论中指正. 废话不多说,

利用FFmpeg玩转Android视频录制与压缩(二)&lt;转&gt;

转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女票已经分了又合,合了又分,本屌依旧骄傲单身.上一次啊我们大致说了一些简单的FFmpeg命令以及Java层简单的调用方式,然后有很多朋友在github或者csdn上给我留言,很多时候我都选择避而不答,原因是本库以前用的so包是不开源的,我根本改不了里面东西.但是这一次啊我们玩点大的,我重新编译了FFm