一、音频录制AudioRecord
AudioRecord录制的输出格式为PCM,这种格式不能直接播放,但是Android原生也提供了AudioTrack,这使得我们可以在软件内部实现录制播放功能。
int frequency = 48000;//采样率
int channelConfig = AudioFormat.CHANNEL_IN_MONO;//声道配置
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;//音频格式
以上是AudioRecord的参数配置。
File audioFile;
//开始录制
void record() throws IOException {
//如果文件已存在则删除
if (audioFile.exists()) audioFile.delete();
audioFile.createNewFile();
FileOutputStream fos = new FileOutputStream(audioFile);//字节输出流
BufferedOutputStream bos = new BufferedOutputStream(fos);//字节缓冲输出流
DataOutputStream dos = new DataOutputStream(bos);
//计算最小缓冲区
int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfig, audioFormat);
short[] buffer = new short[bufferSize];
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
judgeNeedRequestMicPermission();
return;
}
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfig, audioFormat, bufferSize);
//开始录制
audioRecord.startRecording();
recording = true;
new Thread(new Runnable() {
@Override
public void run() {
while(recording){
System.out.println(recording);
int bufferRead = audioRecord.read(buffer, 0, bufferSize);
for(int i=0; i<bufferRead; i++){
try {
dos.writeShort(buffer[i]);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
System.out.println(audioFile);
audioRecord.stop();
audioRecord.release();
try {
dos.close();
bos.close();
fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}).start();
}
recording为false时结束录制,可以自定义一个按钮修改。
二、音频播放AudioTrack
AudioTrack的配置与AudioRecord基本一致,唯一要注意的是把声道配置改成 AudioFormat.CHANNEL_OUT_MONO。
void play(int frq) throws IOException{
int length = (int)audioFile.length()/2;
if(!audioFile.exists() || length==0) {
Toast.makeText(getBaseContext(), "音频文件不存在或为空", Toast.LENGTH_SHORT).show();
return;
}
short[] data = new short[length];
FileInputStream fis = new FileInputStream(audioFile);
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
int i=0;
while(dis.available()>0) {
data[i] = dis.readShort();
i++;
}
dis.close();
bis.close();
fis.close();
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frq, AudioFormat.CHANNEL_OUT_MONO, audioFormat, length*2, AudioTrack.MODE_STREAM);
audioTrack.play();
audioTrack.write(data, 0, length);
audioTrack.stop();
//audioTrack.release(); // 不能马上release,因为write后是异步播放,此时还刚开始播放,release就不播放了
}
总结
其实也没什么好总结的,本文展示的只是基本用法,AudioRecord能实现很多强大的功能,比如边录边播、语音通话等。以上内容只是对大佬们的拙劣模仿罢了,如果各位有什么其他见解,欢迎在评论区探讨。
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题