Android多媒体录制--MediaRecorder视频录制
Android使用MediaRecorder类进行视频的录制。
需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错
步骤为:
1、设置视频源,音频源,即输入源
2、设置输出格式
3、设置音视频的编码格式
一、首先看布局文件,这里有一个SurfaceView,这是一个绘制容器,可以直接从内存或者DMA等硬件接口取得图像数据,
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.xqx.mediarecorder.app.WorkRecorder"> <!-- 开始录制按钮 -->
<Button
android:id="@+id/startRecord"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnStartRecord"
android:text="开始录制"
/> <Button
android:id="@+id/stopRecord"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnStopRecord"
android:text="停止录制"
/>
<SurfaceView
android:id="@+id/surView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
二、Activity 代码
1、首先看下成员变量
// 开始录制,停止录制按钮
private Button startRecord,stopRecord;
// 显示预览的SurfaceView
private SurfaceView surfaceView;
// 标记,判断当前是否正在录制
boolean isRunning = false;
// 录制类
private MediaRecorder recorder;
// 存储文件
private File saveFile;
2、onCreate()方法中进行一些初始化
startRecord = (Button) findViewById(R.id.startRecord);
stopRecord = (Button) findViewById(R.id.stopRecord);
surfaceView = (SurfaceView) findViewById(R.id.surView); // onCreate()初始化 ,一开始肯定没有开始录制,所以停止按钮不可点击
stopRecord.setEnabled(false);
// 设置Surface不需要维护自己的缓冲区
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 设置分辨率
surfaceView.getHolder().setFixedSize(, );
// 设置该组件不会让屏幕自动关闭
surfaceView.getHolder().setKeepScreenOn(true);
3、现在看“开始录制”监听事件
----3.1
创建MediaRecorder对象
recorder = new MediaRecorder();
recorder.reset();
----3.2 设置三步,顺序固定
//1.设置采集声音
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置采集图像
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//2.设置视频,音频的输出格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//3.设置音频的编码格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//设置图像的编码格式
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
----3.3 其他可选设置,更多请查看API
//设置立体声
recorder.setAudioChannels();
//设置最大录像时间 单位:毫秒
recorder.setMaxDuration();
//设置最大录制的大小 单位,字节
recorder.setMaxFileSize(*);
//音频一秒钟包含多少数据位
recorder.setAudioEncodingBitRate();
//设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
recorder.setOrientationHint();
//设置录像的分辨率
recorder.setVideoSize(176, 144);
----3.4 设置文件存储路径,这里简陋了,实际开发中需要判断是否有外部存储,是否有目标目录 ,是否已经存在相同名字的文件 等问题
//设置输出文件路径 saveFile = new File(Environment.getExternalStorageDirectory()
.getCanonicalFile() + "/myvideo.mp4");
recorder.setOutputFile(saveFile.getAbsolutePath());
----3.5 使用SurfaceView进行预览
recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
----3.6 开始录制
recorder.prepare();
//开始录制
recorder.start();
//让开始按钮不可点击,停止按钮可点击
startRecord.setEnabled(false);
stopRecord.setEnabled(true);
isRunning = true;
----3.7 停止录制
//停止录制
recorder.stop();
//释放资源
recorder.release();
recorder = null;
//设置开始按钮可点击,停止按钮不可点击
startRecord.setEnabled(true);
stopRecord.setEnabled(false);
完整代码:
package com.xqx.mediarecorder.app; import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.hardware.Camera; import java.io.File;
import java.io.IOException; public class WorkRecorder extends Activity implements Camera.PreviewCallback { // 开始录制,停止录制按钮
private Button startRecord,stopRecord;
// 显示预览的SurfaceView
private SurfaceView surfaceView;
// 标记,判断当前是否正在录制
boolean isRunning = false;
// 录制类
private MediaRecorder recorder;
// 存储文件
private File saveFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_work_recorder); startRecord = (Button) findViewById(R.id.startRecord);
stopRecord = (Button) findViewById(R.id.stopRecord);
surfaceView = (SurfaceView) findViewById(R.id.surView); // onCreate()初始化 ,一开始肯定没有开始录制,所以停止按钮不可点击
stopRecord.setEnabled(false); // 设置Surface不需要维护自己的缓冲区
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 设置分辨率
surfaceView.getHolder().setFixedSize(, );
// 设置该组件不会让屏幕自动关闭
surfaceView.getHolder().setKeepScreenOn(true); } /**
* 开始录制
* @param view
*/
public void btnStartRecord(View view) { // 首先判断当前是否处理视频录制状态,只有不是录制状态的时候,才可以开始录制
if (!isRunning){
try {
//创建MediaRecorder对象
recorder = new MediaRecorder();
recorder.reset(); //1.设置采集声音
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置采集图像
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//2.设置视频,音频的输出格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//3.设置音频的编码格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
//设置图像的编码格式
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置立体声
recorder.setAudioChannels();
//设置最大录像时间 单位:毫秒
recorder.setMaxDuration();
//设置最大录制的大小 单位,字节
recorder.setMaxFileSize(*);
//音频一秒钟包含多少数据位
recorder.setAudioEncodingBitRate();
//设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
recorder.setOrientationHint(); //设置输出文件路径
// saveFile = FileUtils.getMediaRecoderFolder(this);
saveFile = new File(Environment.getExternalStorageDirectory()
.getCanonicalFile() + "/myvideo.mp4");
// recorder.setVideoSize(320, 240);
// recorder.setVideoFrameRate(20);
recorder.setOutputFile(saveFile.getAbsolutePath());
//使用SurfaceView预览
recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
recorder.prepare();
//开始录制
recorder.start();
//让开始按钮不可点击,停止按钮可点击
startRecord.setEnabled(false);
stopRecord.setEnabled(true);
isRunning = true;
} catch (IOException e) {
e.printStackTrace();
} }
} /**
* 结束录制
* @param view
*/
public void btnStopRecord(View view) {
if (isRunning){
//停止录制
recorder.stop();
//释放资源
recorder.release();
recorder = null;
//设置开始按钮可点击,停止按钮不可点击
startRecord.setEnabled(true);
stopRecord.setEnabled(false);
}
} @Override
public void onPreviewFrame(byte[] data, Camera camera) { }
}
WorkRecorder
本例子只是一个简单的Demo,用于给刚接触MediaRecorder音频录制的coder学习,存在一些Bug和不足,各位coder可以继续拓展
不足:
1、只有当点击“开始录制”的时候SurfaceView组件才可以看到摄像头拍摄的预览,否则是一篇黑,这里可以看下Canera类,进行相应的调整
2、保存路径,需要判断是否有外部存储,存储空间是否足够,路径是否不存在,是否有已有的文件名相同的文件存在等问题,设置文件的名字,我这里是固定路径固定文件名
3、摄像预览效果是有90度旋转的,这里需要大家个人去看下MedioRecoder的API 去进行设置
4、没有设置对焦,像素不清楚,摄像宽高变形
Android多媒体录制--MediaRecorder视频录制的更多相关文章
- Android 开发 MediaRecorder视频录制入门
前言 MediaRecorder是Android SDK提供用于录制音视频,关于音频的录制在我另一篇博客里已经介绍.传送门: https://www.cnblogs.com/guanxinjing/p ...
- Android 仿微信小视频录制
Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章
- 使用 Xbox Game 录制桌面视频(录制音频)
使用 Xbox Game 录制桌面视频(附带音频) 前言:可能自己音频输出的问题,一直无法用工具录制桌面的音频,而最后发现利用 Xbox Game 录制游戏视频的功能很好地解决我们的问题. 1)打开游 ...
- Android 多媒体 播放音视频
1.播放音频 因为涉及到读取文件,所以需要申请权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_S ...
- 短视频技术详解:Android端的短视频开发技术
在 <如何快速实现移动端短视频功能?>中,我们主要介绍了当前短视频的大热趋势以及开发一个短视频应用所涉及到的功能和业务.在本篇文章中,我们主要谈一谈短视频在Android端上的具体实现技术 ...
- Android多媒体-MediaRecorder 录制音视频
不多说,直接上代码,有具体凝视 MyAudioRecord.java import java.io.File; import java.io.IOException; import android.a ...
- Android音视频之MediaRecorder音视频录制
前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...
- Android 中使用MediaRecorder进行录像详解(视频录制)
在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. package com.video; import java.io.IOException; import android.ap ...
- Android使用MediaRecorder和Camera实现视频录制及播放功能整理
转载请注明出处:http://blog.csdn.net/woshizisezise/article/details/51878566 这两天产品经理向我丢来一个新需求,需要在项目里添加一个视频录制的 ...
随机推荐
- Java框架篇---Mybatis 构建SqlSessionFactory
从 XML 中构建 SqlSessionFactory 基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory 的实例可以通过 ...
- java攻城狮之路(Android篇)--SQLite
一.Junit 1.怎么使用 在AndroidManifest.xml文件中进行配置, 在manifest借点下配置instrumentation, 在application借点下 ...
- 疯狂的ASP.NET系列-第一篇:啥是ASP.NET后续
之前总结到了ASP.NET的七大特点,只总结了2大特点,现继续总结后面的5大特点. (3)ASP.NET支持多语言 这里说的多语言就是多种开发语言,如C#,VB.NET,无论你采用哪种开发语言,最终的 ...
- BEA-150021 - The admin server failed to authenticate the identity of the user username starting the managed server.
原因:用户名.密码错误. 解决方法:修改boot.properties用户名密码为明文方式,然后重新启动就OK了,自动加密.
- 笔试测试开发题三道(python)
笔试遇到的三道测试开发题,虽然都不难,但关键还是思路吧!我想在开发东西的时候应该具备的就是思路,有了思路尝试去写,或查相关文档或代码,在此基础上需要不断调整最终达到需求.思路又是在不断练习中获得的. ...
- ecshop中那些有意思的代码
1:返回数量为0的array,而不是null /** * 获得推荐商品 * * @access public * @param string $type 推荐类型,可以是 best, new, hot ...
- SystemTap知识(一)
SystemTap是一个系统的跟踪探测工具.它能让用户来跟踪和研究计算机系统在底层的实现. 安装SystemTap需要为你的系统内核安装-devel,-debuginfo,-debuginfo-com ...
- Winform自定义窗体样式,实现标题栏可灵活自定义
最近在编写C/S结构应用程序时,感觉窗体的标题栏样式太死板了,标题文字不能更改大小.颜色.字体等,按钮不能隐藏等问题,在网上也查找了许多相关的资料,没有找到合适的解决方案,发现许多人也在寻求这个问题, ...
- servlet中的细节
Get方法有大小限制:1024个字符.这些信息使用 Query_String头传递,并通过Query_String环境变量访问.Post方法:请求体信息使用FromData头传递.读取所有表单参数:g ...
- 计算几何 : 凸包学习笔记 --- Graham 扫描法
凸包 (只针对二维平面内的凸包) 一.定义 简单的说,在一个二维平面内有n个点的集合S,现在要你选择一个点集C,C中的点构成一个凸多边形G,使得S集合的所有点要么在G内,要么在G上,并且保证这个凸多边 ...