上一节已经学习记录了AudioRecord的相关定义以及pcm抓取和保存,这一节的主要目的是通过学习AudioTrack的相关知识,将保存的pcm数据播放出来。下面开始我们的学习之旅吧!
audiotrack基础定义
定义:AudioTrack类管理和播放java应用程序的单个音频资源。它允许将pcm音频缓冲器流式传输到音频接收器进行播放。这是通过“推”的数据使用的所述一个的AudioTrack对象write(byte[], int, int) , write(short[], int, int) ,和write(float[], int, int, int)方法。
AudioTrack实例可以在两种模式下运行:静态或者流式传输。
- static
静态的言下之意就是数据一次性交付给接收方。好处是简单高效,只需要进行一次操作就完成了数据的传递;缺点当然也很明显,对于数据量较大的音频回放,显然它是无法胜任的,因而通常只用于播放铃声、系统提醒等对内存小的操作 - streaming
流模式和网络上播放视频是类似的,数据是按照一定规律不断地传递给接收方的。应用程序使用write()方法之一将连续的数据流写入write()。当数据从java层传输到本地层并排队等待播放时,它们会阻塞并返回。理论上它可用于任何音频播放的场景,不过我们一般在以下情况下采用:
- 音频文件过大
- 音频属性要求高,比如采样率高、深度大的数据
- 音频数据是实时产生的,这种情况就只能用流模式了
这种方式的缺点就是总是在java层和native层交互,效率损失较大。
一旦创建,AudioTrack对象将初始化其中关联的音频缓冲区。在构建过程中指定的这个缓冲区大小决定了AudioTrack在耗尽数据之前可以播放多长时间。
对于static模式来说,此大小是可以从中播放的最大声音大小。
对于streaming,数据将以大小小于或者等于总缓冲区大小的块形式写入音频接收器。AudioTrack不是最终的,因此允许使用子类,但是不建议使用这种类型的子类
audiotrack API详解
- getMinBufferSize();
获取的缓冲区大小只是一个估计值,因为它既不考虑线路也不考虑汇(因为它们都不知道),所以此大小不能保证在负载下顺畅播放,并且应根据预期的频率选择较高的值,在此频率下缓冲区将被重新填充额外的数据播放。例如,如果您打算将AudioTrack的源采样率动态设置为比初始源采样率更高的值, 请确保根据最高计划采样率配置缓冲区大小。
/**
* 参数说明
* @param sampleRateInHz 采样率将取决于路线。 对于AudioTrack,它通常是信源采样率,对于AudioRecord它通常是源采样率。
* @param channelConfig //android支持双声道立体声和单声道。MONO单声道,STEREO立体声
* @param audioFormat 音频数据格式:每个采样PCM 16位。 保证被设备支持。
* @return 返回要在MODE_STREAM模式下创建的AudioTrack对象所需的估计最小缓冲区大小
*/
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) {
}
- 构造方法
//类构造函数。
AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode)
//具有音频会话的类构造函数。
AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode, int sessionId)
// 具有 AudioAttributes和 AudioFormat类构造 AudioFormat 。
AudioTrack(AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes, int mode, int sessionId)
第一个参数StreamType,这个参数和Android中的AudioManager有关系,涉及到手机上的音频管理策略。
Android将系统的声音分为以下几类常见的(未写全):
l STREAM_ALARM:警告声
l STREAM_MUSCI:音乐声,例如music等
l STREAM_RING:铃声
l STREAM_SYSTEM:系统声音
l STREAM_VOCIE_CALL:电话声音
AudioAttributes类说明:
用于封装描述有关音频流信息的属性集合,AudioAttributes取代了流类型的概念以定义音频播放的行为。 通过允许应用程序定义属性,属性允许应用程序指定比在流类型中传达的更多信息。
AudioFormat类简单说明:
AudioFormat类用于访问许多音频格式和通道配置常量,它们例如在AudioRecord和AudioTrack中用作构造函数的单个参数。AudioFormat常量也用于mediaformat中指定媒体中常用的音频相关值。
AudioFormat.Builder类可用于创建AudioFormat格式类的实例。
在这里我们描述AudioFormat类允许您在每种情况下传达的主要概念,它们是:
Sample rate
以Hz为AudioFormat表示, AudioFormat实例中的采样率表示您正在播放或录制的内容中每秒每个声道的音频采样数。 这不是内容呈现或制作的采样率。 例如,在采样速率为48000Hz的设备上可以播放8000Hz的媒体采样率的声音; 采样率转换由平台自动处理,不会以6倍速播放。
正如API的M ,采样率高达192kHz都支持AudioRecord和AudioT