Android中的多媒体开发(四)——使用MediaRecord录音

    在MediaRecord中我们会用到很多方法,下面我简单的总结一下:

 

方法名称

 

描述

 

public void setAudioEncoder (int audio_encoder)

 

设置刻录的音频编码,其值可以通过MediaRecoder内部类的MediaRecorder.AudioEncoder的几个常量:AAC、AMR_NB、AMR_WB、DEFAULT

 

public void setAudioEncodingBitRate (int  bitRate)

 

设置音频编码比特率

 

public void setAudioSource (int audio_source)

 

设置音频的来源,其值可以通过MediaRecoder内部类的MediaRecorder.AudioSource的几个常量来设置,通常设置的值MIC:来源于麦克风

 

 

 

public void setCamera (Camera c)

 

设置摄像头用于来刻录

 

public void setOutputFormat (int output_format)

 

设置输出文件的格式,其值可以通过MediaRecoder内部类MediaRecorder.OutputFormat的一些常量字段来设置。比如一些3gp(THREE_GPP)、mp4(MPEG4)等等

 

setOutputFile(String path)

 

设置输出文件的路径

 

setVideoEncoder(int video_encoder)

 

设置视频的编码格式。其值可以通过MediaRecoder内部类的MediaRecorder.VideoEncoder的几个常量:H263、H264、MPEG_4_SP

 

setVideoSource(int video_source)

 

设置刻录视频来源。其值可以通过MediaRecorder的内部类MediaRecorder.VideoSource来设置。比如可以设置刻录视频来源为摄像头:CAMERA

 

setVideoEncodingBitRate(int bitRate)

 

设置编码的比特率

 

setVideoSize(int  width, int height)

 

设置视频的大尺寸

 

public  void start()

 

开始刻录

 

public  void prepare()

 

预期做准备

 

public  void stop()

 

停止

 

public  void release()

 

释放该对象资源

 

在这里创建目录出现了一点问题,在此记录下来,以便使用:

mkdir()

只能在已经存在的目录中创建文件夹。

mkdirs()

可以在不存在的目录中创建文件夹(可以创建多级目录)。

public boolean mkdirs()

创建一个目录,它的路径名由当前File对象指定,包括任一必须的父路径。

返回值:

如果该目录(或多级目录)能被创建则为true,否则为false;

public boolean mkdir()

创建一个目录,它的路径名由当前File对象指定。

返回值:

如果该目录能被创建则为true,否则为false;

 

代码实现:

 

private Button btn_control;
private Boolean isStart = false;//默认初始化为未开始。
private MediaRecorder mediaRecorder = null;//默认初始化录音为空。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_control = (Button)findViewById(R.id.btn_start);
    btn_control.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            if (!isStart){
                startRecord();
                btn_control.setText("停止录制");
                isStart = true;
            }else{
                stopRecord();
                btn_control.setText("开始录制");
                isStart = false;
            }
        }
    });
}
//开始录制
private void startRecord(){
    if (mediaRecorder == null){//判断为空,开始录制
        File dir = new File(Environment.getExternalStorageDirectory(),"sound");
        if (!dir.exists()){//如果不存在,进行创建
            dir.mkdirs();
        }
        File soundFile = new File(dir,System.currentTimeMillis()+ ".amr");
        if (!soundFile.exists()){
            try {
                soundFile.createNewFile();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        mediaRecorder = new MediaRecorder();//初始实例化。
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//音频输入源
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);//设置输出格式
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);//设置编码格式
        mediaRecorder.setOutputFile(soundFile.getAbsolutePath());//设置输出文件的路径
        try {
            mediaRecorder.prepare();//准备录制
            mediaRecorder.start();//开始录制
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
//停止录制
private void stopRecord(){
    if (mediaRecorder != null){//判断非空,停止录制
        mediaRecorder.stop();
        mediaRecorder.release();
        mediaRecorder = null;
    }
}

这里我们涉及到了危险权限,因此一定要注意权限问题,一般情况下我们只需要添加这两个权限声明就可以解决了

 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

但是博主在添加这两个权限后还是报错,这是怎么回事呢?安卓6.0以上系统需要动态获取权限,具体解决办法如下:

 

if (Build.VERSION.SDK_INT >= 23) {
int REQUEST_CODE_CONTACT = 101;
String[] permissions = {Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
//验证是否许可权限
for (String str : permissions) {
if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
//申请权限
this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
return;
}
}
}

涉及摄像头等问题建议在真机上进行测试。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
AndroidMediaRecord类可以用来录制音频,包括通过蓝牙设备进行录音。 要使用蓝牙设备录音,首先需要确保设备已经正确配对并连接了蓝牙耳机或扬声器。可以使用BluetoothAdapter类来管理蓝牙连接,以及使用BluetoothDevice类来获取已配对的蓝牙设备。 在开始录音之前,需要先创建一个MediaRecord对象,并设置音频的采样率、编码格式、音频源等参数。可以使用setAudioSource()方法来指定音频源为蓝牙耳机,例如MediaRecorder.AudioSource.MIC。 然后,使用setOutputFile()方法指定音频文件的保存路径和格式。可以使用getFileDescriptor()方法将蓝牙耳机连接的文件描述符作为录音文件的输出。 接下来,需要调用prepare()方法进行准备工作,并使用start()方法开始录音录音过程,可以使用stop()方法停止录音,并使用release()方法释放MediaRecord对象。 在录音完成后,可以使用MediaPlayer类来播放录音文件,或者使用其他处理方式对录音进行编辑和处理。 需要注意的是,蓝牙耳机的音质和录音效果可能会受到设备和耳机本身的限制,因此可能会在使用过程遇到问题。在录音过程,可以使用onErrorListener来处理录音出错的情况,并给出相应的提示。 总体而言,使用AndroidMediaRecord类进行蓝牙录音是很方便的。只需注意正确设置参数和处理录音异常的情况,就可以顺利实现蓝牙录音功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值