Android:使用MediaRecorder录制音频

Android:使用MediaRecorder录制音频

标签(空格分隔): android no
陈小默(不足之处恳请批评指正)


MediaRecorder类是Android提供的用来录制音频的组件,其使用步骤基本如下1:

  • 创建MediaRecorder对象
  • 调用MediaRecorder对象的setAudioSource()方法来设置声音来源,一般传入MediaRecorder.AudioSource.MIC参数来指定录制来自麦克风的声音
  • 调用MediaRecorder对象的setOutputFormat()设置录制音频的格式
  • 调用MediaRecorder对象的setAudioEncoder()、setAudioEncodingBitRate(int bitRate)、setAudioSamplingRate(int samplingRate)设置所录声音的编码格式、编码位率、采样率等等,这些参数可以控制录制声音的品质。
  • 调用MediaRecorder的setOutputFile(String path)方法设置录制的音频文件的保存位置。
  • 调用MediaRecorder的prepare()方法准备录制
  • 调用MediaRecorder的start()方法开始录制
  • 调用MediaRecorder的stop()方法停止录制,并在结束后使用release()方法释放资源

实战演练

我们创建一套布局

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

    <Button
        android:id="@+id/rRecorder"
        android:text="按下按钮录制" />

    <TextView
        android:text="0s"
        android:id="@+id/rTimer" />
</RelativeLayout>

程序代码

class RecorderActivity : AppCompatActivity() {
    val directory: String = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).absolutePath
    val recorder = MediaRecorder()
    var isPause = true
    var time = 0
    val loop: ThreadUtils.Loop = ThreadUtils.Loop(1000).loop {
        if (!isPause) {
            rTimer.text = "${time++}"
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_recoder)

        rRecorder.setOnTouchListener { view, motionEvent ->
            when (motionEvent.action) {
                MotionEvent.ACTION_DOWN -> {
                    start()
                }
                MotionEvent.ACTION_UP -> {
                    pause()
                }
            }
            true
        }

        recorder.setAudioSource(MediaRecorder.AudioSource.MIC)
        recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB)
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB)
        if (Build.VERSION.SDK_INT >= 10) {
            recorder.setAudioSamplingRate(44100)
            recorder.setAudioEncodingBitRate(96000)
        } else {
            // older version of Android, use crappy sounding voice codec
            recorder.setAudioSamplingRate(8000)
            recorder.setAudioEncodingBitRate(12200)
        }
        recorder.setOutputFile("$directory/${DateUtils.getTimeStamp()}.amr")
        recorder.prepare()
    }

    fun start() {
        if (isPause) {
            isPause = false
            recorder.start()
            loop.start()
        }
    }

    fun pause() {
        if (!isPause) {
            isPause = true
            //recorder.pause() API 24
        }
    }

    fun stop() {
        loop.destroy()
        recorder.stop()
        recorder.release()
    }

    override fun onDestroy() {
        stop()
        super.onDestroy()
    }
}

  1. 李刚.疯狂安卓讲义.电子工业出版社.453-456
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值