
Android 音频开发——AudioTrack播放
源代码路径:
发布日期:2021-05-10 11:31:01
浏览次数:11
分类:精选文章
本文共 2108 字,大约阅读时间需要 7 分钟。
AudioTrack类用来管理、播放单个音频资源,它只能播放PCM数据,其他音频格式(aac、amr、opus、flac等)需要经过解码成PCM才能使用。
运行模式
AudioTrack可以运行两种模式:
- 流模式
- 静态模式
流模式
可以将连续的数据流写入AudioTrack,进行播放。播放音频数据块时,这种模式最有用。 如:- 声音持续的时间太长,无法容纳在内存中;
- 由于音频数据的特性(太大的采样率,每个采样的比特数…)而太大而无法容纳在内存中;
- 在播放先前排队的音频时收到或生成的声音。
静态模式
当处理很短的音频并且需要以最小延迟播放时,应该选择静态模式。对于经常播放的UI和游戏声音而言,静态模式将是首选方式,并且可能会产生最小的开销。缓冲区
当创建AudioTrack时,AudioTrack将初始化其关联的音频缓冲区。在构造期间指定的此缓冲区大小决定了AudioTrack在数据用尽之前可以播放多长时间。
对于静态模式,此大小是可以从中播放的最大音频数据大小。 对于流模式,数据将以小于等于此缓冲区大小的块的形式写入音频接收器。AudioTrack播放
这里主要说一下AudioTrack的流模式使用。
基本步骤- 获取最小缓冲区大小(创建AudioTrack对象所需);
- 创建AudioTrack对象;
- 调用AudioTrack play方法,开始播放。
- 写入音频数据;
- 停止播放
- 释放对象。
1 获取最小缓冲区大小
int minSize = AudioTrack.getMinBufferSize(sampleRate, outChannelConfig, AudioFormat.ENCODING_PCM_16BIT);
sampleRate:采样频率
outChannelConfig:声道配置,CHANNEL_OUT_MONO、CHANNEL_OUT_STEREO。 audioFormat:音频编码,AudioFormat.ENCODING_PCM_16BIT、ENCODING_PCM_8BIT.2 初始化
AudioTrack构造器已经过时,推荐使用AudioTrack.Builder进行创建AudioTrack对象。
mTrack = new AudioTrack.Builder() .setAudioAttributes(new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build()) .setAudioFormat(new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(sampleRate) .setChannelMask(outChannelConfig) .build()) .setBufferSizeInBytes(minSize) .build();
创建AudioTrack对象,同时设置采样率、声道数、音频格式,缓冲区大小。
3 开始播放
调用play前,可以先向缓冲区写入音频数据。也可以后写。
mTrack.play();
如果不限调用write,或者write数量不足,则调用play处于欠载状态,这种情况下不会播放。只有后续将数据写入,播放才会真正开始播放。
4 写入数据
mTrack.write(audioData.data, 0, size);
将音频数据写入音频接收器以进行播放。
该方法默认情况是阻塞模式,直到所有数据都排入队列进行播放为止,并且将返回完整的传输计数。 但是,如果轨道在进入时停止或暂停,或者另一个线程通过调用停止或暂停来中断写入,或者在写入过程中发生I / O错误,则写入可能会返回较短的传输计数。- WRITE_BLOCKING:阻塞模式,写入将被阻塞,直到所有数据都已写入音频接收器为止。
- WRITE_NON_BLOCKING:非阻塞模式,在排队尽可能多的音频数据以进行播放而不会阻塞,写入将立即返回。
5 停止
调用以下两种方法都可以停止播放,并且都可以恢复播放,停止时机略有不同。
1 停止播放音频数据,调用此方法后,音频将在播放了最后写入的缓冲区后停止播放。mTrack.stop();
2 暂停音频数据的播放。 未播放的数据将不会被丢弃。 随后调用play将播放此数据。
mTrack.pause();
6 释放内存
释放本地AudioRecord资源。
调用release()之后,将无法再使用该对象,并且应将引用设置为null。mTrack.release();mTrack=null;
demo:一边录制WAV,一边播放音频

欢迎大家关注、评论、点赞、打赏。
你们的支持是我坚持的动力。Thank you!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月06日 22时01分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux 激活网卡ifconfig eth1 up 和 ifup eth1 之间的差别
2021-05-10
In App Purchase Verification using PHP
2021-05-10
shell编程===》进程锁
2021-05-10
Linux小操作LVM
2021-05-10
Split返回数组元素含有空字符串移除
2021-05-10
解决VS中C语言运行scanf错误
2021-05-10
Java注解
2021-05-10
idea上的程序报错-> 错误: 找不到或无法加载主类
2021-05-10
java刷题--49字母异位词分组
2021-05-10
《web安全入门》(四)前端开发基础Javascript
2021-05-10
laravel中视图模板的表单提交
2021-05-10
在Ubuntu上检查一个软件包是否安装命令
2021-05-10
mysql的group by ,order by语句的使用
2021-05-10
call_user_func函数和call_user_func_array函数
2021-05-10
配置php.ini文件,关闭错误提示,打开错误日志,设置错误日志路径
2021-05-10
接收get或post数据使用fwrite写入文件中,方便追踪错误;或其他几种缓存方式
2021-05-10
mysql开启慢查询日志及查询
2021-05-10
Window平台Grpc框架搭建
2021-05-10
C中几道位运算的例题
2021-05-10
python入门(二)基础知识
2021-05-10