安卓实现视频录制,我发现有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder。
以下内容也是通过自己测试整理而来。转载请注明出处:http://www.pm-road.com/index.php/2014/12/05/267/
这两种方法我全部测试了,每种方法都有自己的优缺点。接下来,把两种方法的代码写出来。
先说第一种方法,也是最简单的方法,那就是直接调用系统的视频功能。
代码很简单:
//这是跳转至录制视频界面的按钮监听 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;
四:第一种方法在录制过程中,操作方便,有自己的暂停、录制、播放按钮 ;
第二种只能自己去写暂停、录制或播放按钮;
综上,如果内存足够大的时候,个人推荐使用第一种方法,方便快捷。
以上内容也是通过自己测试整理而来。转载请注明出处:http://www.pm-road.com/index.php/2014/12/05/267/
相关推荐
本文是通过通过Intent的方式:Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 等等实现视频,录制,拍照并保存到sd卡
使用MediaRecorder实现视频录制,以实现的功能包括:录制开始、录制暂停和计时,播放功能暂时没有,以后如果有机会补上。注意除了在AndroidManifest.xml文件中申请权限外,还需要手动开启存储和相机权限,否则真机...
android的仿微信视频录制播放,可以实现10秒中的视频录制,然后将该视频以mp4的格式存放在本地,用surfaceview播放。
其中包括一个自己写的Camera2的Demo,支持预览、拍照和视频录制,以及若干个网上找的,具有参考价值的Camera2 Demo。 具体看我的博客 : https://blog.csdn.net/EthanCo/article/details/131371887 ...
android的仿微信视频录制播放,自定义了一个视频录制控件,运用了计时器、录制完成回调接口实现了微信中发小视频的10秒视频录制功能,以mp4的视频格式存放在本地。拥有进度条、摄像头控制、竖屏录制、视频录制格式、...
类似微信录制小视频的功能,播放工具采用金山云SDK研发
如今火热的微信小视频录制与播放功能,相信很多项目都有用到。本案例,则是利用原生API实现了小视频录制和播放,包括前后摄像头都可以。顺便也实现了拍照功能,也是支持前后摄像头的。欢迎下载学习!
3.使用场景:uniapp打包android端录制视频使用,视频组件可进行前置摄像头和后置摄像头录制,没有时间限制,小程序uniapp原生的uni.chooseVideo对android端有限制,如果原生api不能满足需求,可以使用插件。...
之前一直寻找有没有仿微信视频录制,但是一直没有找到这方面的东西,网上的东西也是比较的零散,所以自己整理了一份仿微信视频录制功能,在小米,华为,魅族都试验过,可以兼容的
Android实现音视频实时录制和回放,音频使用两个独立的线程进行采集与播放,视频是通过提三方库实现的
Android工具-截屏和视频录制效果的实现.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
采用开源项目https://github.com/microshow/RxFFmpeg实现的短视频录制及编辑,包含视频录制滤镜、添加涂鸦、添加贴纸、添加文字、视频倍速、视频裁剪、截取时长。
由于工作中需要用到Camera1,所以花了两天时间研究了以下,使用Android Camera1 API实现了相机预览、拍照和录制视频的功能。 资源中有个MyCamera1Demo.apk可以直接安装运行,MyCamera1Demo.zip是Demo源码。 具体详见...
本代码由anychat奉献,可实现Android视频通话过程中的本地视频录制
android下的图片序列转换为视频,已精简so包,完全由javacv实现从图片或者Bitmap到视频的录制,有完整配置界面,支持录像和暂停以及重启需要导入lib文件夹下的javacv.jar和javacpp.jar两个包.rar,太多无法一一验证...
实现Android本机 视频录制播放 边录边放.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
我自己写的Android CameraX Demo,实现了预览/拍照/录制视频/图片分析/对焦/切换摄像头等操作。 具体详见我的博客 : https://blog.csdn.net/EthanCo/article/details/125603671
Android 后台Service 实现录像,无页面
此demon实现实时录制,对音视频通过时间戳进行合成,生成本地文件并播放,已将goole的ffmepg编译好,支持h.264解码,根据自己需求进行修改
将Camera数据显示到OpenGL ES渲染的图像中,并通过MediaCodeC 将 OpenGL ES 缓冲数据...5、在 EGL 线程完成渲染后,通过eglSwapBuffers交换缓冲,将EGL渲染内容交换到MediaCodeC给定的Surface中,从而完成mp4视频录制。