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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…