使用MediaRecorder录制视频短片
MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同。只是录制视频时不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int audio_source)方法时再调用setVideoSource(int video_source)方法来设置图像来源。
除此之外,还需要在调用setOutputFormat()设置输出文件格式之后进行如下步骤:
1、调用MediaRecorder对象的setVideoEncoder()、setVideoEncodingBitRate(int bitRate)、setVideoFrameRate()设置所录制的视频的编码格式、编码位率、每秒多少帧等,这些参数将可以控制所录制的视频的品质、文件的大小。一般来说,视频品质越好,视频文件越大。
2、调用MediaRecorder的setPreviewDisplay(SurfaceView sv)方法设置使用哪个SurfaceView来显示视频预览。
程序的界面布局如下:
<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"
android:gravity="center_horizontal"
tools:context=".RecodeVideo" >
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
>
<ImageButton
android:id="@+id/recode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/recode"
/>
<ImageButton
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop"
/>
</LinearLayout>
<!-- 显示视频预览的SurfaceView -->
<SurfaceView
android:id="@+id/sView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
程序代码如下:
import java.io.File;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;
public class RecodeVideo extends Activity implements OnClickListener{
//程序中的两个按钮
ImageButton recode;
ImageButton stop;
//系统的视频文件
File videoFile;
MediaRecorder mRecorder;
//显示视频预览的SurfaceView
SurfaceView sView;
//记录是否正在进行录制
private boolean isRecoding = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recode_video);
//获取程序界面中的两个按钮
recode = (ImageButton) findViewById(R.id.recode);
stop = (ImageButton) findViewById(R.id.stop);
//让stop按钮不可用
stop.setEnabled(false);
//为两个按钮的单击事件绑定监听器
recode.setOnClickListener(this);
stop.setOnClickListener(this);
//获取程序界面中的SurfaceView
sView = (SurfaceView) this.findViewById(R.id.sView);
//下面设置Surface不需要自己维护缓冲区
sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置分辨率
sView.getHolder().setFixedSize(320, 280);
//设置该组件让屏幕不会自动关闭
sView.getHolder().setKeepScreenOn(true);
}
@Override
public void onClick(View source) {
switch (source.getId()) {
//单击录制按钮
case R.id.recode:
if(!Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
Toast.makeText(RecodeVideo.this, "SD卡不存在,请插入SD卡!", 5000).show();
return;
}
try {
//创建保存录制视频的视频文件
videoFile = new File(Environment
.getDownloadCacheDirectory().getCanonicalFile()+"/myvideo.mp4");
//创建MediaRecorder对象
mRecorder = new MediaRecorder();
mRecorder.reset();
//设置从麦克风采集声音
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置从摄像头采集图像
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//设置视频文件的输出格式(必须在设置声音编码格式、图像编码格式之前设置)
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
//设置声音编码的格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
//设置图像编码的格式
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mRecorder.setVideoSize(320, 280);
//每秒4帧
mRecorder.setVideoFrameRate(4);
mRecorder.setOutputFile(videoFile.getAbsolutePath());
//指定使用SurfaceView来预览视频
mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
mRecorder.prepare();
//开始录制
mRecorder.start();
System.out.println("----recoding----");
//让recorde按钮不可用
recode.setEnabled(false);
//让stop按钮可用
stop.setEnabled(true);
isRecoding = true;
} catch (Exception e) {
e.printStackTrace();
}
break;
//单击停止按钮
case R.id.stop:
//如果正在进行录制
if(isRecoding){
//停止录制
mRecorder.stop();
//释放资源
mRecorder.release();
mRecorder = null;
//让record按钮可用
recode.setEnabled(true);
//让stop按钮不可用
stop.setEnabled(false);
}
}
}
}
运行该程序需要使用麦克风录制声音。需要使用摄像头采集图像,这些都需要授予相应的权限,不仅如此,由于该录制视频时视频文件增大的较快,可能需要使用外部存储器,因此需要对应用程序授予相应的权限。也就是需要在AndroidManifest.xml文件中增加如下授权配置:
<!-- 授予该程序录制声音的权限 -->
<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"/>
使用MediaRecorder录制视频短片的更多相关文章
- Android使用的开发MediaRecorder录制视频
MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用Medi ...
- 【Android】用MediaRecorder录制视频太短崩的问题
具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩. 错误信息: java.lang.RuntimeException: stop ...
- Android 用MediaRecorder录制视频太短崩的问题
具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩. 错误信息: java.lang.RuntimeException: stop ...
- Android音视频之MediaRecorder音视频录制
前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...
- Android 开发 MediaRecorder使用Camera1配合录制视频
前言 MediaRecorder可以不依靠Camera API 实现视频的录制,但是如果需要切换摄像头/设置对焦/选择分辨率等等就需要Camera来参与配合录制视频.这篇博客将介绍使用Camera1来 ...
- Android手机录制视频 实时传输(转载)
最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...
- 【Android】 Android实现录音、播音、录制视频功能
智能手机操作系统IOS与Android平分天下(PS:WP与其他的直接无视了),而Android的免费招来了一大堆厂商分分向Android示好,故Android可能会有“较好”的前景. Android ...
- 转:android 录制视频的Demo
转:http://blog.csdn.net/peijiangping1989/article/details/7049991 在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. ...
- Android开发之打开闪光灯录制视频
Android的SDK在线API上对录制视频的方法.步骤都写得非常清楚,但是如果没有一点思路,写起来也比较式费事.录制视频的全过程要打开闪光灯(可能是因为项目需要,或者特殊原因),则必须按照一定的顺序 ...
随机推荐
- 使用一个封装的json删除方法
<!-- 前台js代码:其实现的目的:利用异步的封装方法实现增删改操作!--> <script type="text/javascript"> functi ...
- js求和算法研究
如果遇到一个试题是这样. function sum(arr){ //求和 } 你会怎么做? 反正我第一反应是这样做. function sum(arr){ var result = 0; for(va ...
- Div里面载入另一个页面的实现(取代框架)(AJax)(转)
随着框架越来越不火了,HTML5就不对框架支持了,iframe也只有url了,Div就担当了此大任 DIV+CSS在页面部局确实也很让人满意,使用也更方便 今天突然遇到一个问题,那就是需要导入另一个页 ...
- WCF入门教程(vs2010)
这几天挺别人提起WCF,鄙人之前只知道WPF,对WCF这个东东不甚了解,经过查阅网上的资料略有所得,和大家交流一下. 首先WCF是什么? Windows Communication Foundatio ...
- 通过注解(annotation)配置Bean
Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基 ...
- ps前端切图常用快捷键
一.新建文件:预设-自定:宽度1920,单位像素,高度自定义:分辨率:72像素/英寸:颜色模式:RGB,8位:背景色:透明:可存储预设,下次新建的时候,直接在预设中,选择那个名称,点确定.视图:显示- ...
- 每一个可以移动的棋子都要移动——Every-SG 游戏
先看一个问题 HDU 3595 GG and MM (Every_SG博弈) 题目有N个游戏同时进行,每个游戏有两堆石子,每次从个数多的堆中取走数量小的数量的整数倍的石子.取最后一次的获胜.并且N个游 ...
- LTIB常用命令1
下面再写一点ltib的常用命令参数吧,虽然觉得对其编译内核和文件系统流程有了一定了解,但是对其命令参数用过的还不是很多,可以说是不甚了解,下面介绍一些,希望有用: 首先一个比较有用的命令参数就是hel ...
- javascript的语句和函数
1.for-in语句:是一种精准的迭代语句,可以用来枚举对象的属性. 2.label语句:在代码中添加标签,以便将来使用,由break和continue语句调用. 3.with语句:将代码的作用域设置 ...
- xcode6 framework missing submodule xxx 警告
xcode6 framework missing submodule xxx 警告 从xcode6开始,iOS可以直接创建生成framework了 如: 创建 framework 项目,TFKit.f ...