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. R函数:交集intersect、并集union、找不同setdiff、判断相同setequal
  2. ch5 MySQL 备份与恢复
  3. python装饰器原理-python 中的装饰器及其原理
  4. AttributeError:module tensorflow no attribute app解决办法
  5. 【网址收藏】Spark History Server配置及使用
  6. JSP页面中的pageEncoding和contentType两种属性
  7. Linux ping不通百度的解决方法
  8. 语言分类,我接触和我想学习的
  9. MySQL调用mongodb事务回滚_SpringBoot整合MongoDB,在多数据源下实现事务回滚。
  10. python android自动化_python在Android下的自动化测试用法
  11. mysql 左连接 和全连接_mysql左连接,右连接,内连,全连
  12. java 线程的join_多线程中join()
  13. 我从创立3家科技公司的经历中学到了什么
  14. 交叉风帆行业调研报告 - 市场现状分析与发展前景预测
  15. Python bytearray()
  16. pip常用指令及numpy安装
  17. David Marr-《视觉计算理论》-思想总结
  18. XS9951 两通道多合一同轴高清解码芯片 国产
  19. clickhouse索引原理介绍
  20. 赚钱游戏APP套路有哪些?

热门文章

  1. url指定服务器是什么意思,URL是什么意思?网页的URL是什么意思?
  2. HDU - 4565 So Easy!
  3. There are 1 missing blocks. The following files may be corrupted:
  4. 【洛谷P3987】我永远喜欢珂朵莉~【卡常】
  5. 全球及中国有机橘子油行业投资前景预测与重点企业经营分析报告2021-2027年版
  6. Mac Android Studio连接MuMu模拟器
  7. exports is not defined
  8. 程序员多次下载的浏览器竟然是它!
  9. debian学习笔记5:debian系统服务优化
  10. 基于Hadoop平台使用MapReduce统计某银行信用卡违约用户数量