您的位置:首页 > 移动开发 > Android开发

Android:使用MediaRecorder录制音频

2016-09-18 15:01 302 查看

Android:使用MediaRecorder录制音频

标签(空格分隔): android no

陈小默(不足之处恳请批评指正)

Android使用MediaRecorder录制音频
实战演练

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()
}
}


李刚.疯狂安卓讲义.电子工业出版社.453-456
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android