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<bufferReadResult;i++){
dos.writeShort(buffer[i]);
}
publishProgress(new Integer(r));
r++;//自增进度值
Log.d(TAG,"recoding "+r+",isRecording:"+isRecording);
}
//结束录制
record.stop();
dos.close();
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 {
}
参考链接:
githubdemo:
https://github.com/feifei-123/MyExampleCode
网友评论