一丶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。