AudioRecorder 录制pcm音频

AudioRecorder 录制pcm数据

1、定义 实例化一个AudioRecord类我们需要传入几种参数

  • AudioSource:这里可以是MediaRecorder.AudioSource.MIC
  • SampleRateInHz:录制频率,可以为8000hz或者11025hz等,不同的硬件设备这个值不同
  • ChannelConfig:录制通道,可以为AudioFormat.CHANNEL_CONFIGURATION_MONO和AudioFormat.CHANNEL_CONFIGURATION_STEREO
  • AudioFormat:录制编码格式,可以为AudioFormat.ENCODING_16BIT和8BIT,其中16BIT的仿真性比8BIT好,但是需要消耗更多的电量和存储空间
  • BufferSize:录制缓冲大小:可以通过getMinBufferSize来获取
  • 这样我们就可以实例化一个AudioRecord对象了

private int frequence = 8000; //录制频率,单位hz.这里的值注意了,写的不好,可能实例化AudioRecord对象的时候,会出错。我开始写成11025就不行。这取决于硬件设备
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

2、 实例化一个AudioRecord实例

 //根据定义好的几个配置,来获取合适的缓冲大小
                int bufferSize = AudioRecord.getMinBufferSize(frequence,channelConfig,audioEncoding);

                //实力化audioRecord
                AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.MIC,frequence,channelConfig,audioEncoding,bufferSize);

                 //定义缓冲
                short[]buffer = new short[bufferSize];

                //开始录制
                record.startRecording();

3、创建一个文件,用于保存录制的内容 。然后打开一个输出流,指向创建的文件


 String fileStr = folder+fName;
        audioFile = new File(fileStr);
        if(!audioFile.getParentFile().exists()){
            audioFile.getParentFile().mkdirs();
        }
        try {
            if(audioFile.exists()){
                audioFile.delete();
            }
            audioFile.createNewFile();
            boolean ex = audioFile.exists();
            Log.d(TAG,audioFile.getAbsolutePath()+" exist:"+ex);

        }catch (Exception e){
            e.printStackTrace();
        }
        
  //开通输入流 到指定的文件
                DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(audioFile)));

4、现在就可以开始录制了,我们需要创建一个字节数组来存储从AudioRecorder中返回的音频数据。 然后一个循环,调用AudioRecord的read方法实现读取

但是 注意,我们定义的数组要小于定义AudioRecord时指定的那个BufferSize

int r = 0;//存储录制进度
                while (isRecording){
                    //从bufferSize 中读取字节,返回读取的short个数
                    int bufferReadResult = record.read(buffer,0,buffer.length);
                    for(int i = 0;i

AudioTrack播放pcm数据

AudioTrack类允许我们播放原始的音频数据

1、实例化一个AudioTrack同样要传入几个参数

  • StreamType:在AudioManager中有几个常量,其中一个是STREAM_MUSIC;
  • SampleRateInHz:最好和AudioRecord使用的是同一个值
  • ChannelConfig:同上
  • AudioFormat:同上
  • BufferSize:通过AudioTrack的静态方法getMinBufferSize来获取
  • Mode:可以是AudioTrack.MODE_STREAM和MODE_STATIC,关于这两种不同之处,可以查阅文档

2、打开一个输入流,指向刚刚录制内容保存的文件,然后开始播放,边读取边播放

isPlaying = true;
            Log.d(TAG,"audioPlayer doInBackground");
            int bufferSize = AudioTrack.getMinBufferSize(frequence,channelConfig,audioEncoding);
            short[]buffer = new short[bufferSize/4];
            try{
                DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(audioFile)));

                //创建audioTrack track
                AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,frequence,channelConfig,audioEncoding,bufferSize,AudioTrack.MODE_STREAM);
                track.play();
                //由于AudioTrack播放的是流,所以,我们需要一边播放一边读取
                while (isPlaying && dis.available() >0){
                    int i = 0;
                    while (dis.available() > 0 && i < buffer.length){
                        buffer[i] = dis.readShort();
                        i++;
                    }
                    track.write(buffer,0,buffer.length);
                    Log.d(TAG,"audioPlayer while:");
                }

                track.stop();
                dis.close();

            }catch (Exception e){
                e.printStackTrace();
            }finally {

            }

参考链接:

  • https://blog.csdn.net/chenjie19891104/article/details/6333553

  • https://www.jianshu.com/p/993b41bd4a2b

githubdemo:
https://github.com/feifei-123/MyExampleCode

你可能感兴趣的:(AudioRecorder 录制pcm音频)