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和吉尼提供支持。

TruckSim与Simulink联合仿真中的车轮转角精确控制策略

本文深入探讨了TruckSim与Simulink联合仿真中实现车轮转角精确控制的关键策略。针对多轴车辆路径跟踪时转角指令失灵的常见问题,核心在于正确配置TruckSim转向轴的外部输入模式(Advanced Settings),并确保仿真接口的稳定搭建。文章详细解析了从单轴到多轴协同转向的配置方法,并提供了提升MPC路径跟踪精度的实战技巧与调试经验。

weixin_29035147的博客 367

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

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

Joymine的专栏 4509

13-单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)

资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊【单片机,物联网,上位机】: 说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系! 说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。 说明3:学会以后,下面的代码可能会跟你一辈子! 说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程! 拷贝这两个文件到自己的工程 ..

杨奉武的博客 1281

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

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

Jverson2009的专栏 3137

YOLOv11火焰识别:从环境搭建到GUI部署的完整工程实践

目标检测是计算机视觉的核心任务之一,它通过定位和分类图像中的物体,为机器赋予“看懂”世界的能力。其原理通常基于深度学习模型,如YOLO系列,通过卷积神经网络提取特征并预测边界框与类别。这项技术的价值在于将算法能力转化为实际生产力,广泛应用于安防监控、工业质检、自动驾驶等场景。在工程实践中,环境配置的稳定性与数据质量往往决定项目成败,而模型部署的易用性直接影响最终用户体验。本文以火焰识别这一具体应用为切入点,详细解析了如何利用YOLOv11完成从零到产品化的全链路流程,其中涉及Conda虚拟环境管理、PyTo

weixin_29483277的博客 236

AIDC智算中心建设:资源池化核心技术解析

AI 应用的POD在运行的时候,通过池化运行时访问虚拟GPU、执行AI任务,池化运行时拦截对虚拟GPU的访问请求、转递给池化服务代理执行,池化服务代理通过向智算池化控制器查询虚拟GPU所对应的真实智算资源位置、规格,按查询结果分配智算资源、执行AI任务,如果真实的智算资源位于远程计算节点,则由本地池化服务代理将访问请求转递给远程计算节点上的池化服务代理处理,相关通信经由参数面网络。

u013891230的博客 2431

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

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

haima1998的专栏 1897

Ansys CFX Pre 中 RGP 表的高级配置与优化策略

本文深入探讨了Ansys CFX Pre中RGP表的高级配置与优化策略,旨在帮助用户将仿真从“能用”提升至“精准好用”。文章重点解析了如何根据具体仿真场景,科学设定温度压力范围、选择流体类型,并针对相变等复杂工况实施网格加密与分离建表等关键优化技术,以显著提升计算精度与稳定性。

weixin_29216957的博客 1180

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

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

vvv99的博客 501

【故障处理】- ORA-01722

在执行升级脚本@?/rdbms/admin/catupgrd.sql时报错ora-01722。

weixin_39099660的博客 855

第五天 Labview数据记录(5.4 EXCEL文件读写)

Excel 文件读写在数据处理、自动化办公、数据分析等领域具有重要的意义。以下是 Excel 文件读写的主要应用场景和意义:1. 数据管理和整理;2. 自动化办公;3. 数据分析和可视化;4. 系统集成;5. 报表生成;6. 教育和培训;7. 实际应用场景。Excel 文件读写的意义在于提高数据处理的效率、减少人工操作、支持自动化办公、促进数据分析和可视化,以及实现系统之间的数据交互。无论是企业、组织还是个人,都可以通过 Excel 文件读写实现数据的高效管理和利用。

weixin_38637405的博客 1263

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

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

learnframework的博客 1294

用 CL_ABAP_ZIP 在 ABAP 里打包任意文件:从前端多选到 ZIP 交付的一条龙实践

本文介绍了在SAP ABAP中实现文件打包交付的完整解决方案。文章首先区分了ZIP和GZIP的不同用途:ZIP用于多文件归档,GZIP用于单数据流压缩。核心流程包括四个步骤:文件选择、二进制上传、内存打包和ZIP输出,并提供了关键对象与函数的速查表。针对实际项目中常见的乱码、大文件处理等问题给出了解决方案,最后展示了一个完整的可运行示例代码,涵盖了从文件选择到下载的全流程实现。该方案适用于财务、质量、运维等多种业务场景,能够有效解决多文件交付的最后一公里问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

AudioMix

AudioMix

luyao3038的博客 1106

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android原生音量设置和计算

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

和大伙儿去乘凉 3642

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值