Android多媒体:AudioMixer

Android 中的混音器 AudioMixer 实现分析 Android 混音器 AudioMixer 实现分析。 阅读详情

AudioMixer


每一个MixerThread在创建的时候都会创建一个AudioMixer赋值给mAudioMixer,也会创建一个mOutputSink。一个AudioMixer有一个mState,一个mState有最多32个track_t。而track_t是由track赋值的,在这里:在MixerThread的prepareTracks_l,对每一个mActiveTracks里的track,mAudioMixer通过setBufferProvider设置track给track_t的BufferProvider,同样,mAudioMixer调用setParameter给track_t的一系列参数赋值,包括VOLUME0,VOLUME1,AUXLEVEL,FORMAT,CHANNEL_MASK,MIXER_CHANNEL_MASK,RESAMPLE,MIXER_FORMAT,AUX_BUFFER,MAIN_BUFFER。在设置MAIN_BUFFER时,根据mMixerBufferEnabled把mMixBuffer或mSinkBuffer赋值给t.mainBuffer。这样,在ProcessXXX函数中,调用bufferProvider->getNextBuffer(&t.buffer,pts)即track->getNextBuffer, 调用mServerProxy->obtainBuffer(&buf)来给输出参数buf赋值。在process_validate中,判断应该使用哪种重采样和混音。然后在process_XXX中,调用到trackXXX,其中track_t里的in不停的赋值给outTemp,而outTmp是按照理论上最大的音频采样精度(32位)和channel数设置的局部变量。然后ConvertMixerFormat将所有采样精度转化为float和16bit,再通过memcpy,ditherAndClamp等把outTemp赋值给out,out就是t1.mainBuffer其实就是mMixBuffer或mSinkBuffer。所以,从App到AT,再从AT到AF都是一个共享内存。而AudioMixer使用了一块新内存来mix数据,就是mMixBuffer。在PlaybackThread::threadLoop_write中,通过mNormalSink->write(mMixBuffer+ offset, count)写入Sink。Mixer没有单独的混音线程,它运行在MixerThread线程。

mNormalSink->write在不使用FastMixer的时候,使用hardware\qcom\audio\hal\audio_hw.c中的out_write进行实际的写入。在播放mp3的时候,这种写入是阻塞的,耗时20ms。后来调用pcm_write来写入,最终调到tinyAlsa的pcm_write_mmap或pcm_write_nmmap。

当需要重采样时,调用的函数一般是

1.  process

2.  process__genericResampling

3.  track__genericResample

4.  virtual void resample(int32_t* out, size_toutFrameCount,

           AudioBufferProvider* provider)

这个参数out其实是AudioMixer里面的outTemp,和别的需要或不需要重采样的track是叠加关系。

process__genericResampling里面,函数写的比较比较费解,但实际上就是:在所有enabled的track里,把mainBuffer相同的track分成组,就是e1,然后每组进行叠加,并最终复制到相同的mainBuffer里。里面用到了gcc的内嵌函数:

int __builtin_ffs (unsigned int x)

返回x的最后一位1的是从后向前第几位,比如7368(1110011001000)返回4。

int __builtin_clz(unsigned int x)

返回前导的0的个数。

int __builtin_ctz (unsigned int x)

返回后面的0个个数,和__builtin_clz相对。

int __builtin_popcount (unsigned int x)

返回二进制表示中1的个数。

int __builtin_parity (unsigned int x)

返回x的奇偶校验位,也就是x的1的个数模2的结果。

另外,也用到了CC_UNLIKELY

Android默认的Resampler都是软件实现的。系统根据所需Quality的不同来选择不同的resampler。在AudioMixer里面,每个track_t有一个Resampler,根据源采样率和目标采样率来确定不同的quality,从而创建不同的resampler。


Android AudioFlinger(五)—— 揭开AudioMixer面纱 这个函数首先使用while循环来遍历每一个track,然后通过 NEEDS_RESAMPLE、NEEDS_AUX、NEEDS_CHANNEL_1、NEEDS_MUTE等判断,最终得到resampling、all16BitsStereoNoResample、volumeRamp的值,然后基于这几个值来决定调用,mHook来指向哪一个函数。这里主要就是调用mHook,mHook是一个函数指针,他会根据不同的场景分别调用不同的函数。mHook初始化的时候指向的是process__nop。 阅读详情

相关推荐

深入Android音频处理:AudioMixer的重采样与格式转换机制详解

本文深入解析了Android音频框架中AudioMixer的核心机制,重点剖析了其处理多路异构音频流时的重采样与格式转换技术。文章详细介绍了Track内部的数据处理流水线,包括DownmixerBufferProvider和ReformatBufferProvider等关键组件的工作原理,并探讨了性能优化策略,为开发者优化音频应用性能提供了实践指导。

weixin_29207439的博客 198

android Audio(4)框架

ASLA -Advanced Sound Linu...

Jimmy的专栏 1455

android 音频数据在AudioFlinger中的处理(出入口)

AudioFlinger 是android 多媒体模块Audio模块的两大服务之一。音频相关的数据必须通过它来传递到底层,所以它就会有一个音频数据的处理过程。这里主要就是分析音频数据从编码器出来之后,怎么流向驱动的。 从audoFlinger的代码中很容易发现,数据写到驱动的处理是在函数 AudioFlinger::PlaybackThread::threadLoop_write()中。这个t

shisi的专栏 6303

Android Audio混音实践篇

Android Audio混音实践篇 简介 本篇文章主要介绍Android Audio模块的MixerThread混音业务如何实现的?建议在阅读这篇文章之间先阅读混音理论基础篇,并且在分析源码之前:头脑里构想一个大致的混音过程,多路音频AudioTrack叠加在一起进行混音,多路音频混音的是数据对象是pcm数据,它如何叠加,混音后的音量又是如何处理? 首先回忆一下单路AudioTrack的音频播放流程,如下: 应用层创建AudioTrack,并配置播放音频的模式mode、采样率、format以及usag

jackzhouyu的专栏 1万+

Android Audio基础——音频混合器介绍(十二)

在 Android 平台上,音频混合器 AudioMixer 主要用在 AudioFlinger 里,将多路音频源数据混音(包括音频叠加、音量控制、音频效果添加及处理声道等),以方便送进音频设备播放出来。位于 framework 的音频处理模库 libaudioprocessing(frameworks/av/media/libaudioprocessing)中。

小旭的专栏 1693

Android14音频进阶之<面试必知>:混音线程MixerThread、FastMixer、FastThread、AudioMixer到底什么关系(六十五)

本篇目的:Android14音频进阶:混音线程MixerThread、FastMixer、AudioMixer等到底什么关系?接第六十四篇AudioFlinger向HAL输出数据过程在音频面试中,有时会遇到这样的提问:MixerThread、FastMixer、AudioMixer、FastThread线程类之间是什么关系?有什么区别?以及什么情况会进行重采样工作?带着这些实际面试实际的问题,我们一起来拆解、学习它。

Android系统攻城狮 2972

android audiomixer,Android多媒体:AudioMixer

AudioMixer 每一个MixerThread在创建的时候都会创建一个AudioMixer赋值给mAudioMixer,也会创建一个mOutputSink。一个AudioMixer有一个mState,一个mState有最多32个track_t。而track_t是由track赋值的,在这里:在MixerThread的prepareTracks_l,对每一个mActiveTracks里的track...

weixin_33785596的博客 1045

Android14音频进阶:AudioFlinger究竟如何混音?(六十三)

本篇目的:Android14音频进阶:AudioFlinger如何mix音频数据生产者与消费者模型本篇继续分享:AudioFlinger服务端如何消费音频数据?在上一篇已经分享,AudioTrack通过AudioFlinger创建的匿名共享内存,通过AudioTrackClientProxy类向内存中写数据,那么在服务端如何消费呢?下面我们以MixerThread线程为例讲解。

Android系统攻城狮 1833

【Android多媒体(重采样与混频)】从playback流程分析AudioResampler,AudioMixer

文章大致内容介绍本文主要讲述播放音乐流程,AudioResampler是如何生效的 播放流程 AudioMixer分析 从MixerThread分析 播放流程在Android中间,如果使用硬解码OffloadThread是不会出现混频和重采样的,但是播放需要软解的音频,则会按需要重采样。 为了方便研究,这里修改软件配置文件,让primary compress_offload仅仅支持8000的采样率

Joymine的专栏 5933

AudioMixer,一个跨平台的音频混音器,支持android、ios、macos和windows。由WebRTC、FFMPEG和吉尼提供支持。.zip

一个跨平台的音频混音器,支持android、ios、macos和windows。由WebRTC、FFMPEG和吉尼提供支持。

ensp企业网综合实验(课程设计)

使用MSTP+VRRP技术实现负载均衡以及增加网络的可靠性;出口配置napt;所有用户均为自动获取IP地址;

qq_50829760的博客 1万+

【Android多媒体(重采样与混频)】重采样等基本概念

重采样和混频的概念关于音频采样,百度上面找到这样的解答: 频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要

Joymine的专栏 4509

FPGA数字下变频实战:用Vivado DDS IP核实现IQ采样与频率校正(附MATLAB仿真对比)

本文提供了一份基于Vivado DDS IP核实现FPGA数字下变频(DDC)的完整工程指南。详细阐述了IQ采样的原理、DDC链路构建、DDS频率校正的工程实现,并重点介绍了如何利用MATLAB搭建黄金参考模型进行全链路仿真与对比验证,分享了关键的调试技巧与性能优化建议。

t1u2v的博客 811

Android原生音频变调代码流程分析

会说话的Tom猫是一款非常经典的终端游戏,可爱的Tom猫可以发出不同音调的声音。 之前用过一个非常著名的开源库SoundTouch可以实现音频的变速变调功能,具体可参考: https://blog.youkuaiyun.com/wkw1125/article/details/63807128 Android作为当今移动终端的霸主,多媒体的变速变调自然是要支持的,想看一下它是怎么实现的。 接口定义在Medi...

Jverson2009的专栏 3137

STM32 USART高级功能全解析:IrDA、DMA、硬件流控与低功耗唤醒

USART是嵌入式系统中最基础的串行通信外设,其核心原理在于同步/异步时序控制与数据帧收发机制。现代MCU如STM32通过深度集成IrDA调制解调、DMA直传通道、RS232/RS485硬件流控及Stop模式唤醒等扩展能力,显著提升通信可靠性、吞吐效率与能效比。其中,IrDA SIR采用RZI编码实现抗干扰红外传输,DMA通过TXE/RXNE事件驱动实现零CPU干预的连续数据流,而硬件流控(RTS/CTS/DE)和低功耗唤醒(WUF+UESM)则分别保障工业现场鲁棒性与电池级超长待机。本文围绕STM32平台

weixin_28922227的博客 211

深入解析postcss-px-to-viewport-8-plugin:如何精准控制响应式转换范围

本文深入解析了postcss-px-to-viewport-8-plugin插件在响应式开发中的核心痛点——如何精准控制单位转换范围。针对插件默认全局转换的问题,文章提供了两种实战解决方案:通过编写巧妙的exclude正则表达式实现“曲线救国”,或直接修改插件源码补全include功能。同时,文章还分享了在Next.js、Vite等现代框架中的集成要点及常见问题排查方法,帮助开发者实现“外科手术式”的精准样式转换。

yoga7的博客 910

ANDROID音频系统散记之五:如何绕开多媒体音轨的重采样

转自:http://blog.youkuaiyun.com/azloong/article/details/24385321 两年前,Android智能手机的音质还广受诟病,那时不仅不能与专业影音设备相提并论,连48KHz采样率的声音都要强制成转换成44.1KHz输出,这种非线性重采样极大地损坏了音质,加剧互调失真。对于此的较完整分析见:http://www.soomal.com/doc/1010000

haima1998的专栏 1897

Blender关于GIS安装及使用天地图

Blender下载安装及GIS插件的安装及使用

Miss_SQ的博客 6971

Android音频混音器AudioMixer实战:从多路输入到设备输出的完整流程解析

本文深入解析Android音频混音器AudioMixer的完整工作流程,涵盖从多路音频输入配置、数据预处理、重采样到最终混合输出的核心技术。通过剖析源码架构与实战案例,详细阐述了Track管理、缓冲区设置、音频处理流水线及性能优化策略,为开发者解决音频延迟、卡顿等问题提供系统性指导。

vvv99的博客 501

2025年有道翻译网页版JS逆向实战:从抓包到AES解密,手把手教你搞定sign签名

本文详细解析2025年有道翻译网页版的JS逆向实战,从抓包分析到AES解密全流程。通过实战演示签名生成机制和AES-CBC解密技术,帮助开发者破解有道翻译的反爬系统,实现高效数据获取。重点涵盖动态密钥处理、错误重试机制及反反爬策略,为开发者提供完整的技术解决方案。

weixin_30379531的博客 505

基于YOLOv5/v8/v10的答题卡填涂识别与评分系统(附数据集+UI界面+完整代码)

在教育信息化的大背景下,传统的手工阅卷方式正在被智能化技术所取代。答题卡识别作为标准化考试的核心环节,其准确率和效率至关重要。本文将详细介绍如何利用YOLO系列目标检测算法(YOLOv5、YOLOv8、YOLOv10)构建一个答题卡填涂识别与评分系统。文章从数据集的制作与标注开始,逐步深入到模型的训练、评估与对比,最后基于PyQt5设计了一个用户友好的桌面端UI界面,实现了从图像输入到得分输出的全流程自动化。

YOLO 635

安卓音频audio框架系统学习必知必会的一些术语

功能 android.hardware.audio.pro 中的“pro”是指可预测的实时性能级别,而非目标用户。在 Android 中,ALSA 指的是内核音频框架和驱动程序,而不是用户模式类。就满足专业音频部分中所述 android.hardware.audio.pro 功能的要求而言,设备实现方案支持实时计算是一个必要但非充分的前提条件。不过,AudioFlinger 客户端可以是一个在 mediaserver 系统进程中运行的线程,例如,播放由 MediaPlayer 对象解码的媒体内容时。

learnframework的博客 1294

PCB Layout工程师核心能力与实战进阶指南

PCB Layout是电子硬件从原理图到物理实现的关键环节,本质是将电路逻辑转化为受电磁场、热力学与制造工艺约束的三维空间结构。其设计质量直接决定信号完整性(SI)、电源完整性(PI)和电磁兼容性(EMC)等核心性能指标。随着高速接口(如PCIe Gen5、USB3.2)、高密度封装(BGA微间距、HDI)及车规/工业级可靠性要求提升,Layout已从‘连线’演进为多目标协同优化的系统工程。掌握Altium Designer等EDA工具、理解叠层设计与DFM规则、具备SI/PI仿真意识,并能贯通芯片Data

weixin_42589700的博客 87

AudioMix

AudioMix

luyao3038的博客 1106

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android原生音量设置和计算

Android原生的音量调整都是调整软件音量,也就是对于解码后的pcm数据乘以一定的系数,范围0~1.0,常见的概念有: Track volume: 单个AudioTrack的音量,使用时只影响该AudioTrack的音量,不会对其他AudioTrack造成影响,播完之后也就结束。 接口为:status_t AudioTrack::setVolume(float left, float right);stream volume:设置某一stream的音量,这是系统中最常见的音量设置方式,通常都是设置..

和大伙儿去乘凉 3642

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 单元测试的好处与可能带来的麻烦
下一篇: Android多媒体:AudioTrack
我把葡萄酿成酒
博客等级 码龄12年 275粉丝 198原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值