MediaRecorder可以实现录音和录像。

MediaRecorder官方说明:

http://developer.android.com/reference/android/media/MediaRecorder.html

使用MediaRecorder录音录像时需要严格遵守API说明中的函数调用先后顺序,否则不能成功执行。

下面是MediaRecorder实现录像的例子。

此程序在高通MSM7225平台的华为U8500 2.2版本上可以正常录像。但在MTK MT6575平台的联想A750上不能正常运行,无法实现录像。

在展讯8810 2.3.5平台可以实现录像,但播放没有声音,通过mediaInfo查看,已经有视频数据了,但是无法播放,在PC上也不能播放,可能是录制的时候出现了问题。

可见,通过camera录像的程序对平台和硬件的依赖性很强,同样的程序在不同的手机上表现差别很大。

1.Activity类

public class MainActivity extends Activity implements SurfaceHolder.Callback {
private static final String TAG = "MainActivity";
private SurfaceView mSurfaceview;
private Button mBtnStartStop;
private boolean mStartedFlg = false;
private MediaRecorder mRecorder;
private SurfaceHolder mSurfaceHolder;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
// 设置横屏显示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
// 选择支持半透明模式,在有surfaceview的activity中使用。
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.activity_main);
mSurfaceview  = (SurfaceView)findViewById(R.id.surfaceview);
mBtnStartStop = (Button)findViewById(R.id.btnStartStop);
mBtnStartStop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (!mStartedFlg) {
// Start
if (mRecorder == null) {
mRecorder = new MediaRecorder(); // Create MediaRecorder
}
try {
// Set audio and video source and encoder
// 这两项需要放在setOutputFormat之前
mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Set output file format
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 这两项需要放在setOutputFormat之后
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
mRecorder.setVideoSize(320, 240);
mRecorder.setVideoFrameRate(20);
mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
// Set output file path
String path = getSDPath();
if (path != null) {
File dir = new File(path + "/recordtest");
if (!dir.exists()) {
dir.mkdir();
}
path = dir + "/" + getDate() + ".3gp";
mRecorder.setOutputFile(path);
Log.d(TAG, "bf mRecorder.prepare()");
mRecorder.prepare();
Log.d(TAG, "af mRecorder.prepare()");
Log.d(TAG, "bf mRecorder.start()");
mRecorder.start();   // Recording is now started
Log.d(TAG, "af mRecorder.start()");
mStartedFlg = true;
mBtnStartStop.setText("Stop");
Log.d(TAG, "Start recording ...");
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
// stop
if (mStartedFlg) {
try {
Log.d(TAG, "Stop recording ...");
Log.d(TAG, "bf mRecorder.stop(");
mRecorder.stop();
Log.d(TAG, "af mRecorder.stop(");
mRecorder.reset();   // You can reuse the object by going back to setAudioSource() step
mBtnStartStop.setText("Start");
} catch (Exception e) {
e.printStackTrace();
}
}
mStartedFlg = false; // Set button status flag
}
}
});
SurfaceHolder holder = mSurfaceview.getHolder();// 取得holder
holder.addCallback(this); // holder加入回调接口
// setType必须设置,要不出错.
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
/**
* 获取系统时间
* @return
*/
public static String getDate(){
Calendar ca = Calendar.getInstance();
int year = ca.get(Calendar.YEAR);          // 获取年份
int month = ca.get(Calendar.MONTH);            // 获取月份
int day = ca.get(Calendar.DATE);           // 获取日
int minute = ca.get(Calendar.MINUTE);      // 分
int hour = ca.get(Calendar.HOUR);          // 小时
int second = ca.get(Calendar.SECOND);      // 秒
String date = "" + year + (month + 1 )+ day + hour + minute + second;
Log.d(TAG, "date:" + date);
return date;
}
/**
* 获取SD path
* @return
*/
public String getSDPath(){
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
if (sdCardExist)
{
sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
return sdDir.toString();
}
return null;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
// 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder
mSurfaceHolder = holder;
Log.d(TAG, "surfaceChanged 1");
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
// 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder
mSurfaceHolder = holder;
Log.d(TAG, "surfaceChanged 2");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
// surfaceDestroyed的时候同时对象设置为null
mSurfaceview = null;
mSurfaceHolder = null;
if (mRecorder != null) {
mRecorder.release(); // Now the object cannot be reused
mRecorder = null;
Log.d(TAG, "surfaceDestroyed release mRecorder");
}
}
}

2. Layout文件

布局文件只有一个Surface用于显示录制的视频和一个按钮用于控制开始和结束。

<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="horizontal">
<SurfaceView
android:id="@+id/surfaceview"
android:layout_weight="1"
android:layout_width="0dip"
android:layout_height="fill_parent" />
<Button
android:id="@+id/btnStartStop"
android:layout_width="55dip"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Start"
tools:context=".MainActivity" />
</LinearLayout>

3.Manifest文件增加权限

需要增加使用Camera,Mic,Sd卡的权限,代码如下:

    <uses-permission android:name="android.permission.CAMERA" >
</uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>

Android音视频录制类MediaRecorder用法举例相关推荐

  1. Android音视频开发:MediaRecorder录制音频

    Android 多媒体框架针对音频录制提供了两种方法:MediaRecorder和AudioRecord. 区别 MediaRecorder:录制的音频文件是经过压缩后的,需要设置编码器,并且录制的音 ...

  2. Android音视频开发:MediaRecorder录制视频

    简介 安卓api提供了Camera类控制相机捕获图像,在api21以后,安卓也提供了Camera2,Camera变得过时了,但为了兼容性,这里还是使用Camera. 对于录制视频,可以使用MediaR ...

  3. 推荐几个堪称教科书级别的 Android 音视频入门项目

    公众号回复:OpenGL,领取学习资源大礼包 在 直播 中有提到几个不错的开源项目,这里再重点推荐一下: 目前,市面上关于音视频学习的相关书籍并不多,而且即使看了书籍学了理论,最终还是要回归到代码上来 ...

  4. Android音视频之MediaRecorder录制视频

    1 MediaRecorder 录制视频步骤 这篇文章介绍了Android录音MediaRecorder使用和SoundPool的使用 主要讲解了音频的录制和播放,这篇AudioRecord和Audi ...

  5. 《android多媒体api》之MediaRecorder音视频录制api

    <android多媒体api>系列是整合梳理android开发中经常用到的媒体相关api:多媒体开发主要内容有音频.视频录制播放.摄像头操作.录制操作.流媒体.直播.推流.拉流等方面:最近 ...

  6. Android音视频开发之音频录制和播放

    Android音视频开发之音频录制和播放 1.封装音频录制工具类: public class RecorderAudioManagerUtils {private static volatile Re ...

  7. Android 音视频开发(一) -- 使用AudioRecord 录制PCM(录音);AudioTrack播放音频

    前言,音视频这块,确实比较难入门,本着学习的态度,我这边也跟着 Android 音视频开发入门指南 打怪升级,留下个脚印,大家共勉. 音视频 系列文章 Android 音视频开发(一) – 使用Aud ...

  8. Android OpenGL添加水印并录制视频--抖音视频录制原理

    Android OpenGL添加水印并录制视频–抖音视频录制原理 简单的视频录制,我们可以使用MediaRecorder,具体示例可以参考Gitee: Camera2VideoJava 本文将介绍采集 ...

  9. Android 基于MediaCodec+MediaMuxer实现音视频录制合成

    AudioVideoCodec 一款视频录像机,支持AudioRecord录音.MediaCodec输出AAC.MediaMuxer合成音频视频并输出mp4,支持自动对焦.屏幕亮度调节.录制视频时长监 ...

  10. Android 音视频入门之音频采集、编码、播放

    今天我们学习音频的采集.编码.生成文件.转码等操作,我们生成三种格式的文件格式,pcm.wav.aac 三种格式,并且我们用 AudioStack 来播放音频,最后我们播放这个音频. 本篇文章你将学到 ...

最新文章

  1. 收藏 | 一文打尽AI、机器学习网络资源!
  2. POJ 1679 The Unique MST(次小生成树)
  3. MySQL存储引擎精讲(附带各种存储引擎的对比)
  4. 数据存储之 SQLite 数据库操作(一)
  5. 用git从github网站上下载代码的方法
  6. 冲刺阶段——Day5
  7. 201912-3 化学方程式
  8. java语言程序设计期中考试_《java语言程序设计》期中试卷(答案).doc
  9. 内存泄露分析 - 收藏集 - 掘金
  10. 【ES6-阮一峰博客阅读笔记】
  11. matlab曲线拟合成两直线,最小二乘法曲线拟合 原理及matlab实现
  12. linux tc取消网卡流量限制,Linux高级流量控制tc使用
  13. bmob云服务器信息推送,FAQ-Bmob后端云
  14. manga camera android,SMAAASH! Camera [Manga Photo]
  15. Python:利用matplotlib库绘制统计图(饼图、直方图、散点图、极坐标图和网格图)
  16. ImageDraw类详解:几何图形的绘制与文字的绘制
  17. GIS中快速添加天地图、查看历史影像
  18. 1024,一封写给CSDN家园Python初学者的信 Python初级、中级、高级学习路线
  19. SpringBoot+MyBatis+MySql实现的医院管理系统
  20. 如何在微信复制链接直接可以用浏览器打开 微信调用手机浏览器打开指定链接

热门文章

  1. 终于,阿里云网盘来了!
  2. 73个必会的经济类热词
  3. 基于单片机的智能家居环境监控系统的设计
  4. 第二工业大学计算机应用大专录取分,二工大|2019年上海第二工业大学专科层次依法自主招生各专业最低录取分数线...
  5. 克隆硬盘后进不去系统_克隆硬盘后进不去系统_如何将硬盘克隆到较小的固态硬盘?...
  6. Hexo添加小部件(Butterfly主题) 添加卡通人物(看板娘)
  7. Zeppelin的求学之路(1)—— 简介 和 从源码Build的安装并配置他的Spark解析器
  8. php干货网,php高手干货【必看】
  9. GOBY--一款攻击面测绘工具的使用
  10. (转帖)SpringBoot自定义Starter