简介: CSDN博客专家、《Android系统多媒体进阶实战》作者
博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列【原创干货持续更新中...... 】🚀
Android多媒体专栏地址:多媒体系统工程师系列【原创干货持续更新中...... 】🚀
推荐1:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
推荐2:Android14 Binder之HIDL与AIDL通信实战课 🚀
推荐3:Android15快速自定义与集成音效实战课 🚀
推荐4:Android15音频策略实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
更多原创,欢迎关注:Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉
-
-
- [🌻1. 前言](#🌻1. 前言)
- [🌻2. Android16进阶之设置播放速率AudioTrack.setPlaybackRate介绍](#🌻2. Android16进阶之设置播放速率AudioTrack.setPlaybackRate介绍)
- [🌻3. 代码实例](#🌻3. 代码实例)
-
- [🌻3.1 完整流程:音乐慢放0.8x](#🌻3.1 完整流程:音乐慢放0.8x)
- [🌻3.2 完整流程:语言学习1.2x快放](#🌻3.2 完整流程:语言学习1.2x快放)
- [🌻3.3 完整流程:DJ打碟实时变速](#🌻3.3 完整流程:DJ打碟实时变速)
- [🌻3.4 用法总结](#🌻3.4 用法总结)
-
🌻1. 前言
本篇目的:Android16进阶之设置播放速率AudioTrack.setPlaybackRate:用法实例
🌻2. Android16进阶之设置播放速率AudioTrack.setPlaybackRate介绍
-
基本概念
setPlaybackRate通过AudioTrack动态改变音频输出采样率,实现变速不变调或变调不变速效果,用于快进、慢放、DJ打碟、语言学习等场景。
-
功能
支持0.5x-2.0x速率;与原始采样率联动;无需重启播放;与音高、时间拉伸独立;无需权限;立即生效。
-
使用限制
需在play()后调用;范围受硬件限制;与缓冲区大小联动;变速模式需配合时间拉伸算法;部分ROM限制范围。
-
性能特性
内存位立即更新;延迟低于10毫秒;无JNI阻塞;与硬件时钟同步;内存恒定。
-
使用场景
音乐慢放、语言学习、DJ打碟、视频同步。
🌻3. 代码实例
🌻3.1 完整流程:音乐慢放0.8x
java
AudioTrack track = new AudioTrack.Builder()
.setAudioFormat(new AudioFormat.Builder()
.setSampleRate(44100)
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.build())
.setBufferSizeInBytes(65536)
.build();
track.play();
track.setPlaybackRate((int)(44100 * 0.8f));
track.write(pcmData, 0, pcmData.length);
代码功能:将44.1 kHz速率降至35.28 kHz输出,实现0.8倍慢放。
🌻3.2 完整流程:语言学习1.2x快放
java
AudioTrack voice = new AudioTrack.Builder()
.setAudioFormat(new AudioFormat.Builder()
.setSampleRate(16000)
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.build())
.setBufferSizeInBytes(3200)
.build();
voice.play();
voice.setPlaybackRate((int)(16000 * 1.2f));
voice.write(voiceBuf, 0, voiceBuf.length);
代码功能:16 kHz升高至19.2 kHz,语音快放1.2倍,节省时间。
🌻3.3 完整流程:DJ打碟实时变速
java
AudioTrack djTrack = new AudioTrack.Builder()
.setAudioFormat(new AudioFormat.Builder()
.setSampleRate(48000)
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
.setEncoding(AudioFormat.ENCODING_PCM_FLOAT)
.build())
.setBufferSizeInBytes(4096)
.build();
djTrack.play();
// 触摸滑动实时变速 0.5-2.0
float rate = 0.5f + (seek.getProgress() / 100f) * 1.5f;
djTrack.setPlaybackRate((int)(48000 * rate));
djTrack.write(floatPcm, 0, floatPcm.length);
代码功能:滑动条实时改变速率,实现DJ搓碟效果。
🌻3.4 用法总结
| 代码关键字 | 功能描述 | 典型应用 |
|---|---|---|
| setPlaybackRate 44100*0.8 | 速率减慢 | 音乐慢放 |
| setPlaybackRate 16000*1.2 | 速率加快 | 语言快放 |
| setPlaybackRate 48000*rate | 实时变速 | DJ打碟 |