**
AudioTrack
**
AudioTrack 是 Android 音频系统中的核心类,用于播放原始音频数据(PCM)或压缩音频(如 MP3、AAC)。它提供了低级别的音频播放控制,适合需要精细管理的场景(如游戏音效、实时音频流、语音通话等)
AudioTrack 核心功能
|功能 | 说明 |
|–|–|
| PCM | 音频播放 支持 8/16/24/32-bit PCM 数据 |
|低延迟播放 | 适用于游戏、实时音频处理 |
|流式播放(Streaming)|适合网络音频流或长时间播放|
| 静态播放(Static) | 适合短音效(如按键声)|
|音量控制 | 独立调节左右声道音量 |
|音频会话管理|支持多路音频混合(如音乐+通知音)|
| 硬件加速 | 支持直接输出到音频设备(如 HDMI、USB DAC) |AudioTrack 使用
(1) MODE_STREAM(流模式)
适用场景:实时音频流(如网络音乐播放、语音通话)
特点:
数据分块写入(write())
适合长时间播放(内存占用低)
AudioTrack track = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(44100)
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
.build())
.setTransferMode(AudioTrack.MODE_STREAM)
.build();
track.play();
byte[] audioData = getAudioStream(); // 从网络或文件读取
track.write(audioData, 0, audioData.length); // 写入数据
(2) MODE_STATIC(静态模式)
适用场景:短音效(如游戏音效、提示音)
特点:
一次性写入所有数据(write() + play())
低延迟(适合快速触发音效)
short[] soundData = generateBeep(440, 0.5); // 生成 440Hz 0.5秒的蜂鸣声
AudioTrack track = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(48000)
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.build())
.setTransferMode(AudioTrack.MODE_STATIC)
.build();
track.write(soundData, 0, soundData.length);
track.play(); // 立即播放
- AudioTrack常用方法
play() 开始播放
pause() 暂停播放
stop() 停止播放(需重新调用 play())
write() 写入音频数据(MODE_STREAM 需循环调用)
setVolume() 设置音量(0.0 ~ 1.0)
getPlaybackHeadPosition() 获取当前播放位置(采样帧数)
setPlaybackPositionUpdateListener() 设置播放进度回调
获取buffer缓冲区:
int minBufferSize = AudioTrack.getMinBufferSize(
44100, // 采样率
AudioFormat.CHANNEL_OUT_STEREO, // 声道
AudioFormat.ENCODING_PCM_16BIT // 位深
);
常见配置
音乐播放 MODE_STREAM 大缓冲区 + USAGE_MEDIA
游戏音效 MODE_STATIC 低延迟 + USAGE_GAME
语音通话 MODE_STREAM FLAG_HW_AV_SYNC + 16kHz 采样率
实时音频处理 FLAG_LOW_LATENCY 浮点编码 + 高优先级线程AudioAttributes 和 AudioFormat 及模式
// 定义音频的主要用途,影响系统音频路由和优先级
setUsage(AudioAttributes.USAGE_ALARM) // 闹钟
setUsage(AudioAttributes.USAGE_MEDIA) // 媒体播放(默认)
setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) // 语音通话
setUsage(AudioAttributes.USAGE_NOTIFICATION) // 通知
setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE) // 导航语音
setUsage(AudioAttributes.USAGE_GAME) // 游戏音效
setUsage(AudioAttributes.USAGE_ASSISTANT) // 语音助手
// 描述音频内容的性质
setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) // 音乐(默认)
setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) // 语音
setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) // 系统声音
setContentType(AudioAttributes.CONTENT_TYPE_MOVIE) // 电影
setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN) // 未知类型
// 附加行为控制
setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED) // 绕过静音模式
setFlags(AudioAttributes.FLAG_HW_AV_SYNC) // 硬件音视频同步
setFlags(AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY) // 绕过勿扰模式
setFlags(AudioAttributes.FLAG_BYPASS_MUTE) // 绕过静音
setFlags(AudioAttributes.FLAG_LOW_LATENCY) // 低延迟模式(API 26+)
// 控制音频是否可被其他应用捕获
setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL) // 允许任何应用捕获
setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_SYSTEM) // 仅系统可捕获
setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_NONE) // 禁止所有捕获
场景配置:
音乐播放 USAGE_MEDIA + CONTENT_TYPE_MUSIC
语音通话 USAGE_VOICE_COMMUNICATION + CONTENT_TYPE_SPEECH
游戏音效 USAGE_GAME + FLAG_LOW_LATENCY
导航语音 USAGE_ASSISTANCE_NAVIGATION_GUIDANCE + CONTENT_TYPE_SPEECH
闹钟 USAGE_ALARM + FLAG_AUDIBILITY_ENFORCED
- AudioFormat 配置
// 常用编码格式
int ENCODING_PCM_8BIT = AudioFormat.ENCODING_PCM_8BIT; // 8位PCM
int ENCODING_PCM_16BIT = AudioFormat.ENCODING_PCM_16BIT; // 16位PCM(最常用)
int ENCODING_PCM_FLOAT = AudioFormat.ENCODING_PCM_FLOAT; // 32位浮点
int ENCODING_AC3 = AudioFormat.ENCODING_AC3; // Dolby Digital
int ENCODING_E_AC3 = AudioFormat.ENCODING_E_AC3; // Dolby Digital+
// 标准采样率(单位:Hz)
int SAMPLE_RATE_8000 = 8000; // 语音通信常用
int SAMPLE_RATE_16000 = 16000; // 语音识别常用
int SAMPLE_RATE_44100 = 44100; // CD音质
int SAMPLE_RATE_48000 = 48000; // 高清音频常用
// 输入声道配置
int CHANNEL_IN_MONO = AudioFormat.CHANNEL_IN_MONO; // 单声道输入
int CHANNEL_IN_STEREO = AudioFormat.CHANNEL_IN_STEREO; // 立体声输入
// 输出声道配置
int CHANNEL_OUT_MONO = AudioFormat.CHANNEL_OUT_MONO; // 单声道输出
int CHANNEL_OUT_STEREO = AudioFormat.CHANNEL_OUT_STEREO; // 立体声输出
int CHANNEL_OUT_5POINT1 = AudioFormat.CHANNEL_OUT_5POINT1; // 5.1环绕声
应用场景 推荐参数组合
语音通话 ENCODING_PCM_16BIT + 8kHz/16kHz + MONO
音乐播放 ENCODING_PCM_16BIT + 44.1kHz/48kHz + STEREO
游戏音效 ENCODING_PCM_FLOAT + 48kHz + STEREO (低延迟)
语音识别 ENCODING_PCM_16BIT + 16kHz + MONO
环绕声电影 ENCODING_AC3 + 48kHz + 5.1/7.1
- 模式
/**
* 音频数据从 Java 传输到本机层的创建模式,只能播放一次。
*/
public static final int MODE_STATIC = 0;
/**
* 音频数据从 Java 流式传输到native层的创建模式,实时播放音频。
*/
public static final int MODE_STREAM = 1;
AudioRecord
AudioRecord 是 Android 提供的用于录制原始音频(PCM)的核心类,适用于需要低级别音频采集的场景(如语音识别、实时音频处理、通话录音等)
- AudioRecord使用
// 1. 配置参数
int sampleRate = 16000; // 16kHz(语音常用)
int channelConfig = AudioFormat.CHANNEL_IN_MONO; // 单声道
int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // 16-bit PCM
int bufferSize = AudioRecord.getMinBufferSize(
sampleRate, channelConfig, audioFormat
);
// 2. 创建 AudioRecord
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC, // 音频源(麦克风)
sampleRate,
channelConfig,
audioFormat,
bufferSize
);
// 3. 检查初始化是否成功
if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
throw new RuntimeException("AudioRecord 初始化失败!");
}
// 4. 启动录制线程
new Thread(() -> {
byte[] audioBuffer = new byte[bufferSize];
audioRecord.startRecording();
while (isRecording) {
int bytesRead = audioRecord.read(audioBuffer, 0, bufferSize);
if (bytesRead > 0) {
processAudioData(audioBuffer, bytesRead); // 处理音频数据
}
}
// 停止并释放
audioRecord.stop();
audioRecord.release();
}).start();
AudioManager
AudioManager 是 Android 系统中用于管理音频设备、音量、焦点和策略的核心类,适用于控制音频播放行为、处理设备切换和系统交互。以下是其核心功能、使用方法和实际场景示例
- 功能
音量控制 调节不同音频流(音乐、通话、通知等)的音量
音频设备管理 监听和切换输出设备(扬声器、耳机、蓝牙等)
音频焦点管理 处理多应用同时播放的冲突(如电话打断音乐)
音频模式设置 设置通话、闹钟、媒体等场景的音频策略
音效控制 启用/禁用系统音效(如按键音、触摸反馈) - 使用实例
// 获取 AudioManager 实例
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// 获取最大音量和当前音量
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
// 设置媒体音量(范围:0 ~ maxVolume)
audioManager.setStreamVolume(
AudioManager.STREAM_MUSIC,
maxVolume / 2, // 目标音量
AudioManager.FLAG_SHOW_UI // 显示系统音量条
);
// 调节音量(增加/减少)
audioManager.adjustStreamVolume(
AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_RAISE, // 增加音量
AudioManager.FLAG_PLAY_SOUND // 播放调节音效
);
// 设备管理
// 获取所有连接的音频设备
AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
for (AudioDeviceInfo device : devices) {
Log.d("Device", "Type: " + device.getType()); // 如 TYPE_BLUETOOTH_A2DP
}
// 强制使用扬声器(即使耳机插入)
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(true);
// 切换到蓝牙设备
audioManager.startBluetoothSco();
audioManager.setBluetoothScoOn(true);
// 监听设备变化
audioManager.registerAudioDeviceCallback(new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
// 新设备连接(如插入耳机)
}
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// 设备断开(如拔出耳机)
}
}, null);
// 音频模式设置
audioManager.setMode(AudioManager.MODE_IN_CALL);
// 常用模式:
// - MODE_NORMAL(默认)
// - MODE_IN_CALL(通话中)
// - MODE_IN_COMMUNICATION(VoIP/视频通话)
// - MODE_RINGTONE(响铃中)