@cxm-2016
2016-09-18T07:07:14.000000Z
字数 2179
阅读 3432
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()方法释放资源
--
接下来我们编写一个Demo当我们按下按钮时录音,手指松开时停止
我们创建一套布局
<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"/><Buttonandroid:id="@+id/rRecorder"android:text="按下按钮录制" /><TextViewandroid:text="0s"android:id="@+id/rTimer" /></RelativeLayout>
程序代码
class RecorderActivity : AppCompatActivity() {val directory: String = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).absolutePathval recorder = MediaRecorder()var isPause = truevar time = 0val 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 codecrecorder.setAudioSamplingRate(8000)recorder.setAudioEncodingBitRate(12200)}recorder.setOutputFile("$directory/${DateUtils.getTimeStamp()}.amr")recorder.prepare()}fun start() {if (isPause) {isPause = falserecorder.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()}}
