Android音视频笔记(一)音频录制

本文详细介绍了如何在Android中使用AudioRecord进行音频录制,以及AudioTrack进行播放,包括参数配置、文件操作和权限管理。同时提到了AudioRecord的强大功能如边录边播。作者还强调了成为高级开发者所需的技能扩展和职业规划的重要性。
摘要由CSDN通过智能技术生成

一、音频录制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开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
图片

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值