当前位置: 首页 > news >正文

OpenHarmony Audio子系统全栈解码:从HDI驱动到DSP算法的低延迟高保真之路

音频(Audio)组件用于实现音频相关的功能,包括音频播放,录制,音量管理和设备管理.

基本概念:

采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。
采样率 采样率为每秒从连续信号中提取并组成离散信号的采样次数,单位用赫兹(Hz)来表示。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。
声道 声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。
音频帧 音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。
PCM PCM(Pulse Code Modulation),即脉冲编码调制,是一种将模拟信号数字化的方法,是将时间连续、取值连续的模拟信号转换成时间离散、抽样值离散的数字信号的过程。

目录

  1. 系统架构概览
  2. 核心模块详解
  3. 关键数据结构
  4. 配置文件详解
  5. 函数调用流程
  6. 常见需求定制
  7. 常见Bug解决方案
  8. 调试与监控

系统架构概览

OpenHarmony音频框架采用分层架构设计,主要包含以下层次:

┌─────────────────────────────────────────┐
│              应用层                      │
├─────────────────────────────────────────┤
│           框架接口层                     │
├─────────────────────────────────────────┤
│           服务层                        │
│  ┌─────────────────┐  ┌───────────────┐ │
│  │  AudioServer    │  │AudioPolicyServer│ │
│  └─────────────────┘  └───────────────┘ │
├─────────────────────────────────────────┤
│           引擎层                        │
│  ┌─────────────┐  ┌───────────────────┐ │
│  │AudioRenderer│  │   AudioCapturer   │ │
│  └─────────────┘  └───────────────────┘ │
├─────────────────────────────────────────┤
│           HDI适配层                      │
└─────────────────────────────────────────┘

在这里插入图片描述

音频服务组件

1. AudioServer (音频服务)
  • 源码位置: services/audio_service/server/src/audio_server.cpp
  • 系统ID: AUDIO_DISTRIBUTED_SERVICE_ID
  • 主要功能:
    • 音频渲染和捕获的核心服务
    • 管理音频流的生命周期
    • 处理音频焦点管理
    • 音频效果处理
2. AudioPolicyServer (音频策略服务)
  • 源码位置: services/audio_policy/server/src/audio_policy_server.cpp
  • 系统ID: AUDIO_POLICY_SERVICE_ID
  • 主要功能:
    • 音频路由策略管理
    • 音量控制策略
    • 设备切换管理
    • 音频场景管理

核心模块详解

音频渲染器 (AudioRenderer)

关键类定义
// 源码位置: frameworks/native/audiorenderer/include/audio_renderer.h
class AudioRenderer {
public:static std::unique_ptr<AudioRenderer> Create(const AudioRendererOptions &options);bool Start();bool Pause();bool Stop();bool Flush();bool Release();// 音频数据写入int32_t Write(const uint8_t *buffer, size_t bufferSize, size_t &bytesWritten);// 音量控制int32_t SetVolume(float volume);float GetVolume();// 音频参数设置int32_t SetAudioStreamInfo(const AudioStreamInfo &info);int32_t SetRendererInfo(const AudioRendererInfo &info);
};
渲染流程
应用创建AudioRenderer
设置音频参数
调用Start开始渲染
写入音频数据
音频服务处理数据
HDI适配层输出
硬件播放

音频捕获器 (AudioCapturer)

关键类定义
// 源码位置: frameworks/native/audiocapturer/include/audio_capturer.h
class AudioCapturer {
public:static std::unique_ptr<AudioCapturer> Create(const AudioCapturerOptions &options);bool Start();bool Stop();bool Release();// 读取音频数据int32_t Read(uint8_t *buffer, size_t bufferSize, size_t &bytesRead);// 设置捕获信息int32_t SetCapturerInfo(const AudioCapturerInfo &info);int32_t GetCapturerInfo(AudioCapturerInfo &info);
};
捕获流程
应用创建AudioCapturer
设置捕获参数
调用Start开始捕获
从硬件获取数据
HDI适配层输入
音频服务处理
应用读取数据

音频策略管理器 (AudioPolicyManager)

关键接口定义
// 源码位置: frameworks/native/audiopolicy/include/audio_policy_manager.h
class AudioPolicyManager {
public:// 音量控制int32_t SetSystemVolumeLevel(AudioVolumeType volumeType, int32_t volumeLevel);int32_t GetSystemVolumeLevel(AudioVolumeType volumeType);// 设备管理std::vector<std::shared_ptr<AudioDeviceDescriptor>> GetDevices(DeviceFlag deviceFlag);int32_t SelectOutputDevice(sptr<AudioRendererFilter> filter, std::vector<std::shared_ptr<AudioDeviceDescriptor>> devices);// 音频场景int32_t SetAudioScene(AudioScene scene);AudioScene GetAudioScene();// 铃声模式int32_t SetRingerMode(AudioRingerMode ringMode);AudioRingerMode GetRingerMode();
};

关键数据结构

音频流类型枚举

// 源码位置: foundation\multimedia\audio_framework/interfaces/inner_api/native/audiocommon/include/audio_info.h
enum AudioStreamType {STREAM_VOICE_CALL = 0,      // 语音通话STREAM_SYSTEM = 1,         // 系统声音STREAM_RING = 2,          // 铃声STREAM_MUSIC = 3,         // 音乐STREAM_ALARM = 4,         // 闹钟STREAM_NOTIFICATION = 5,   // 通知STREAM_BLUETOOTH_SCO = 6, // 蓝牙SCOSTREAM_ENFORCED_AUDIBLE = 7, // 强制可听STREAM_DTMF = 8,          // DTMF拨号音STREAM_TTS = 9,           // 文本转语音STREAM_ACCESSIBILITY = 10, // 辅助功能STREAM_VOICE_ASSISTANT = 11, // 语音助手STREAM_ULTRASONIC = 12,   // 超声波STREAM_VOICE_MESSAGE = 13, // 语音消息STREAM_VOICE_RING = 14,   // 语音铃声STREAM_VOICE_MODEM_COMMUNICATION = 15, // 调制解调器通信STREAM_SYSTEM_ENFORCED = 16, // 系统强制STREAM_VOICE_RECOGNITION = 17, // 语音识别STREAM_MAX
};

音频设备类型枚举

foundation\multimedia\audio_framework\interfaces\inner_api\native\audiocommon\include\audio_device_info.h
enum DeviceType {DEVICE_TYPE_NONE = 0,                    // 无设备DEVICE_TYPE_EARPIECE = 1,               // 听筒DEVICE_TYPE_SPEAKER = 2,                // 扬声器DEVICE_TYPE_WIRED_HEADSET = 3,          // 有线耳机DEVICE_TYPE_WIRED_HEADPHONES = 4,       // 有线头戴式耳机DEVICE_TYPE_BLUETOOTH_SCO = 5,          // 蓝牙SCODEVICE_TYPE_BLUETOOTH_A2DP = 6,         // 蓝牙A2DPDEVICE_TYPE_HDMI = 7,                  // HDMIDEVICE_TYPE_USB_DEVICE = 8,            // USB设备DEVICE_TYPE_USB_HEADSET = 9,           // USB耳机DEVICE_TYPE_USB_ACCESSORY = 10,        // USB配件DEVICE_TYPE_DOCK = 11,                 // 底座DEVICE_TYPE_FM = 12,                  // FMDEVICE_TYPE_BUILTIN_SPEAKER = 13,      // 内置扬声器DEVICE_TYPE_HDMI_ARC = 14,            // HDMI ARCDEVICE_TYPE_BLUETOOTH_A2DP_HEADPHONES = 15, // 蓝牙A2DP耳机DEVICE_TYPE_BLUETOOTH_A2DP_SPEAKER = 16,    // 蓝牙A2DP扬声器DEVICE_TYPE_HEARING_AID = 17,         // 助听器DEVICE_TYPE_MAX
};

音频场景枚举

enum AudioScene {AUDIO_SCENE_DEFAULT = 0,        // 默认场景AUDIO_SCENE_RINGING,           // 响铃场景AUDIO_SCENE_PHONE_CALL,        // 通话场景AUDIO_SCENE_VOICE_CHAT,        // 语音聊天AUDIO_SCENE_VIDEO_CHAT,        // 视频聊天AUDIO_SCENE_MAX
};

配置文件详解

音频策略配置文件

文件路径
  • 主配置文件: /vendor/etc/audio/audio_policy_config.xml
  • 芯片产品配置: /chip_prod/etc/audio/audio_policy_config.xml
配置结构
<audio_policy_configuration><modules><module name="primary" halVersion="3.0"><attachedDevices><item>Speaker</item><item>WiredHeadset</item><item>BluetoothA2dp</item></attachedDevices><defaultOutputDevice>Speaker</defaultOutputDevice><mixPorts><mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"><profile name="" format="AUDIO_FORMAT_PCM_16_BIT"samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/></mixPort></mixPorts><devicePorts><devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink"><profile name="" format="AUDIO_FORMAT_PCM_16_BIT"samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/></devicePort></devicePorts></module></modules>
</audio_policy_configuration>

音频参数配置文件

文件路径
  • 主配置文件: /vendor/etc/audio/audio_param_config.xml
配置结构
<audioParameters><mainKeys><mainKey name="volume"><subKeys><subKey name="music"><usecases><usecase name="speaker"><parameter name="volume" value="0.5"/></usecase></usecases></subKey></subKeys></mainKey></mainKeys>
</audioParameters>

函数调用流程

音频播放完整流程

应用程序音频渲染器音频服务音频策略HDI适配层音频驱动Create AudioRenderer查询设备信息返回可用设备创建音频流申请音频焦点返回焦点状态打开音频设备初始化硬件返回设备句柄返回HDI句柄创建成功Write 音频数据发送音频数据写入音频数据DMA传输播放完成传输完成通知可用空间应用程序音频渲染器音频服务音频策略HDI适配层音频驱动

音频设备切换流程

应用音频策略音频服务设备管理器HDI设备插拔事件更新设备列表重新计算路由通知设备变更暂停当前流关闭原设备打开新设备恢复音频流通知设备变更应用音频策略音频服务设备管理器HDI

常见需求定制

1. 添加新的音频流类型

修改位置
  • interfaces/inner_api/native/audiocommon/include/audio_info.h
  • services/audio_policy/server/infra/config/parser/src/audio_policy_config_parser.cpp
实现步骤
  1. audio_info.h中添加新的流类型枚举值
  2. 在配置文件中添加对应的音量曲线配置
  3. 更新策略配置文件中的流映射关系
// 示例:添加STREAM_CUSTOM类型
enum AudioStreamType {// ... 现有类型STREAM_CUSTOM = 18,  // 自定义类型STREAM_MAX
};

2. 自定义音量曲线

修改位置
  • services/audio_policy/server/infra/config/parser/src/audio_policy_config_parser.cpp
  • 配置文件: /vendor/etc/audio/audio_policy_config.xml
实现步骤
  1. 在配置文件中添加音量曲线定义
  2. 更新对应的流类型映射
<volumeCurves><volumeCurve stream="STREAM_CUSTOM"><point>0,0</point><point>1,33</point><point>2,66</point><point>3,100</point></volumeCurve>
</volumeCurves>

3. 添加新的音频设备

修改位置
  • interfaces/inner_api/native/audiocommon/include/audio_info.h
  • services/audio_policy/server/src/device/audio_device_manager.cpp
  • HDI适配层代码
实现步骤
  1. 定义新的设备类型枚举
  2. 实现设备检测逻辑
  3. 更新设备能力配置
  4. 添加路由策略

4. 自定义音频效果

修改位置
  • frameworks/native/audioeffect/include/audio_effect.h
  • services/audio_service/server/src/effect/audio_effect_server.cpp
实现步骤
  1. 定义新的效果类型
  2. 实现效果处理算法
  3. 注册到效果框架
  4. 配置效果参数

常见Bug解决方案

1. 音频播放无声问题

排查步骤
  1. 检查音频焦点

    // 源码位置: services/audio_policy/server/src/service/audio_policy_service.cpp
    bool AudioPolicyService::IsStreamActive(AudioStreamType streamType)
    
  2. 验证音量设置

    // 源码位置: services/audio_policy/server/src/service/audio_policy_service.cpp
    int32_t AudioPolicyService::GetSystemVolumeLevel(AudioVolumeType volumeType)
    
  3. 检查设备状态

    // 源码位置: services/audio_policy/server/src/device/audio_device_manager.cpp
    bool AudioDeviceManager::IsDeviceActive(DeviceType deviceType)
    
常见原因
  • 音频焦点被其他应用占用
  • 音量被设置为0或静音
  • 输出设备选择错误
  • 音频路由配置错误

2. 音频录制失败问题

排查步骤
  1. 检查权限

    • 确认应用具有ohos.permission.MICROPHONE权限
    • 检查隐私设置中的麦克风权限
  2. 验证设备状态

    // 源码位置: services/audio_policy/server/src/device/audio_device_manager.cpp
    std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetDevices(DeviceFlag deviceFlag)
    
  3. 检查音频策略

    // 源码位置: services/audio_policy/server/src/service/audio_policy_service.cpp
    bool AudioPolicyService::IsMicrophoneMute()
    
常见原因
  • 权限被拒绝
  • 麦克风被其他应用占用
  • 麦克风被系统静音
  • 录制参数设置错误

3. 音频设备切换异常

排查步骤
  1. 检查设备监听

    // 源码位置: services/audio_policy/server/src/device/audio_device_manager.cpp
    void AudioDeviceManager::RegisterDeviceStatusListener()
    
  2. 验证路由策略

    // 源码位置: services/audio_policy/server/src/router/audio_router_center.cpp
    int32_t AudioRouterCenter::RouteDeviceChange(DeviceType deviceType, bool isConnected)
    
  3. 检查焦点处理

    // 源码位置: services/audio_policy/server/src/interrupt/audio_interrupt_service.cpp
    int32_t AudioInterruptService::HandleDeviceChange(DeviceType deviceType)
    

4. 音频延迟过高

优化方案
  1. 使用低延迟模式

    // 源码位置: frameworks/native/audiorenderer/src/audio_renderer_impl.cpp
    bool AudioRendererImpl::IsFastPlaybackSupported(AudioStreamInfo &streamInfo, StreamUsage usage)
    
  2. 优化缓冲区大小

    // 源码位置: services/audio_service/server/src/audio_stream.cpp
    int32_t AudioStream::GetFrameCount() const
    
  3. 调整线程优先级

    // 源码位置: services/audio_service/server/src/audio_schedule.cpp
    void ScheduleThreadInServer(pid_t pid, pid_t tid)
    

调试与监控

1. 音频调试开关

开启PCM数据dump
# 设置环境变量
export PCM_DUMP=1
export PCM_DUMP_PATH=/data/local/tmp/audio_dump
开启详细日志
# 设置系统参数
hilog -T audio_server -L DEBUG
hilog -T audio_policy -L DEBUG

2. 性能监控

监控音频延迟
// 源码位置: frameworks/native/audiorenderer/include/audio_timestamp.h
struct Timestamp {int64_t tvSec;      // 秒int64_t tvNSec;     // 纳秒Timebase base;      // 时间基
};
监控CPU使用率
# 使用top命令监控top -p $(pidof audio_server)
top -p $(pidof audio_policy)

3. 调试工具

音频策略调试
# 查看音频策略状态
hidumper -s audio_policy_server -a -p
音频服务调试
# 查看音频服务状态
hidumper -s audio_server -a -p

4. 常见问题诊断命令

检查音频服务状态
# 检查服务是否运行
aa dump -a audio_server
aa dump -a audio_policy
查看音频设备
# 查看当前音频设备
hidumper -s audio_policy_server -a -d
检查音频路由
# 查看当前音频路由
hidumper -s audio_policy_server -a -r

附录

A. 相关源码路径

模块路径说明
AudioServerservices/audio_service/音频服务主目录
AudioPolicyservices/audio_policy/音频策略服务
AudioRendererframeworks/native/audiorenderer/音频渲染器
AudioCapturerframeworks/native/audiocapturer/音频捕获器
AudioPolicyManagerframeworks/native/audiopolicy/音频策略管理器
AudioCommoninterfaces/inner_api/native/audiocommon/公共接口定义

B. 配置文件路径

配置文件路径说明
audio_policy_config.xml/vendor/etc/audio/音频策略配置
audio_param_config.xml/vendor/etc/audio/音频参数配置
audio_policy_config.xml/chip_prod/etc/audio/芯片产品配置

C. 调试日志标签

组件日志标签说明
AudioServerAudioServer音频服务日志
AudioPolicyServerAudioPolicyServer音频策略日志
AudioRendererAudioRendererImpl音频渲染器日志
AudioCapturerAudioCapturerImpl音频捕获器日志

D. 系统权限

权限说明
ohos.permission.MICROPHONE麦克风访问权限
ohos.permission.CAPTURE_AUDIO_OUTPUT音频输出捕获权限
ohos.permission.MODIFY_AUDIO_SETTINGS修改音频设置权限
ohos.permission.MANAGE_AUDIO_CONFIG管理音频配置权限
http://www.dtcms.com/a/349079.html

相关文章:

  • SQL Server缩小日志文件.ldf的方法(适用于开发环境)
  • 复杂水域场景识别率↑89%!陌讯多模态融合算法在岸边垃圾检测的落地实践
  • Python学习笔记之(二)变量和简单的数据类型
  • 鸿蒙中Image白块问题分析与解决方案
  • Java:HashMap的使用
  • 2025/8/24 DockerDesktop安装使用
  • 云原生俱乐部-RH294知识点归纳(3)
  • Python内置函数全解析:30个核心函数语法、案例与最佳实践指南
  • Linux应急响应一般思路(二)
  • C++测试框架高级资源管理模块完整实现指南
  • 八、redis 入门 之 雪崩、穿透、击穿
  • 小米AX3600访问桥接的光猫
  • 如何一键统一文件名大小写?
  • Springboot框架的“上海迪士尼”旅游管理网站设计与开发
  • C++---双指针
  • 工作后的总结和反思3
  • cookie,session,token之间有什么关系
  • 大模型知识--Function Calls
  • Kubernetes — 学习 Sidecar 容器模式
  • 面经-自用
  • CVPR 2025 | 医学影像加速进化:深度学习×多模态,精准诊断再升级
  • Transformer 模型详解:从自注意力到编码器-解码器结构
  • 拓展:simulink中将仿真环境离散化
  • 关于熵减 - 飘升机
  • Vue3路由
  • C++11新特性全面解析(万字详解)
  • SQL Server从入门到项目实践(超值版)读书笔记 24
  • 详细的周任务清单(Week1-Week24,每周具体目标+任务)
  • Pod 生命周期:从创建到销毁的完整旅程
  • Linux shell编程初步认知与变量学习