1 概述

MediaRecorder类用于录制音频和视频。步骤如下:
(1)实例化MediaRecorder对象
(2)设置声音来源和图像来源
(3)设置视频分辨率
(4)设置录制视频文件的保存路径
(5)设置使用哪个SurfaceView
(6)准备录制视频
(7)开始录制视频
(8)停止录制,释放资源

2 代码

CameraRecord:

https://github.com/hanyuhang-hz/android-demos

MainActivity.java

public class MainActivity extends Activity {public final static String TAG = "CameraRecord";private ImageButton play, stop, record;private MediaRecorder mediaRecorder;private SurfaceView surfaceView;private boolean isRecord = false;private File videoDir;private android.hardware.Camera camera;private File path;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.RECORD_AUDIO}, 1);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.CAMERA}, 1);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);}// 设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);if (!android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {Toast.makeText(MainActivity.this, "请安装SD卡!", Toast.LENGTH_SHORT).show();}record = (ImageButton) findViewById(R.id.record);stop = (ImageButton) findViewById(R.id.stop);play = (ImageButton) findViewById(R.id.play);stop.setEnabled(false);play.setEnabled(false);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);surfaceView.getHolder().setFixedSize(1920, 1080);record.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {record();}});stop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (isRecord) {mediaRecorder.stop();mediaRecorder.release();record.setEnabled(true);stop.setEnabled(false);play.setEnabled(true);Toast.makeText(MainActivity.this, "录像保存在:" + path, Toast.LENGTH_SHORT).show();}}});play.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 通过Intent跳转播放视频界面Intent intent = new Intent(MainActivity.this, PlayVideoActivity.class);startActivity(intent);}});}// 创建record()方法,实现录制功能private void record() {// 设置录制视频保存的文件夹videoDir = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera/");if (!videoDir.exists()) {videoDir.mkdir();}String fileName = "video.mp4";path = new File(videoDir, fileName);mediaRecorder = new MediaRecorder();Camera.Parameters parameters = camera.getParameters();parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);camera.setParameters(parameters);camera.startPreview();camera.setDisplayOrientation(90);camera.unlock();mediaRecorder.setCamera(camera);mediaRecorder.reset();   //重置MediaRecordermediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);           // 设置麦克风获取声音mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);        // 设置摄像头获取图像mediaRecorder.setVideoEncodingBitRate(1920 * 1080);                    // 设置清晰度CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);mediaRecorder.setProfile(profile);mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);mediaRecorder.setOutputFile(path.getAbsolutePath());                   // 设置视频输出路径mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); // 设置使用SurfaceView预览视频mediaRecorder.setOrientationHint(90);                                  // 调整播放视频角度try {mediaRecorder.prepare();                                           // 准备录像} catch (Exception e) {e.printStackTrace();}mediaRecorder.start();                                                 // 开始录制Toast.makeText(MainActivity.this, "开始录像", Toast.LENGTH_SHORT).show();record.setEnabled(false);stop.setEnabled(true);play.setEnabled(false);isRecord = true;}@Overrideprotected void onResume() {camera = android.hardware.Camera.open();super.onResume();}@Overrideprotected void onPause() {camera.stopPreview();camera.release();super.onPause();}
}

PlayVideoActivity.java

public class PlayVideoActivity extends Activity {private SurfaceView surfaceView;private ImageButton play, pause, stop;private MediaPlayer mediaPlayer;private SurfaceHolder surfaceHolder;private boolean noPlay = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_play_video);// 设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);play = (ImageButton) findViewById(R.id.play);pause = (ImageButton) findViewById(R.id.pause);stop = (ImageButton) findViewById(R.id.stop);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);surfaceHolder = surfaceView.getHolder();pause.setEnabled(false);stop.setEnabled(false);/*** 实现播放功能*/play.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (noPlay) {play();noPlay = false;} else {mediaPlayer.start();}}});/*** 实现暂停功能*/pause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}}});/*** 实现停止功能*/stop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();noPlay = true;pause.setEnabled(false);stop.setEnabled(false);}}});}/*** 创建play()方法,在该方法中实现视频的播放功能*/public void play() {mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDisplay(surfaceHolder);try {mediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/DCIM/Camera/video.mp4");mediaPlayer.prepare();} catch (Exception e) {e.printStackTrace();}mediaPlayer.start();pause.setEnabled(true);stop.setEnabled(true);// 为MediaPlayer对象添加完成事件监听器mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {Toast.makeText(PlayVideoActivity.this, "视频播放完毕!", Toast.LENGTH_SHORT).show();}});}/*** 当前Activity销毁时,停止正在播放的视频,并释放MediaPlayer所占用的资源*/@Overrideprotected void onDestroy() {super.onDestroy();if (mediaPlayer != null) {if (mediaPlayer.isPlaying()) {mediaPlayer.stop();}// Activity销毁时停止播放,释放资源。不做这个操作,即使退出还是能听到视频播放的声音mediaPlayer.release();}}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><!--SurfaceView组件--><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent" /><!--水平线性布局--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:orientation="horizontal"><!--播放按钮--><ImageButtonandroid:id="@+id/play"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/btn_bg"android:src="@drawable/play" /><!--录制按钮--><ImageButtonandroid:id="@+id/record"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/btn_bg"android:src="@drawable/record" /><!--停止按钮--><ImageButtonandroid:id="@+id/stop"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/btn_bg"android:src="@drawable/stop" /></LinearLayout></RelativeLayout>

activity_play_video.xml

<?xml version="1.0" encoding="utf-8"?>
<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.hyh.camerarecord.PlayVideoActivity"><!--SurfaceView组件--><SurfaceViewandroid:id="@+id/surfaceView"android:layout_weight="10"android:layout_width="wrap_content"android:layout_height="wrap_content" /><!--水平线性布局--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="horizontal"><!--播放按钮--><ImageButtonandroid:id="@+id/play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/black"android:src="@drawable/btn_play" /><!--暂停按钮--><ImageButtonandroid:id="@+id/pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/black"android:src="@drawable/btn_pause" /><!--停止按钮--><ImageButtonandroid:id="@+id/stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/black"android:src="@drawable/btn_stop" /></LinearLayout>
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.hyh.camerarecord"><!-- 授予程序录制声音的权限 --><uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- 授予程序使用摄像头的权限 --><uses-permission android:name="android.permission.CAMERA" /><!-- 授予使用外部存储器的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.CameraRecord"android:requestLegacyExternalStorage="true"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".PlayVideoActivity"></activity></application></manifest>

3 遇到的问题

3.1 java.io.FileNotFoundException: /storage/emulated/0/Camera/DCIM/video.mp4: open failed: ENOENT (No such file or directory)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<applicationandroid:requestLegacyExternalStorage="true"
</application>

3.2 java.lang.RuntimeException: start failed.
        at android.media.MediaRecorder.start(Native Method)
        at com.hyh.camerarecord.MainActivity.record(MainActivity.java:141)

屏蔽:
//mediaRecorder.setVideoSize(1920, 1080);                              //设置视频的尺寸
//mediaRecorder.setVideoFrameRate(10);                                 //设置为每秒10帧

3.3 MediaRecorder录制的视频不聚焦

Camera.Parameters parameters = camera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
camera.setParameters(parameters);

3.4 MediaRecorder录制的视频和预览视频清晰度不一致,录制的视频不清晰

参考https://blog.csdn.net/qunqunstyle99/article/details/83143939

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setProfile(profile);
mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);

使用MediaRecorder录制音频和视频(Camera1)相关推荐

  1. 用浏览器轻松录制音频、视频—— MediaRecorder API

    原文链接 浏览器有个强大而且简单的API -- MediaRecorder,顾名思义,可以用来录制音频和视频. 闲话不说,先上demo -- #demo1: 录制语音 < 微信(66)哈哈哈·· ...

  2. Android音频处理知识(一)MediaRecorder录制音频

    在Android中处理音频方面的知识一直是一块很重要的知识,正好最近公司做一个关于打卡的内容,所以正好总结一下相应的知识,其实这块的知识挺杂挺乱的,所以这个不打算一次讲解完,分开给大家讲解,如果有什么 ...

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

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

  4. Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.使用录音机录制音频 手机有自带的系统相机,也有自带的系统录音机,只要在调用startActivityForResult之前指定该动作,就会自动 ...

  5. 多媒体——音频——利用MediaRecorder录制音频

    布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:lay ...

  6. Android MediaRecorder录制视频音量小问题解决 (音视频转码合成)

    之前写得太乱,回头看看感觉自己都有点看不懂,重新写下. 在android上需要做一个录像留言功能,需要生成MP4或者waw格式视频.但是使用MediaRecorder录制出的MP4视频格式音量太小,几 ...

  7. MediaRecorder之音频录制

    一 前言 在前面已经介绍过使用MediaPlayer播放音频,那么Android也提供了录制音频.视频的类MediaRecorder,接下来就是看看音频录制的过程. 二 音频录制 音频录制步骤如下: ...

  8. Android录制音频的三种方式

    对于录制音频,Android系统就都自带了一个小小的应用,可是使用起来可能不是特别的灵活.所以有提供了另外的俩种. 下边来介绍下这三种录制的方式; 1.通过Intent调用系统的录音器功能,然后在录制 ...

  9. ffmpeg命令录制windows音视频

    欢迎转载请注明出处:海漩涡 http://blog.csdn.net/tanhuifang520                 ffmpeg命令录制windows音视频 一.下载ffmpeg 存放在 ...

  10. 在 HTML5 中捕获音频和视频

    Capture Audio and Video in HTML5 机翻 原文:Capture Audio and Video in HTML5 - HTML5 Rocks 介绍 长期以来,捕获音频和视 ...

最新文章

  1. .NET (C#) Internals: ASP.NET 应用程序与页面生命周期——吴秦(Tyler)
  2. 获取VirtualBox COM对象失败,Unable to start the virtual device
  3. FreeRTOS高级篇7---FreeRTOS内存管理分析
  4. php 数组存入mysql_PHP将数组存入数据库中的四种方式
  5. 菜鸟教程python3 mysql_Python 操作 MySQL 数据库
  6. java单例模式之线程安全问题
  7. HTML5开源RPG游戏引擎lufylegendRPG 0.1发布
  8. vue项目实战环境的搭建 -- 项目创建及连接github(gitee同理)
  9. KNN 算法实现 Iris 数据集分类
  10. 成都信息工程大学2019级概率论c类试题
  11. android开发之路-----------转自任玉刚大神
  12. Translate插件的有道翻译
  13. 边缘计算(二)边缘计算与智能制造
  14. 数字信号处理——时域采样和频域采样(matlab)
  15. 干货!技术分享:如何写好一篇论文
  16. 常见路由器配置NAT/UPNP/DMZ方法
  17. java网页开发中的乱码问题解决(过滤器)
  18. 个人电脑网站的创建与发布
  19. 攻防演练-组织沙盘推演的4个阶段.
  20. 你后悔进入IT行业吗?IT行业到底如何?

热门文章

  1. Ubuntu18.04安装有道词典
  2. Word 标题前面的黑点
  3. HyperLPR车牌识别
  4. spss多元线性回归散点图_利用SPSS进行线性回归分析
  5. 多功能芯片——GSV2002
  6. 走进小作坊(八)----公益之痒
  7. ps画画模糊笔刷_Photoshop绘图工具之模糊/锐化/涂抹工具
  8. 5g网络模式是以什么划分的_5G组网的8种方式,有什么不同?各方式又怎么进行网络部署...
  9. xss(跨站脚本攻击)详解
  10. js 实现全国省市区三级联动