安卓实现视频录制

安卓实现视频录制,我发现有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder。

以下内容也是通过自己测试整理而来。转载请注明出处:http://www.pm-road.com/index.php/2014/12/05/267/

这两种方法我全部测试了,每种方法都有自己的优缺点。接下来,把两种方法的代码写出来。

先说第一种方法,也是最简单的方法,那就是直接调用系统的视频功能。

代码很简单:

Java代码  

  1. //这是跳转至录制视频界面的按钮监听
  2. class VideoListener implements OnClickListener {
  3. @Override
  4. public void onClick(View v) {
  5. Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
  6. //在这里的QUALITY参数,值为两个,一个是0,一个是1,代表录制视频的清晰程度,0最不清楚,1最清楚
  7. //没有0-1的中间值,另外,使用1也是比较占内存的,测试了一下,录制1分钟,大概内存是43M多
  8. //使用0,录制1分钟大概内存是几兆
  9. intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  10. // 限制时长 ,参数61代表61秒,可以根据需求自己调,最高应该是2个小时。
  11. //当在这里设置时长之后,录制到达时间,系统会自动保存视频,停止录制
  12. intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 61);
  13. // 限制大小 限制视频的大小,这里是100兆。当大小到达的时候,系统会自动停止录制
  14. intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024 * 1024 * 100);
  15. //在这里有录制完成之后的操作,系统会默认把视频放到照片的文件夹中
  16. startActivityForResult(intent, 11);
  17. }

接下来是第二方法 ,也是比第一次麻烦的方法 ,使用MediaRecorder:

Java代码  

  1. //跳转至录制视频页面的按钮事件
  2. class VideoListener implements OnClickListener {
  3. @Override
  4. public void onClick(View v) {
  5. Intent intent = new Intent(context,MovieRecorder.class);
  6. startActivity(intent);
  7. }
  8. }

MovieRecorder.class 中的代码:

Java代码  

  1. package com.titan.ti_yuqiao.video;
  2. import java.io.File;
  3. import android.app.Activity;
  4. import android.content.pm.ActivityInfo;
  5. import android.graphics.PixelFormat;
  6. import android.media.MediaRecorder;
  7. import android.os.Bundle;
  8. import android.os.Environment;
  9. import android.view.SurfaceView;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.view.Window;
  13. import android.view.WindowManager;
  14. import android.widget.ImageButton;
  15. import android.widget.Toast;
  16. import com.titan.ti_yuqiao.R;
  17. public class MovieRecorder extends Activity implements OnClickListener {
  18. // 程序中的两个按钮,录制和停止
  19. ImageButton record, stop;
  20. // 系统的视频文件
  21. File videoFile;
  22. MediaRecorder mRecorder;
  23. // 显示视频预览的SurfaceView
  24. SurfaceView sView;
  25. // 记录是否正在进行录制
  26. private boolean isRecording = false;
  27. @Override
  28. public void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. // 去掉标题栏 ,必须放在setContentView之前
  31. requestWindowFeature(Window.FEATURE_NO_TITLE);
  32. setContentView(R.layout.video);
  33. // 设置横屏显示
  34. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  35. // 设置全屏
  36. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  37. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  38. // 选择支持半透明模式,在有surfaceview的activity中使用。
  39. getWindow().setFormat(PixelFormat.TRANSLUCENT);
  40. // 获取程序界面中的两个按钮
  41. record = (ImageButton) findViewById(R.id.record);
  42. stop = (ImageButton) findViewById(R.id.stop);
  43. // 让stop按钮不可用。
  44. stop.setEnabled(false);
  45. // 为两个按钮的单击事件绑定监听器
  46. record.setOnClickListener(this);
  47. stop.setOnClickListener(this);
  48. // 获取程序界面中的SurfaceView
  49. sView = (SurfaceView) this.findViewById(R.id.sView);
  50. // 设置分辨率
  51. sView.getHolder().setFixedSize(1280, 720);
  52. // 设置该组件让屏幕不会自动关闭
  53. sView.getHolder().setKeepScreenOn(true);
  54. }
  55. @Override
  56. public void onClick(View source) {
  57. switch (source.getId()) {
  58. // 单击录制按钮
  59. case R.id.record:
  60. if (!Environment.getExternalStorageState().equals(
  61. android.os.Environment.MEDIA_MOUNTED)) {
  62. Toast.makeText(MovieRecorder.this, "SD卡不存在,请插入SD卡!",
  63. Toast.LENGTH_SHORT).show();
  64. return;
  65. }
  66. try {
  67. // 创建保存录制视频的视频文件,视频结果会保存在sd卡的根目录20141205123345.3gp
  68. videoFile = new File(Environment.getExternalStorageDirectory()
  69. .getCanonicalFile() + "/20141205123345.3gp");
  70. // 创建MediaPlayer对象
  71. mRecorder = new MediaRecorder();
  72. mRecorder.reset();
  73. // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER)
  74. mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  75. // 设置从摄像头采集图像
  76. mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  77. // 设置视频文件的输出格式
  78. // 必须在设置声音编码格式、图像编码格式之前设置
  79. mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  80. // 设置声音编码的格式
  81. mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  82. // 设置图像编码的格式
  83. mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  84. //我一开始将这里的分辨率调成了640,480调完之后,发现录出的视频会花屏,改成1280,720则没事
  85. mRecorder.setVideoSize(1280, 720);
  86. // 每秒 4帧
  87. mRecorder.setVideoFrameRate(20);
  88. //数值越大,越清晰,占用内存越大,一开始我使用的是5*1024*1024,画面的质量和第一种方法质量为0的时候差不多,
  89. //后来改成7*1024*1024,清晰度立马提升,后来写成了8*1024*1024
  90. mRecorder.setVideoEncodingBitRate(8*1024*1024);
  91. mRecorder.setOutputFile(videoFile.getAbsolutePath());
  92. // 指定使用SurfaceView来预览视频
  93. mRecorder.setPreviewDisplay(sView.getHolder().getSurface()); // ①
  94. mRecorder.prepare();
  95. // 开始录制
  96. mRecorder.start();
  97. // 让record按钮不可用。
  98. record.setEnabled(false);
  99. // 让stop按钮可用。
  100. stop.setEnabled(true);
  101. isRecording = true;
  102. } catch (Exception e) {
  103. e.printStackTrace();
  104. }
  105. break;
  106. // 单击停止按钮
  107. case R.id.stop:
  108. // 如果正在进行录制
  109. if (isRecording) {
  110. // 停止录制
  111. mRecorder.stop();
  112. // 释放资源
  113. mRecorder.release();
  114. mRecorder = null;
  115. // 让record按钮可用。
  116. record.setEnabled(true);
  117. // 让stop按钮不可用。
  118. stop.setEnabled(false);
  119. }
  120. break;
  121. }
  122. }
  123. }

以下是该MovieRecorder.class对应的xml配置

Xml代码  

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <!-- 显示视频预览的SurfaceView -->
  8. <SurfaceView
  9. android:id="@+id/sView"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent" />
  12. <LinearLayout
  13. android:orientation="horizontal"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:gravity="center_horizontal"
  17. android:layout_alignParentBottom="true"
  18. android:layout_centerHorizontal="true">
  19. <ImageButton
  20. android:id="@+id/record"
  21. android:layout_width="66dp"
  22. android:layout_height="66dp"
  23. android:scaleType="fitCenter"
  24. android:src="@drawable/red_no_problem" />
  25. <ImageButton
  26. android:id="@+id/stop"
  27. android:layout_width="66dp"
  28. android:layout_height="66dp"
  29. android:scaleType="fitCenter"
  30. android:src="@drawable/red_success" />
  31. </LinearLayout>
  32. </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-13 18:46:40

安卓实现视频录制的相关文章

Android实现视频录制

安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder. 每种方法都有自己的优缺点.接下来,把两种方法的代码写出来. 先说第一种方法,也是最简单的方法,那就是直接调用系统的视频功能. 代码很简单: //这是跳转至录制视频界面的按钮监听 class VideoListener implements OnClickListener {   @Override public void onClick(View v) {   Intent intent = new

【金】第123篇 一对一视频录制(二)之btnStartRecording.onclick函数周三

关键词:一对一视频录制,btnStartRecording.onclick函数 一.一对一视频录制 1.1 参考网址 https://www.webrtc-experiment.com/RecordRTC/ 视频录制下载网址: https://github.com/muaz-khan/RecordRTC 1.2 研究下如下代码 我要的是如下这个: <scriptsrc="https://cdn.WebRTC-Experiment.com/RecordRTC.js"><

【铜】第131篇 融合一对一canvas视频录制到备份上(二)简版做成及追加图片过程周四

关键词:一对一canvas视频录制, 简版做成,追加图片过程 一.一对一视频录制 1.1 往备份上布录制-----------------bug处理 现在不知道,网页录制都依赖哪些文件,现在需要一个一个的去除.现在去除差不多了,如下: 经过整理发现,仅仅需要两个文件,就能实现录制.如下: 简版访问地址如下: http://localhost:9001/record-canvas-drawings.html#no-back-button 二.追加图片过程 2.1 学生端追加拍照 <li><

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

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

【铜】第174-9篇 一对一视频录制(九)一对多学生端删除白板及nginx下配CI

关键词:webm文件在手机端播放, 一对多学生端删除白板, nginx下配CI 一.一对一视频录制 1.1.webm文件在手机端播放 1)在PC上 a.)用谷歌浏览器播放 http://123.57.206.36:8014/uploads/177013288141499069939723.webm 2)手机端播放 二.一对多 2.1 网址 1)备份上 老师端:https://123.57.206.36:9101/demos/index.html?roomid=888&teaNameMobile=

【铜】第135篇 一对一视频录制(二)及必填项红色星标及隐藏index.php及必选项不能为空 周一

关键词:一对一视频录制, 必填项红色星标, 隐藏index.php, 必选项不能为空 一.一对一视频录制 1.1 需要做的 二.我的网站 2.1 必填项红色星标 代码如下: <spanstyle="color:red;">*</span> 效果如下: 2.2 隐藏index.php 1)开启mod_rewrite.so LoadModule rewrite_modulemodules/mod_rewrite.so 注:去掉前面的#,重启apache即可. 2)如

【铜】第124篇 一对一视频录制(三)及网站注册 周四

关键词:一对一视频录制,网站注册 一.一对一视频录制 1.1 参考网址 https://www.webrtc-experiment.com/RecordRTC/ 视频录制下载网址: https://github.com/muaz-khan/RecordRTC 1.2  网页录制 本地: http://localhost:9001/Canvas-Recording/webpage-recording.html 作者: https://www.webrtc-experiment.com/Record

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 转载:http://www.cnblogs.com/kenshincui/p/4186022.html#avFoundationCamera --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音

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

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