Android音频系统AudioTrack使用方法详解

发布时间 - 2026-01-11 02:31:10    点击率:

今天,简单讲讲AudioTrack的使用方法。

1、Android AudioTrack简介

在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是有很大区别的,MediaPlayer可以播放多种格式的声音文件,例如MP3,AAC,WAV,OGG,MIDI等。而AudioTrack只能播放PCM数据流。

事实上,两种本质上是没啥区别的,MediaPlayer在播放音频时,在framework层还是会创建AudioTrack,把解码后的PCM数流传递给AudioTrack,最后由AudioFlinger进行混音,传递音频给硬件播放出来。利用AudioTrack播放只是跳过Mediaplayer的解码部分而已。Mediaplayer的解码核心部分是基于OpenCORE 来实现的,支持通用的音视频和图像格式,codec使用的是OpenMAX接口来进行扩展。因此使用audiotrack播放mp3文件的话,要自己加入一个音频解码器,如libmad。否则只能播放PCM数据,如大多数WAV格式的音频文件。

如果是实时的音频数据,那么只能用AudioTrack进行播放。

2、如何使用AudioTrack进行音频播放

//根据采样率,采样精度,单双声道来得到frame的大小。  
int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K个点  
  AudioFormat.CHANNEL_CONFIGURATION_STEREO,//双声道 
  AudioFormat.ENCODING_PCM_16BIT);//一个采样点16比特-2个字节 
 
//注意,按照数字音频的知识,这个算出来的是一秒钟buffer的大小。 
//创建AudioTrack 
 
AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
  AudioFormat.CHANNEL_CONFIGURATION_ STEREO, 
  AudioFormat.ENCODING_PCM_16BIT, 
  bufsize, 
 
AudioTrack.MODE_STREAM);// 
trackplayer.play() ;//开始 
trackplayer.write(bytes_pkg, 0, bytes_pkg.length) ;//往track中写数据 
 
…. 
 
trackplayer.stop();//停止播放  
trackplayer.release();//释放底层资源。 

这里需要解释下两个东西:

1.AudioTrack.MODE_STREAM:

AudioTrack中有MODE_STATIC和MODE_STREAM两种分类。STREAM的意思是由用户在应用程序通过write方式把数据一次一次得写到audiotrack中。这个和我们在socket中发送数据一样,应用层从某个地方获取数据,例如通过编解码得到PCM数据,然后write到audiotrack。

这种方式的坏处就是总是在JAVA层和Native层交互,效率损失较大。

而STATIC的意思是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接传给audiotrack,后续就不用一次次得write了。AudioTrack会自己播放这个buffer中的数据。

这种方法对于铃声等内存占用较小,延时要求较高的声音来说很适用。

2.StreamType

这个在构造AudioTrack的第一个参数中使用。这个参数和Android中的AudioManager有关系,涉及到手机上的音频管理策略。
Android将系统的声音分为以下几类常见的(未写全):

 STREAM_ALARM:警告声
 STREAM_MUSCI:音乐声,例如music等
 STREAM_RING:铃声
 STREAM_SYSTEM:系统声音
 STREAM_VOCIE_CALL:电话声音

为什么要分这么多呢?以前在台式机上开发的时候很少知道有这么多的声音类型,不过仔细思考下,发现这样做是有道理的。例如你在听music的时候接到电话,这个时候music播放肯定会停止,此时你只能听到电话,如果你调节音量的话,这个调节肯定只对电话起作用。当电话打完了,再回到music,你肯定不用再调节音量了。

其实系统将这几种声音的数据分开管理,所以,这个参数对AudioTrack来说,它的含义就是告诉系统,我现在想使用的是哪种类型的声音,这样系统就可以对应管理他们了。

代码里首先获取最小的分配内存,然后创建AudioTrack,最后通过mAudioTrack.write(data, offset, length);将音频数据进行播放。

android音频系统之AudioTrack的使用就讲完了。

就这么简单。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 音频系统  # AudioTrack  # Android使用AudioRecord实现录音功能  # Android WebRTC 对 AudioRecord 的使用技术分享  # Android用AudioRecord进行录音  # Android利用AudioRecord类实现音频录制程序  # Android使用AudioRecord实现暂停录音功能实例代码  # Android audio音频流数据异常问题解决分析  # 两种  # 的是  # 是有  # 机上  # 如果你  # 是在  # 第一个  # 我现在  # 是由  # 这么多  # 你在  # 可以用  # 中有  # 较高  # 就把  # 这样做  # 几种  # 这个时候  # 写到  # 较小 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  如何用景安虚拟主机手机版绑定域名建站?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel Fortify是什么,和Jetstream有什么关系  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  如何快速查询域名建站关键信息?  Android使用GridView实现日历的简单功能  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  如何在阿里云虚拟主机上快速搭建个人网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Python并发异常传播_错误处理解析【教程】  Laravel如何处理异常和错误?(Handler示例)  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  详解Huffman编码算法之Java实现  JavaScript如何实现类型判断_typeof和instanceof有什么区别  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何在云主机上快速搭建多站点网站?  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel如何记录自定义日志?(Log频道配置)  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  详解Oracle修改字段类型方法总结  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何快速上传自定义模板至建站之星?  进行网站优化必须要坚持的四大原则  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Python制作简易注册登录系统  SQL查询语句优化的实用方法总结  Laravel怎么使用artisan命令缓存配置和视图  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  使用C语言编写圣诞表白程序  重庆市网站制作公司,重庆招聘网站哪个好?  网站页面设计需要考虑到这些问题  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何在Ubuntu系统下快速搭建WordPress个人网站?  Swift中循环语句中的转移语句 break 和 continue  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何在自有机房高效搭建专业网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  详解jQuery中基本的动画方法  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  大型企业网站制作流程,做网站需要注册公司吗?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康