用于记录学习音视频知识中,关于音频的初级知识,本次只涉及PCM相关,不涉及编解码
AudioRecord:Android提供用于实现录音功能。得到数据为PCM数据。
//构造函数
public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig,
int audioFormat, int bufferSizeInBytes)
public int SAMPLE_RATE = 16000; //采样率 8K或16K
public int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO; //音频通道(单声道)
public int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; //音频格式,采样大小
public int AUDIO_SOURCE = MediaRecorder.AudioSource.DEFAULT; //音频源(麦克风)
//录制涉及到的方法有两个,如下:1.开始录制;2.读取到数据
mAudioRecord.startRecording();
mAudioRecord.read(data, 0, buffSize);
具体使用为:
SAMPLE_RATE * 20 / 1000 * (AudioFormat.ENCODING_PCM_16BIT == AUDIO_FORMAT ? 16 : 8) / 8;
byte[] data = new byte[buffSize];\\上面计算出的size
dataLen = mAudioRecord.read(data, 0, buffSize);
read返回的是int,如果==0就sleep(2)后continue,如果>0就存放到一个队列中 pcmBuffer.enqueue(data, dataLen);
(自定义一个QueueArray,注意线程安全)
byte[] tmp = pcmBuffer.dequeue(buffSize);
此时就拿到了PCM数据,可以交给编码器进行对应的编码。(这里只总结PCM数据的获取,关于编码器放后)
mAudioRecord.stop();
还有清除pcmBuffer,并且修改isStarted状态,同时remove上面的task。if (mAudioRecord != null) {
mAudioRecord.release();
mAudioRecord = null;
}
isStarted = false;
Android中可以使用AudioTrack播放PCM。但是关于数据有两种加载模式:
//初始化
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, AudioRate, AudioOutChannel, AudioFormater, playBufferMinSize, AudioTrack.MODE_STREAM);
mAudioTrack.play();
mInputStream = new FileInputStream(mFile);
while (mInputStream.available() > 0) {
int readSize = mInputStream.read(bufferbytes);
mAudioTrack.write(bufferbytes, 0, readSize);
}
mAudioTrack.stop();