AudioTrack使用

**

AudioTrack

**
AudioTrack 是 Android 音頻系統中的核心類,用于播放原始音頻數據(PCM)或壓縮音頻(如 MP3、AAC)。它提供了低級別的音頻播放控制,適合需要精細管理的場景(如游戲音效、實時音頻流、語音通話等)

  1. AudioTrack 核心功能
    |功能 | 說明 |
    |–|–|
    | PCM | 音頻播放 支持 8/16/24/32-bit PCM 數據 |
    |低延遲播放 | 適用于游戲、實時音頻處理 |
    |流式播放(Streaming)|適合網絡音頻流或長時間播放|
    | 靜態播放(Static) | 適合短音效(如按鍵聲)|
    |音量控制 | 獨立調節左右聲道音量 |
    |音頻會話管理|支持多路音頻混合(如音樂+通知音)|
    | 硬件加速 | 支持直接輸出到音頻設備(如 HDMI、USB DAC) |

  2. 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(); // 立即播放
  1. 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  // 位深
);
  1. 常見配置
    音樂播放 MODE_STREAM 大緩沖區 + USAGE_MEDIA
    游戲音效 MODE_STATIC 低延遲 + USAGE_GAME
    語音通話 MODE_STREAM FLAG_HW_AV_SYNC + 16kHz 采樣率
    實時音頻處理 FLAG_LOW_LATENCY 浮點編碼 + 高優先級線程

  2. 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

  1. 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

  1. 模式
/**
* 音頻數據從 Java 傳輸到本機層的創建模式,只能播放一次。
*/
public static final int MODE_STATIC = 0;/**
* 音頻數據從 Java 流式傳輸到native層的創建模式,實時播放音頻。
*/
public static final int MODE_STREAM = 1;

AudioRecord

AudioRecord 是 Android 提供的用于錄制原始音頻(PCM)的核心類,適用于需要低級別音頻采集的場景(如語音識別、實時音頻處理、通話錄音等)

  1. 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 系統中用于管理音頻設備、音量、焦點和策略的核心類,適用于控制音頻播放行為、處理設備切換和系統交互。以下是其核心功能、使用方法和實際場景示例

  1. 功能
    音量控制 調節不同音頻流(音樂、通話、通知等)的音量
    音頻設備管理 監聽和切換輸出設備(揚聲器、耳機、藍牙等)
    音頻焦點管理 處理多應用同時播放的沖突(如電話打斷音樂)
    音頻模式設置 設置通話、鬧鐘、媒體等場景的音頻策略
    音效控制 啟用/禁用系統音效(如按鍵音、觸摸反饋)
  2. 使用實例
// 獲取 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(響鈴中)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86935.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解密:MySQL 的常見存儲引擎

在數據庫領域,MySQL 作為一款廣受歡迎的關系型數據庫管理系統,提供了多種存儲引擎以滿足不同應用場景的需求。每種存儲引擎都有其獨特的特性、優勢和適用場景。本文將深入探討 MySQL 中幾種常見的存儲引擎,包括 InnoDB、MyISAM、MEMORY 和 AR…

qt和qtcreator版本關系

實例展示: 如圖所示的qtcreator是使用qt5.15安裝過程選擇勾選了qtcreator 14.0.2,安裝完成qtcreator版本信息: 安裝過程中選擇了這些構件kits,會自動識別到: 使用qt5.9.9另外安裝的kits,需要手動設置才能識…

2個任務同時提交到YARN后2個都卡住(CDH)

文章目錄 問題描述解決方案1、增加資源2、調整ApplicationMaster資源3、關閉YARN調度器的資源搶占4、不使用公平調度器 問題描述 在CDH集群上,同時提交2個任務到YARN后,2個任務都卡住 解決方案 1、增加資源 增加服務器的內存和CPU 2、調整Applicatio…

web3區塊鏈-ETH以太坊

一. 以太坊概述 以太坊(Ethereum)作為區塊鏈技術的代表性項目之一,自2015年發布以來,迅速成為全球區塊鏈行業的核心基礎設施。相比比特幣,以太坊不僅支持點對點的價值轉移,還引入了智能合約,使…

【智能協同云圖庫】智能協同云圖庫第二彈:用戶管理系統后端設計與接口開發

用戶管理系統 一、需求分析 對于用戶模塊,通常要具有下列功能: 二、方案設計 (一)庫表設計 實現用戶模塊的難度不大,在方案設計階段,我們需要確認以下內容: 庫表設計用戶登錄流程如何對用戶權限…

閑庭信步使用SV搭建圖像測試平臺:第十三課——談談SV的數據類型

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程…

前端進階之路-從傳統前端到VUE-JS(第一期-VUE-JS環境配置)(Node-JS環境配置)(Node-JS/npm換源)

經過前面的傳統前端開發學習后,我們接下來進行前端的VUE-JS框架學習(寫這篇文章的時候VUE-JS最新版是VUE3,所以默認為VUE3即可) 首先,我們要配置Node-JS環境,雖然我們還不學習Node-JS但是Node-JS可以快速配…

Requests源碼分析:面試考察角度梳理

簡單描述執行流程 ?? Q:能簡單描述一下發送一個requests.get(url)請求時,在requests庫內部的主要執行流程嗎?(從調用get方法到收到響應) 入口委托: get() 方法內部調用 requests.request(GET, url)。Session 接管: request() 方法會獲取或隱式創建一個 Session 對象,并…

航天VR賦能,無人機總測實驗艙開啟高效新篇?

(一)沉浸式培訓體驗? 在傳統的無人機培訓中,操作人員主要通過理論學習和簡單的模擬操作來掌握技能。但這種方式存在很大局限性,難以讓操作人員真正感受無人機在復雜環境下的運行狀態。而航天 VR 技術引入到 VR 無人機總測實驗艙后,徹底改變了…

Kotlin 函數與 Lambda 表達式

今天繼續分享Kotlin學習內容。 目標:掌握函數定義、調用、參數傳遞,以及 Lambda 表達式的基礎用法 1. 函數:Kotlin 的代碼模塊化工具 定義:函數是可重復調用的代碼塊,用于封裝邏輯。 語法: fun 函數名(參…

[mcp-servers] docs | AI客戶端-MCP服務器-AI 架構

鏈接:https://github.com/punkpeye/awesome-mcp-servers 服務器調用 相關專欄:實現Json-Rpc docs:精選MCP服務器資源列表 本專欄為精選 模型上下文協議(MCP)服務器的列表。 MCP 是一種標準協議語言,允許*…

1688商品發布API:自動化上架與信息同步

一、1688商品發布API的核心功能與技術架構 1.1 API功能全景 1688商品發布API是1688開放平臺的核心組件之一,支持商品信息的自動化發布、編輯、上下架及庫存同步。其核心功能包括: 商品信息管理:支持商品標題、描述、價格、庫存、SKU&#…

如何在x86_64 Linux上部署Android Cuttlefish模擬器運行環境

0 軟硬件環境 x86_64服務器Ubuntu20.04 LTS參考:Cuttlefish 虛擬 Android 設備參考: 筆記:搭建 Cuttlefish 運行環境可以下載編好的android-cuttlefish:android-cuttlefish.tar.gz 1 系統采用Ubuntu20.04 LTS 2 搭建cuttlefish…

機器學習9——決策樹

決策樹 Intro 歸納學習(Inductive Learning)的目標:從訓練數據中學習一般規則,應用于未見過的數據。 決策樹是一個樹形結構,其中: 每個分支節點表示一個屬性上的選擇(即決策條件)。…

CppCon 2017 學習:The Asynchronous C++ Parallel Programming Model

清晰理解 Amdahl’s Law(阿姆達爾定律),這是一條描述并行計算加速能力的核心定律。 定義公式: S 1 ( 1 ? P ) P N S \frac{1}{(1 - P) \frac{P}{N}} S(1?P)NP?1? S S S:加速比(Speedup&#xff09…

60頁PPT實戰方案 | 大數據決策分析平臺建設全流程路徑圖

目錄 一、什么是大數據決策分析平臺? 二、為什么要做大數據決策分析平臺建設? 1. 數據已經成為“資源”,但多數組織還停留在“信息孤島” 2. 管理復雜度上升,傳統報表跟不上業務節奏 3. 外部環境不確定性高,倒逼企…

芯谷科技--降壓型DC-DC轉換器D4005

在現代電子設備中,電源管理芯片的性能直接關系到設備的穩定性和效率。D4005以其高效、穩定的性能和廣泛的應用范圍,成為眾多工程師在設計電源方案時的優選。 產品簡介 D4005 是一款高效降壓型 DC-DC 轉換器,具備固定 400KHz 開關頻率&#…

【51單片機節日彩燈控制器設計】2022-6-11

緣由單片機節日彩燈控制器設計-編程語言-CSDN問答 #include "reg52.h" sbit k0P1^2; sbit k1P1^3; sbit k2P1^4; sbit k3P1^5; bit k0,kk0; void main() {unsigned char Xd0;unsigned int ys0; while(1){if(k00&&Xd0){kk0;kP31;while(k00);}if(k10&&…

PyEcharts教程(010):天貓訂單數據可視化項目

文章目錄 1、讀取數據2、數據處理3、重復值查看4、缺失值查看5、PyEcharts可視化5.1 各個省份的訂單量5.2 時間序列分析5.3 每天訂單量統計可視化6、數據下載1、讀取數據 1??讀取數據: import pandas as pd from pyecharts import options as opts from pyecharts.charts …

Redis 持久化之 AOF 策略

1. 什么是 AOF AOF 是 append only file,AOF 文件中記錄了每次的操作指令,在啟動 Redis 時,會將 AOF 文件中的數據讀取出來以恢復數據。 2. 開啟 AOF Redis 默認關閉 AOF,可以通過將 Redis 配置文件中的 appendonly 設置為 ye…