android AudioTrack

AudioTrack 是一个音频播放器,这个类我们用很少,基本都是使用的是MediaPlayer 或者一些第三方的播放器,其实他们内部也都是调用的audioTrack,为什么不我们不直接使用audioTrack,首先是他支持播放的音频格式少,它只支持播放PCM编码格式的音频流,例如播放MP3格式就需要解码转换成PCM音频流,第三方的播放器就是做了音频的解码和转换。

andioTrack 支持两种模式 一种是static 模式 另一种是streaming音频流的形式
static 模式 可以直接加载到内在处理适合于内存的短声音时,应该选择static模式,并且需要以最小的延迟进行播放。因此,更适合于经常播放的UI和游戏声音,并且可能开销最小。
Streaming 模式 适合一些较大的音频文件,例如 音乐文件。streaming采用write()方式写入音频流,
AndioTrack构造方法

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)
构造方法传入的参数:
streamType 播放的音量流类型 ,例如 AudioManager.STREAM_MUSIC 、AudioManager.STREAM_ALARM
sampleRateInHz 音频采样率 取决音频播放的文件一般为44.1kHz 如果时44.1kHz 传入的参数就是44100 源码里支持的采样率4000 到 48000
channelConfig 音频文件通道 双声道 AudioFormat.CHANNEL_OUT_STEREO 或单声道CHANNEL_OUT_MONO
audioFormat 音频采样格式 AudioFormat.ENCODING_PCM_16BIT 或 AudioFormat.ENCODING_PCM_8BIT 默认的是 AudioFormat.ENCODING_PCM_16BIT
bufferSizeInBytes 获取最小buffer的大小
mode AudioTrack的模式 AudioTrack.MODE_STREAM 和AudioTrack.MODE_STATIC
sessionId 音频文件的 sessionId

audioTrack 常用方法:
audioTrack 对音频操作的具体实现都是在native方法中实现的。
Play();
开始播放
pause();
暂停播放
stop();
停止播放
release();
释放AudioTrack的Native资源,因为实际操作实在cpp代码中实现的,所以资源要手动释放。
setStereoVolume(float leftVolume, float rightVolume)
设置左右声道音量
write(short[] audioData, int offsetInShorts, int sizeInShorts)

write(byte[] audioData, int offsetInBytes, int sizeInBytes)

写入音频数据

setPlaybackRate(int sampleRateInHz)
设置采样率

由于AudioTrack是由Java和cpp实现的,以play()为例讲解一下他的实现过程。

/**
* Starts playing an AudioTrack.
* If track’s creation mode is {@link #MODE_STATIC}, you must have called write() prior.
*
* @throws IllegalStateException
*/
public void play()
throws IllegalStateException {
if (mState != STATE_INITIALIZED) {
throw new IllegalStateException(“play() called on uninitialized AudioTrack.”);
}

    synchronized(mPlayStateLock) {
        native_start();
        mPlayState = PLAYSTATE_PLAYING;
    }
}

播放时java 方法调用的时JNI的方法native_start();对应的cpp方法实现
android_media_AudioTrack_start(JNIEnv *env, jobject thiz)
{
sp lpTrack = getAudioTrack(env, thiz);
if (lpTrack == NULL) {
jniThrowException(env, “java/lang/IllegalStateException”,
“Unable to retrieve AudioTrack pointer for start()”);
return;
}

lpTrack->start();

}
audioTrack里面其他的方法的实现过程是类似的,就不再一一列举

猜你喜欢

转载自blog.csdn.net/songmingzhan/article/details/78869535