**
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() {@Overridepublic void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {// 新設備連接(如插入耳機)}@Overridepublic void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {// 設備斷開(如拔出耳機)}
}, null);
// 音頻模式設置
audioManager.setMode(AudioManager.MODE_IN_CALL);// 常用模式:
// - MODE_NORMAL(默認)
// - MODE_IN_CALL(通話中)
// - MODE_IN_COMMUNICATION(VoIP/視頻通話)
// - MODE_RINGTONE(響鈴中)