我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android使用MediaRecorder类进行录制视频

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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(320, 280);
        // 设置该组件不会让屏幕自动关闭
        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(2);
//设置最大录像时间 单位:毫秒
recorder.setMaxDuration(600000);
//设置最大录制的大小 单位,字节
recorder.setMaxFileSize(1024*1024);
//音频一秒钟包含多少数据位
recorder.setAudioEncodingBitRate(128);
//设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
recorder.setOrientationHint(90);
//设置录像的分辨率
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);
   }
   
   public void btnStartRecord(View view) {
     // 首先判断当前是否处理视频录制状态,只有不是录制状态的时候,才可以开始录制
     if (!isRunning){
       try {
         //创建MediaRecorder对象
         recorder = new MediaRecorder();
         recorder.reset();
         //.设置采集声音
         recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
         //设置采集图像
         recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
         //.设置视频,音频的输出格式
         recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_);
         //.设置音频的编码格式
         recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
         //设置图像的编码格式
         recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H);
         //设置立体声
         recorder.setAudioChannels();
         //设置最大录像时间 单位:毫秒
         recorder.setMaxDuration();
         //设置最大录制的大小 单位,字节
         recorder.setMaxFileSize(*);
         //音频一秒钟包含多少数据位
         recorder.setAudioEncodingBitRate();
         //设置选择角度,顺时针方向,因为默认是逆向度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
         recorder.setOrientationHint();
         //设置输出文件路径
 //        saveFile = FileUtils.getMediaRecoderFolder(this);
         saveFile = new File(Environment.getExternalStorageDirectory()
             .getCanonicalFile() + "/myvideo.mp");
 //    recorder.setVideoSize(, );
 //    recorder.setVideoFrameRate();
         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();
       }
     }
   }
   
   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) {
   }
 }

本例子只是一个简单的Demo,用于给刚接触MediaRecorder音频录制的coder学习,存在一些Bug和不足,各位coder可以继续拓展

不足:

1、只有当点击“开始录制”的时候SurfaceView组件才可以看到摄像头拍摄的预览,否则是一篇黑,这里可以看下Canera类,进行相应的调整

2、保存路径,需要判断是否有外部存储,存储空间是否足够,路径是否不存在,是否有已有的文件名相同的文件存在等问题,设置文件的名字,我这里是固定路径固定文件名

3、摄像预览效果是有90度旋转的,这里需要大家个人去看下MedioRecoder的API 去进行设置

4、没有设置对焦,像素不清楚,摄像宽高变形

您可能感兴趣的文章:Android仿微信录制小视频Android 录制手机屏幕视频生成GIF图片实例详解Android自定义录制视频功能Android 微信小视频录制功能实现详细介绍解决Android MediaRecorder录制视频过短问题汇总Android视频录制中常见问题Android实现拍照和录制视频功能


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android使用MediaRecorder类进行录制视频

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android使用MediaRecorder类进行录制视频

编程网提醒大家使用MediaRecorder录音录像的设置代码步骤一定要按照API指定的顺序来设置,否则报错 步骤为: 1、设置视频源,音频源,即输入源 2、设置输出格式 3、设置音视频的编码格式 一、首先看布局文件,这里有一个Surfac
2022-06-06

Android MediaRecorder录制视频

Android MediaRecorder录制视频MediaRecorder介绍主要方法编码格式以及输出格式编码格式输出格式生命周期简要实验步骤(自做)核心代码 今天是自己课程知识的小share吧,喜欢的话给个大大的
2022-06-06

解决Android MediaRecorder录制视频过短问题

具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩。 错误信息:java.lang.RuntimeException: stop failed.at android
2022-06-06

Android使用AudioRecord录制PCM音频、PCM转AAC、使用MediaRecorder直接录制AAC编码音频

Android为我们提供了两个音频处理的API:AudioRecord和MediaRecorder AudioRecord:偏底层的api MediaRecorder:对AudioRecord进行包装的api 一、使用AudioRecord
2022-06-06

怎么在Linux中使用Asciinema进行视频录制

本篇内容主要讲解“怎么在Linux中使用Asciinema进行视频录制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Linux中使用Asciinema进行视频录制”吧!简介Asciinem
2023-06-16

Android中用MediaRecorder进行录影的实例代码

MediaRecorder进行录影和录音没什么差别 ,就多了一个设置图像的格式 参考://www.jb51.net/article/46182.htm 实例: 代码如下:
2022-06-06

Android简单的利用MediaRecorder进行录音的实例代码

代码如下:package com.ppmeet; import java.io.IOException; import android.app.Activity; import android.graphics.PixelFormat
2022-06-06

怎么使用Python控制摄像头录制视频

本文小编为大家详细介绍“怎么使用Python控制摄像头录制视频”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Python控制摄像头录制视频”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果:用Pytho
2023-06-29

怎么使用FFmpeg进行视频格式转换

小编给大家分享一下怎么使用FFmpeg进行视频格式转换,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Fmpeg 是领先的多媒体框架,能够解码、编码、转码、混合、解
2023-06-28

android应用中怎么对视频进行加密与解密

本篇文章为大家展示了android应用中怎么对视频进行加密与解密,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MainActivity.java/** * 视频加密/解密 * * @author
2023-05-31

怎么在python中使用moviepy对视频进行处理

本篇文章为大家展示了怎么在python中使用moviepy对视频进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研
2023-06-08

python中Pyqt5怎么使用Qlabel标签进行视频播放

本文小编为大家详细介绍“python中Pyqt5怎么使用Qlabel标签进行视频播放”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中Pyqt5怎么使用Qlabel标签进行视频播放”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
2023-06-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录