Android 音视频开发 一 AudioRecord录音生成p

2018-07-28  本文已影响119人  CHSmile

官方说明

  1. AndioRecord大概说明:

AndioRecord类的主要功能是让各种JAVA应用能够管理音频资源,以便它们通过此类能够录制声音相关的硬件所收集的声音。此功能的实现就是通过”pulling”(读取)AudioRecord对象的声音数据来完成的。在录音过程中,应用所需要做的就是通过后面三个类方法中的一个去及时地获取AudioRecord对象的录音数据. AudioRecord类提供的三个获取声音数据的方法分别是read(byte[], int, int), read(short[], int, int), read(ByteBuffer, int).无论选择使用那一个方法都必须事先设定方便用户的声音数据的存储格式。

开始录音的时候,AudioRecord需要初始化一个相关联的声音buffer, 这个buffer主要是用来保存新的声音数据。这个buffer的大小,我们可以在对象构造期间去指定。它表明一个AudioRecord对象还没有被读取(同步)声音数据前能录多长的音(即一次可以录制的声音容量)。声音数据从音频硬件中被读出,数据大小不超过整个录音数据的大小(可以分多次读出),即每次读取初始化buffer容量的数据

2.AudioRecord对象创建

AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

3.PCM 和 WAV文件

4.代码运行过程

首先是创建AudioRecord对象

//音频输入-麦克风
private final static int AUDIO_INPUT = MediaRecorder.AudioSource.MIC;
//采用频率
//44100是目前的标准,但是某些设备仍然支持22050,16000,11025
//采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级
private final static int AUDIO_SAMPLE_RATE = 16000;
//声道 单声道
private final static int AUDIO_CHANNEL = AudioFormat.CHANNEL_IN_MONO;
//编码
private final static int AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
// 缓冲区字节大小
private int bufferSizeInBytes = 0;

//录音对象
private AudioRecord audioRecord;
/**
 * 创建默认的录音对象
 *
 * @param fileName 文件名
 */
public void createDefaultAudio(String fileName) {
    // 获得缓冲区字节大小
    bufferSizeInBytes = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_RATE,
            AUDIO_CHANNEL, AUDIO_ENCODING);
    audioRecord = new AudioRecord(AUDIO_INPUT, AUDIO_SAMPLE_RATE, AUDIO_CHANNEL, AUDIO_ENCODING, bufferSizeInBytes);
    this.fileName = fileName;
    status = Status.STATUS_READY;
}

开始录音,同时开个子线程将录音的数据放入pcm文件

audioRecord.startRecording();

    new Thread(new Runnable() {
        @Override
        public void run() {
            writeDataTOFile(listener);
        }
    }).start();

如何将音频写入文件是重点,首先创建pcm文件,得到他的FileOutputStream,然后不断循环AudioRecord通过read将录音的数据放入字节数组里,当录音结束的时候要记得停止这个循环

// new一个byte数组用来存一些字节数据,大小为缓冲区大小
    byte[] audiodata = new byte[bufferSizeInBytes];

    FileOutputStream fos = null;
    int readsize = 0;
    try {
        File file = new File(currentFileName);
        if (file.exists()) {
            file.delete();
        }
        fos = new FileOutputStream(file);// 建立一个可存取字节的文件
    } catch (IllegalStateException e) {
        Log.e("AudioRecorder", e.getMessage());
        throw new IllegalStateException(e.getMessage());
    } catch (FileNotFoundException e) {
        Log.e("AudioRecorder", e.getMessage());

    }
    while (true) {
        readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);
        if (AudioRecord.ERROR_INVALID_OPERATION != readsize && fos != null) {
            try {
                fos.write(audiodata);
            } catch (IOException e) {
                Log.e("AudioRecorder", e.getMessage());
            }
        }
    }

如何我们要实现能够暂停录音,只要AudioRecord.stop就行,然后当继续录音时在AudioRecord.start就好了,但是要另创建一个pcm记录,当录音结束时我们要将这些pcm一起转换为一个wav

上一篇 下一篇

猜你喜欢

热点阅读