Android MediaRecorder 实现录音

一丶MediaRecorder 简介

Android 多媒体框架支持捕获和编码各种常见的音频和视频格式。
官网介绍:MediaRecorder 概览

二丶实现录音

AndroidManifest.xml

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
<?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">

    <Button
        android:id="@+id/btn_sound_record"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="开始录音"/>

</RelativeLayout>
public class MainActivity extends AppCompatActivity {
    private boolean isStart = false;    //开关
    private MediaRecorder mr = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.btn_sound_record);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!isStart){
                    startRecord();
                    button.setText("停止录制");
                    isStart = true;
                }else{
                    stopRecord();
                    button.setText("开始录制");
                    isStart = false;
                }
            }
        });
    }

    //开始录制
    private void startRecord(){
        if (mr == null){
            /**
             * public File(File parent, String child)
             * 根据父目录路径File实例和子目录或文件路径创建一个新File实例
             * 参数一:父目录路径。Environment.getExternalStorageDirectory() 这行代码直接获取的是 Android设备里外部存储的路径,如/sdcard 和 /storage/emulated/legacy/
             * 参数二:子目录或文件路径
             */
            File dir = new File(Environment.getExternalStorageDirectory(),"sounds");

            if (!dir.exists()){ //如果这个目录不存在
                dir.mkdirs();   //那就创建这个目录
            }
            File soundFile = new File(dir,System.currentTimeMillis()+".amr");   //跟上面一样,得到录音文件的File实例
            if (!soundFile.exists()){           //如果文件不存在
                try {
                    soundFile.createNewFile();  //创建这个文件
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            mr = new MediaRecorder();   //获取MediaRecorder实例
            mr.setAudioSource(MediaRecorder.AudioSource.MIC);       //设置音频输入源
            mr.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);  //设置输出格式
            mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);  //设置编码格式
            //public String getAbsolutePath() 获取文件的绝对路径
            mr.setOutputFile(soundFile.getAbsolutePath());          //设置要生成的输出文件的路径
            try {
                mr.prepare();   //完成初始化
                mr.start(); //启动录音
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    //停止录制,资源释放
    private void stopRecord(){
        if (mr != null){
            mr.stop();  //停止录音
            mr.release();   //释放
            mr = null;
        }
    }
}

三丶MediaMuxer 录制多个声道

从 Android 8.0(API 级别 26)开始,您可以使用 MediaMuxer 来录制多个同步的音频和视频串流。在更低版本的 Android 中,您一次只能录制一个音轨和/或一个视频轨道。

使用 addTrack() 方法可以将多个轨道混录在一起。

您还可以为每个帧添加一个或多个带有自定义信息的元数据轨道,但只能添加到 MP4 容器中。您的应用将定义元数据的格式和内容。

本文的重点主要是介绍 MediaRecorder 实现录音,以后有需要再学习 MediaMuxer,这里先引出这个新知识点!

四丶总结

通过这一节,我们了解了 MediaRecorder,以及用它来实现了录音。还复习了File的一些知识点,其每个方法的含义我们都在对应代码块做了详细的说明,好了,那本节先到这里,有疑问可以加我主页QQ,VX。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值