在之前的文章安卓实现录音/播放/暂停/继续的功能中介绍了通过MediaRecorder和MediaPlayer实现简单的录音和播放功能,但相比于安卓二次封装后的API,AudioRecord和AudioTrack更接近底层,可通过获取的PCM数据,进行二次的算法处理,实现更加接近需求的声音。

1. AudioRecord

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

AudioRecord的使用比较简单,获取音频缓冲区buffer后创建AudioRecord对象,buffer用来保存新的录像数据,该buffer是通过api获取的与设备硬件、设置的参数等相关,如果过大导致超过整个录像的数据,过小导致构造AudioRecord对象失败。
使用流程:

  1. 获取缓冲buffer,构建AudioRecord对象;
  2. 创建一个文件的输出流,用于存储buffer数据;
  3. 开始录像;
  4. 暂停/停止录音,释放资源。

下面结合代码分析流程

1. 获取缓冲buffer,构建AudioRecord对象对象;

 BufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE_HERTZ,CHANNEL_CONFIG, AUDIO_FORMAT);mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,SAMPLE_RATE_HERTZ, CHANNEL_CONFIG, AUDIO_FORMAT, BufferSize);

其中构建AudioRecord对象的对象参数意义如下:

  • audioSource:音频的输入源,包括DEFAULT、MIC、VOICE_x和CAMCORDER等
  • sampleRateInHz:音频采样率,是指1s内对音频信号的采样次数,采样率越高,声音的还原度越高,主流的采集卡的采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级。
  • channelConfig:声道数,包括单声道(CHANNEL_IN_MONO)和双声道(立体声)(CHANNEL_IN_STEREO),其中CHANNEL_IN_MONO一般是可以兼容其他设备能够使用的。
  • audioFormat:采样位数(量化精度),是指声卡处理声音的解析度,该值越大声音的还原越真实,常见的包括8bit、16bit和32bit,通俗理解为每帧采集的声音大小,类似视频的分辨率。
  • bufferSizeInBytes:通过以上三个参数,调用getMinBufferSize获取音频的缓存区数据。

除了上面介绍的几个概念外,还有一个常见的名称:比特率,又称码率,是指每秒传输的数据大小,单位为bps(Bit Per Second),该值越大,说明包括的音视频数据越多,音视频质量越好,基本的计算公式为:

基本的算法是:【码率】(kbps)=【文件大小】(字节)X8/【时间】(秒)× 1000

2. 创建一个文件的输出流,用于存储buffer数据;

FileOutputStream PcmFos = new FileOutputStream(new File(path));

3. 开始录像;

         //开始录制mAudioRecord.startRecording();//不断读取音频缓冲区的数据while (true == isRecord && !isInterrupted()) {int read = mAudioRecord.read(bytes, 0, bytes.length);//若读取数据没有出现错误,将数据写入文件if (AudioRecord.ERROR_INVALID_OPERATION != read) {PcmFos.write(bytes, 0, read);PcmFos.flush();}}

4. 暂停/停止录音,释放资源

 mAudioRecord.stop();//暂停录制,如果是单独调用该方法,表示暂停录制操作mAudioRecord.release();//停止录制PcmFos.close();//关流

在执行停止或暂停操作时,可通过getState()获取当前的运行状态。

2. AudioTrack

对于通过AudioRecord获取的音频数据是不经过编解码处理的数据,因此不能被常见的音频播放器播放,可通过AdobeAudition软件播放,同样安卓调用时需要通过AudioTrack播放,常见的MediaPlayer也无法正常播放,下面讲解一下AudioTrack的使用。
与AudioRecord类似,也需要先获取播放缓冲区,然后构建AudioTrack对象,主要流程如下:

  1. 获取缓冲buffer,构建AudioTrack对象;
  2. 读取pcm文件,调用AudioTrack的write开始播放;
  3. 暂停、停止或释放操作
    流程分析如下:

1. 获取缓冲buffer,构建AudioTrack对象;

 BufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE_HERTZ,AudioFormat.CHANNEL_OUT_STEREO, AUDIO_FORMAT);mAudioTrack = new AudioTrack.Builder().setAudioAttributes(new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build()).setAudioFormat(new AudioFormat.Builder().setEncoding(AUDIO_FORMAT).setSampleRate(SAMPLE_RATE_HERTZ).setChannelMask(AudioFormat.CHANNEL_OUT_STEREO).build()).setBufferSizeInBytes(BufferSize).setTransferMode(AudioTrack.MODE_STREAM).build();

这里需要注意以下几点:

  • 调用getMinBufferSize时,添加的三个参数要与AudioRecord设置的参数一致,否则无法正常播放;
  • 获取AudioTrack通过Builder的方式,设置Attributes和Format两种属性,其中Format同样需要与AudioRecord的设置一致,也可以直接通过new的方式构建对象;
  • 通过setTransferMode设置播放方式,包括 MODE_STATIC 或者 MODE_STREAM,其中 MODE_STATIC是预先将播放的数据读取到缓冲区buffer中,然后开始播放,因此需要先调用write方法,然后调用play方法,适用于播放铃声等短小的声音,MODE_STREAM是边读边播的方式,也是默认的方式,由于需要边读边播,因此会有一定的延时。

2. 读取pcm文件,调用AudioTrack的write开始播放

 FileInputStream fis = new FileInputStream(autoFile);mAudioTrack.play();byte[] bytes = new byte[BufferSize];while (true == isRecord) {int read = fis.read(bytes);//若读取有错则跳过if (AudioTrack.ERROR_INVALID_OPERATION == read|| AudioTrack.ERROR_BAD_VALUE == read) {continue;}if (read != 0 && read != -1) {mAudioTrack.write(bytes, 0, BufferSize);} else {isRecord = false;}

获取到音频的pcm文件后,开始根据buffer的大小读取文件数据,写入到AudioTrack进行播放,该过程可通过添加状态变量isRecord 来循环遍历读取播放。

3. 暂停、停止或释放操作

mAudioTrack.pause();//暂停
mAudioTrack.stop();//停止
mAudioTrack.release();//释放资源
fis.close();//关流
//状态获取
int state = mAudioTrack.getState();

3. PCM转WAV

PCM(Pulse Code Modulation—-脉码调制录音)。所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的影响效果。也就是说,PCM就是没有压缩的编码方式,PCM文件就是采用PCM这种没有压缩的编码方式编码的音频数据文件。
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几!

PCM是一种直接记录数字信号(0或1)的无损压缩方式,而WAV是通过在PCM的基础上增加其特有的头文件形成的一种音频格式。其添加方法可参考河北-宝哥。

4. 常见的录音和播放比较

API 优点 缺点
AudioRecord 获取最底层的音频数据,使用更加灵活,可针对获取的音频数据进行处理,例如压缩、网传或算法处理 常见的播放器无法正常播放,数据量较大
MediaRecorder android在AudioRecord基础上二次封装的API,便于应用层的开发,使用简单方便,适用于常见的音频播放器 无法实施音频处理
AudioTrack 可播放延迟要求低,无须解码的pcm数据 无法播放需要解码的音频文件
MediaPlayer 可播放需要解码的常见音频文件,例如MP3、AAC和WAV等数据 资源占用较高,需要解码处理,延时较高

本文涉及的demo链接

参考链接:
1、https://www.jianshu.com/p/1f78c4211ab7?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
2、https://blog.csdn.net/haovip123/article/details/52356024

安卓音视频基础:AudioRecord和AudioTrack的简单使用相关推荐

  1. 【Android FFMPEG 开发】音视频基础 和 FFMPEG 编译 ( 音视频基础 | MPEG-4 标准 | Android 开发环境 | FFMPEG 交叉编译 | 安卓项目导入配置 )

    本篇博客代码及资源下载 : https://download.csdn.net/download/han1202012/10382762 文章目录 一. 音视频基础 1. 音频基础 (1) 声音要素 ...

  2. 安卓音视频入门难,老司机分享音视频开发学习技巧与痛点

    最近在写文章的时候,发现很多读者给我私信提问,想了解安卓音视频这块, 很多同学也对音视频开发有点浓厚的兴趣,但奈何没有系统的学习知识,仅靠自己苦苦钻研确实力不从心,今天就借这个机会分享一下我学习音视频 ...

  3. 安卓音视频整理(一)——音频模块

    这是关于安卓音视频的一个系列文章,大家可以从这里随意跳跃: 0.安卓音视频整理 1.安卓音视频整理(一)-- 音频模块 2.安卓音视频整理(二)-- 音视频编解码 3.安卓音视频整理(三)-- 图像模 ...

  4. 音视频基础(1)音视频处理流程

    文章目录 音视频基础(1)音视频处理流程 1. 概要 2. 音频处理流程 3. 视频处理流程 4. 直播客户端处理流程 5. 音频数据流转 音视频基础(1)音视频处理流程 理解音频处理流程对我们做音视 ...

  5. 《音视频开发进阶指南》读书笔记(一) —— 音视频基础概念

    前言 最近要学音视频,在图书馆借到这本<音视频开发进阶指南>,读了一段时间觉得挺好就在某宝买了. 以后一段时间应该都会沉浸在研究音视频中,开个专题记录哈每一章的读书笔记吧(以iOS开发的角 ...

  6. Android车载应用开发与分析(6)- 车载多媒体(一)- 音视频基础知识与MediaPlayer

    多媒体应用是车载信息娱乐系统的一个重要组成部分,一般包含音视频播放.收音机.相册等.车载应用多媒体系列初步计划分为六篇,这是第一篇. 参考资料 视频和视频帧:视频和帧基础知识整理 百度百科 - 声道 ...

  7. ffmpeg音视频基础知识

    ffmpeg音视频基础知识 前言 一.图像的基础知识 二.视频编码基础知识 1.视频和图片之间的关系 2.为什么要编码? 3.什么是编码? 视频相关专业术语 提示:文章写完后,目录可以自动生成,如何生 ...

  8. Android音视频之AudioRecord录音(一)

    Android音视频之AudioRecord录音(一) 在音视频开发中,录音当然是必不可少的.首先我们要学会单独的录音功能,当然这里说的录音是指用AudioRecord来录音,读取录音原始数据,读到的 ...

  9. 【音视频基础】视频基础理论

    [音视频基础]视频基础理论 图像基本概念 图像 屏幕 图像码流如何计算? 分辨率 帧率 码流计算 图像显示 YUV YUV格式 RGB与YUV的转换 YUV存储 YUV查看工具 参考资料 个人简介

最新文章

  1. 接受返回值 server sql_SQL,何必在忆之一(基础篇)
  2. Develop Smartphone Device use VS.NET 2003
  3. 前端CSS基础7.8
  4. spring-bean依赖注入-03
  5. 配置hibernate_测试Hibernate的最低配置
  6. [openjudge] 2797最短前缀 Trie
  7. EM算法【图像迭代】
  8. 软件portable
  9. java用什么软件_Java编程什么软件最好用?
  10. 酒店管理系统需求获取分析——G001-186-17
  11. java启动tomcat9闪退
  12. zktime 协议_ZKtime5.0考勤软件说明书
  13. 墨画子卿第三章第8节:第三元素
  14. 教你简单3步搞定——微信快速添加个人表情包
  15. 被知网侵权长达13年!小说作家:一周前才知道
  16. Dubbo源码解析-——服务引用
  17. 集群节点启动报错 BEA-000386
  18. 字符串指针和指向字符串的指针变量
  19. 佳能MG3600系列打印机如何更换连接WiFi
  20. vagrants流浪者物品掉落表全道具合成及打怪取得点

热门文章

  1. 1.6 Photoshop网格的使用 [Ps教程]
  2. 网络ghost83企业版+U盘克隆操作实例教程
  3. vs 警告当前源代码跟内置的版本不一致解决办法
  4. java怎样获得JVM可能的总内存,最大内存,以及空暇内存?
  5. 嵌入式C语言自我修养 (11):有一种函数,叫内建函数
  6. 生命在于折腾,突然有了想折腾黑苹果的冲动,么有安装成功,果然浪费时间,又补了一些奇怪的知识
  7. 太强了,这款开源日历工具库堪称神器!
  8. mysql查询所有男生信息_MySQL 数据查询
  9. 电脑管理员密码忘记了,如何解决
  10. 遗传算法与进化策略的对比