RK3528 Tinyalsa/ALSA框架:输入源声音获取与HDMI out声音输出,一文讲透直播音频链路
标签 :
RK3528TinyalsaALSA音频采集HDMI音频MEDAI V2直播音频
做直播时,画面调得再漂亮,音频一旦出问题------"有画面没声音""HDMI接电视听不到解说""无线麦和摄像头声音对不上"------整场直播就废了。很多工程师把音频当成"视频的附属品",直到排障时才发现:声音的采集、编码、路由、输出各自是一条独立的子系统,而串起这条子系统的,正是 Linux 下的 ALSA (Advanced Linux Sound Architecture)以及嵌入式场景里最常用的精简实现 Tinyalsa。
本文从 ALSA/Tinyalsa 框架讲起,拆解 RK3528 上"声音怎么进来、怎么编码、怎么从 HDMI 出去",并结合 MEDAI V2 设备的真实配置与截图,给出一套可直接落地的音频链路搭建与排障方案。
文章目录
- 一、问题现象:直播音频的四大翻车现场
- [二、原理篇:ALSA 框架与 Tinyalsa](#二、原理篇:ALSA 框架与 Tinyalsa)
- [2.1 ALSA 是什么:一套分层的音频子系统](#2.1 ALSA 是什么:一套分层的音频子系统)
- [2.2 Tinyalsa:嵌入式场景的精简实现](#2.2 Tinyalsa:嵌入式场景的精简实现)
- [2.3 PCM 设备模型:card/device 与 /dev/snd](#2.3 PCM 设备模型:card/device 与 /dev/snd)
- [2.4 音频路由与混音:DAPM 与 tinymix](#2.4 音频路由与混音:DAPM 与 tinymix)
- [2.5 ALSA 在直播链路里究竟管什么](#2.5 ALSA 在直播链路里究竟管什么)
- [三、实战篇:MEDAI V2 的音频链路](#三、实战篇:MEDAI V2 的音频链路)
- [3.1 四种声音输入源与 ALSA 的映射](#3.1 四种声音输入源与 ALSA 的映射)
- [3.2 信号配置:音频输入「跟随视频」与「WLM」](#3.2 信号配置:音频输入「跟随视频」与「WLM」)
- [3.3 HDMI 声音输出:RK3528 I2S3 → HDMI](#3.3 HDMI 声音输出:RK3528 I2S3 → HDMI)
- [3.4 声音编码:AAC 48K 双通道](#3.4 声音编码:AAC 48K 双通道)
- [3.5 系统状态验证](#3.5 系统状态验证)
- 四、音频同步与稳定性的两个工程细节
- 五、直播音频故障排障速查表
- 六、总结
一、问题现象:直播音频的四大翻车现场
在 MEDAI V2 这类"多输入、多输出"的直播编码设备里,音频故障几乎都可以归为四类:
| 翻车现场 | 典型表现 | 根因指向 |
|---|---|---|
| 有画面无声音 | 推流/录制文件只有视频轨,播放器没声音 | 音频输入未选对、UAC 设备未识别、声卡路由关闭 |
| HDMI 接电视没声音 | 本地预览画面正常,外接显示器/电视听不到声音 | HDMI 音频路由未打开、声卡选错、采样率不匹配 |
| 无线麦与画面错位 | 解说比口型快/慢,越播偏差越大 | 解说设备与视频源分属两个时钟域,时钟漂移 |
| 声音卡顿/爆音 | 间歇性"啪"一声、断断续续 | ALSA 缓冲区 XRUN(欠载/溢出)、USB 带宽不足 |
要根治这些,必须先理解设备里"声音"走的到底是什么框架------它不是某个 APP,而是一整套运行在 Linux 内核与用户态之间的 ALSA 音频子系统。
二、原理篇:ALSA 框架与 Tinyalsa
2.1 ALSA 是什么:一套分层的音频子系统
ALSA(Advanced Linux Sound Architecture,先进 Linux 声音架构) 是 Linux 标准音频框架,职责覆盖:声卡驱动、PCM 播放/录制、混音器控制、 MIDI、以及音频设备的用户态接口。在嵌入式 SoC(如 RK3528)上,它具体落地为 ASoC(ALSA System on Chip) 框架,把"CPU 端的数字音频接口"和"外接的 Codec/HDMI"解耦成三层可独立配置的驱动:
┌─────────────────────────────────────────────┐
│ 用户态应用程序 / 编码流水线(推流、录制、混音) │
│ tinyalsa / alsa-lib API:pcm_open/write/read │
└───────────────────┬─────────────────────────┘
│ ioctl(/dev/snd/pcmCxDyp)
┌───────────────────┴─────────────────────────┐
│ 内核 ASoC 框架 │
│ Machine 驱动(板级连线) │
│ Platform 驱动(CPU DAI + DMA) │
│ Codec 驱动(HDMI / USB Audio / 模拟 Codec) │
└───────────────────┬─────────────────────────┘
│ I2S / PDM / USB / SPDIF
┌───────────────────┴─────────────────────────┐
│ 硬件层 │
│ RK3528 I2S3 ──▶ HDMI 音频 │
│ USB 控制器 ──▶ UVC/无线麦(UAC) │
│ PDM / I2S ──▶ 麦克风阵列 │
└─────────────────────────────────────────────┘
理解这一层的关键:声音在 Linux 里是"字符设备 + ioctl"模型 ------应用不直接碰寄存器,而是通过 /dev/snd/ 下的设备节点,由内核 ASoC 把数据搬进/搬出硬件 FIFO。这正是 ALSA 和前面文章讲过的 V4L2(视频采集)、MPP(编解码)、RGA(图像缩放)并列成为 RK3528 异构计算"声音通道"的底座。
2.2 Tinyalsa:嵌入式场景的精简实现
完整的 alsa-lib 功能极其强大,但也因此体积大、插件多(dmix 软件混音、resample 重采样、路由等),在内存仅 1GB 的嵌入式设备上既占空间又费功耗。Tinyalsa 是 ALSA 的精简子集实现,只保留直播/播放必需的能力:
| 维度 | 完整 ALSA(alsa-lib) | Tinyalsa |
|---|---|---|
| 体积 | 大(数百 KB 库 + 插件) | 极小(几十 KB) |
| 抽象层次 | 多层(plugins、dmix、resample) | 直接操作 PCM 设备 |
| 软件混音 | 支持 dmix | 不支持(混音由应用/驱动做) |
| 重采样 | 支持 | 不支持(需采样率匹配硬件) |
| 调用流程 | snd_pcm_open → hw_params → sw_params → prepare → write |
pcm_open → pcm_set_params → pcm_prepare → pcm_write |
| 适用 | 桌面/服务器 | 嵌入式、Android、直播编码器 |
Tinyalsa 的极简播放调用(也是 MEDAI V2 用户态写 HDMI 音频的底层姿势):
cstruct pcm *pcm = pcm_open(card, device, PCM_OUT, &config); // 打开播放设备 pcm_prepare(pcm); // 准备 pcm_write(pcm, buffer, frame_count); // 写入音频帧 pcm_close(pcm); // 关闭采集侧把
PCM_OUT换成PCM_IN,pcm_write换成pcm_read即可。
Tinyalsa 还自带四个命令行工具,调试音频链路时几乎天天用:
| 工具 | 对标 ALSA 工具 | 核心用途 | 示例 |
|---|---|---|---|
tinyplay |
aplay |
播放 WAV/裸 PCM 到硬件 | tinyplay test.wav -D 0 -d 0 |
tinycap |
arecord |
录制麦克风 PCM 存为 WAV | tinycap rec.wav -c2 -r48000 -b16 |
tinymix |
amixer |
查看/设置音量、通路开关、增益 | tinymix "Speaker Switch" 1 |
tinypcminfo |
(近似 aplay -l) |
查询 PCM 支持的采样率/位深/声道 | tinypcminfo -D 0 |
2.3 PCM 设备模型:card/device 与 /dev/snd
ALSA 把每块声卡抽象成 card ,每块 card 下可有多个 device ,每个 device 再分 播放(playback, p) 与 采集(capture, c) 子流。设备节点命名规则:
/dev/snd/
├── controlC0 # 声卡0的混音器控制节点(tinymix 操作对象)
├── pcmC0D0p # 声卡0、设备0、播放(playback)
├── pcmC0D0c # 声卡0、设备0、采集(capture)
├── pcmC1D0c # 声卡1、设备0、采集(如 UVC 摄像头的 USB 音频)
└── timer # 时序设备
在 RK3528 平台上,典型的声卡注册(来自 RK3528 开发板文档)是:
- card 0:
rockchip-hdmi------ HDMI 声音输出,对应 I2S3 数字音频接口接到 HDMI TX; - card 1:
rk3528-acodec------ 芯片自带/外接音频 Codec(若板载); - USB 设备(如 UVC 摄像头、无线麦) 作为 USB Audio Class(UAC) 设备插入后,内核
snd-usb-audio驱动会再注册出一块独立声卡(如 card 2),它天然就是 ALSA 采集设备,无需额外驱动。
这正是 MEDAI V2"声音输入:UVC/NDI/网络流/USB无线MIC"在 Linux 里的真实落点:UVC 摄像头和博雅 BOYA 无线麦,本质都是 UAC 设备,插上就被 ALSA 认成一块采集声卡 ,Tinyalsa 用
pcm_read就能把 PCM 抽出来。
2.4 音频路由与混音:DAPM 与 tinymix
音频不是"打开设备就有声",它还要经过 DAPM(Dynamic Audio Power Management,动态音频电源管理) 的控件连通。这些控件(widget)通过 tinymix 查看和开关,例如:
bash
# 列出某声卡所有混音控件
tinymix -D 0
# 打开 HDMI 播放通路
tinymix "HDMI Playback Switch" 1
# 设置主音量
tinymix "HDMI Playback Volume" 80
直播设备把"选哪个输入源、要不要混解说、声音走不走 HDMI"全部建模成这类控件,由 Web 配置界面(信号配置页)在背后调用 tinymix/ALSA 接口完成路由切换。MEDAI V2 的"音频输入:跟随视频 / WLM"就是这一层的两组路由预设。
2.5 ALSA 在直播链路里究竟管什么
把前几篇文章的模块串起来,ALSA 在 MEDAI V2 直播链路里的职责就很清晰了:
- 采集(Capture) :UVC/无线麦的 UAC 声卡 →
pcm_read→ 原始 PCM;NDI/网络流的 RTP 音频解封装后也汇入同一数字音频域; - 混音(Mix):解说(WLM)+ 视频自带声,在应用/驱动层叠加成一路;
- 编码(Encode) :PCM → AAC(48K 双通道),交给 MPP/推流模块打包进 RTMP/RTSP/SRT;
- 输出(Playback) :编码前/后的音频 →
pcm_write→rockchip-hdmi声卡 → I2S3 → HDMI,供本地监视器/电视监听。

声音与画面能在播放端对齐,前提是音频 PCM 和视频帧共用同一时间基准、打同一套时间戳(详见本系列《RTMP 拉流不卡顿声音同步》)。ALSA 的 PCM 采样率(48K)正是这个时间基准的"心跳"。
三、实战篇:MEDAI V2 的音频链路
3.1 四种声音输入源与 ALSA 的映射
结合技术参数与说明书,MEDAI V2 支持四类声音输入,各自在 ALSA 模型中的位置不同:
| 输入源 | 物理接口 | Linux 中的音频形态 | 采样/编码 |
|---|---|---|---|
| UVC 摄像头自带声 | USB 3.0 | UAC 采集声卡(如 card 2),pcmC2D0c |
随摄像头,设备内统一转 48K |
| NDI 网络流音频 | 网口/无线 | RTP 音频解封装后进入数字音频域 | 通常 AAC/Opus,转 48K |
| 网络流音频(RTSP/RTMP/SRT) | 网口/无线 | RTP 音频解封装 | AAC,转 48K |
| USB 无线麦(WLM,博雅 BOYA) | USB 2.0 | UAC 采集声卡(如 card 3),pcmC3D0c |
随麦,设备内统一转 48K |
注意设备"USB 信号输入"是 USB 3.0 专口(接 UVC 摄像头),而 WLM 无线麦明确接 USB 2.0 接口------两个 USB 口职责不同,别插错口导致声卡不识别。
3.2 信号配置:音频输入「跟随视频」与「WLM」
进入 编码配置 → 信号配置 页面,音频输入提供两种模式:

- 跟随视频:声音跟随当前视频源自带的声音(UVC 自带声 / NDI / 网络流的音频轨)。最不容易出错,切换视频源时声音一起切,天然避免"画面切了声音还留在上一路"的错位;
- WLM:把声音切换到无线 MIC(接入 USB 2.0 接口),用于现场解说、主持------此时解说音轨与视频画面分属两个时钟域,对时钟质量要求更高(见第四章)。
视频输出(HDMI 显示与编码源)可选 UVC / NDI / NET1 / NET2;而音频输出恒走 HDMI,与视频输出选择的源无关,单独成路。
3.3 HDMI 声音输出:RK3528 I2S3 → HDMI
MEDAI V2 的音频输出规格为 HDMI 输出,48K 双通道(技术参数原文)。在 RK3528 上,这条路径是:
编码/混音后的 PCM
→ ALSA rockchip-hdmi 声卡 (card 0, pcmC0D0p)
→ I2S3 数字音频接口 (RK3528 Datasheet: I2S3 connect to HDMI)
→ HDMI TX (HDMI 2.0, 1920x1080@60)
→ 外接显示器/电视扬声器
RK3528 数据手册明确:I2S1/I2S3 为 8 通道接口,I2S3 连接 HDMI ,音频分辨率 16~32bit、采样率最高 192KHz。MEDAI V2 实际取 48KHz / 立体声(双通道) 这一档,既满足直播监听与编码需求,又兼容绝大多数 HDMI 显示设备。
工程提示:HDMI 音频是"随视频信号一起走的"。如果 HDMI 没接显示器(HPD 未检测到),部分设备会禁掉 HDMI 音频通路------所以"系统状态页 HDMI 输出接入状态"是判断本地监听是否正常的第一直观信号。
3.4 声音编码:AAC 48K 双通道
技术参数明确 声音编码:AAC,48K 双通道。AAC 是直播/点播最通用的音频_codec,理由:
- 同等码率下音质优于 MP3,直播推流(RTMP/RTSP/SRT/NDI)普遍采用;
- 48K 采样率与视频时间基准天然对齐,便于音画同步;
- 双通道(立体声)覆盖会议、课程、活动播报等绝大多数场景。
编码参数页面(分辨率/码率/编码格式 H265/H264)决定的是视频侧;音频侧固定在 AAC 48K 立体声,由设备统一在音频流水线完成,无需用户逐项配置,展开高级配置可精细化视频参数(GOP/帧率/CBR-VBR/镜像/旋转),音频采样率与声道保持 48K 双通道不变:

推流配置里,5 路 RTMP 推流均支持"视频加密 + 声音加密"------声音加密即对 AAC 音频轨一并加密,拉流端需输入 6 位验证码解密(仅支持一路拉流解密),保证端到端音视频都安全。
3.5 系统状态验证
一切配置就绪后,进入系统状态主页,重点看"输出状态"里的 HDMI 输出接入状态,以及输入状态里各源的接入信息:

- HDMI 输出接入状态 = "已接入" → 本地监听通路正常;
- 输入状态区显示 UVC/NDI/NET1/NET2 的连接与分辨率 → 声音来源的设备已在线;
- 网络监控的上传/下载曲线 → 推流/拉流的音频码率是否平稳(音频码率虽小,但抖动同样会引发缓冲问题)。
验证"有声音"的最快方法:本地 HDMI 接电视,把音频输入设为"跟随视频",用带麦的 UVC 摄像头对着说话------电视应同步出声;再切到 WLM,对着无线麦说话应出声,说明两条采集声卡(UAC)都被 ALSA 正确识别。
四、音频同步与稳定性的两个工程细节
4.1 解说(WLM)与画面的时钟对齐
选"WLM"做解说时,解说音轨来自无线麦(独立 UAC 声卡),视频画面来自 UVC/网络源,两者是两个时钟域。若无线麦时钟质量差,长时间直播后解说会逐渐领先或落后于口型(累积型漂移)。专业场景建议:
- 用高品质 USB 音频(如博雅 BOYA 系列官方推荐型号);
- 控制单场直播时长,必要时重启设备重置时钟;
- 关键直播优先"跟随视频",把解说声先进摄像机的 UAC 混好,再整体进设备,统一为一个时钟域。
4.2 别让音频成为缓冲抖动的源头
前面《RTMP 拉流不卡顿》讲过:缓冲区抹平网络抖动。音频码率虽低(AAC 约 64~128kbps),但音频 XRUN(缓冲区欠载/溢出)会直接爆音或丢声。两个预防点:
- USB 带宽给足:UVC 摄像头若同时传 4K 视频 + 高码率音频,USB3.0 口要留余量,必要时降视频分辨率;
- 编码侧 CBR 固定码率:视频 CBR 让整条推流码率平稳,音频缓冲也跟着稳定,间接防爆音。
五、直播音频故障排障速查表
| 现象 | 优先怀疑 | 处理路径 |
|---|---|---|
| 有画面无声音(推流/录制) | 音频输入未选"跟随视频"、UAC 未识别 | 信号配置确认音频输入模式;检查 USB 口是否插对(UVC→USB3.0,WLM→USB2.0) |
| HDMI 接电视没声音 | HDMI 音频路由未开、HPD 未检测 | 系统状态看"HDMI 输出接入状态";确认 HDMI 线接好、显示器已开机 |
| 无线麦没声 | WLM 未选、麦未开机/未配对 | 音频输入切"WLM";确认博雅 BOYA 已开机并与接收端配对 |
| 解说与口型越来越偏 | 双时钟域漂移(累积型) | 重启设备重置时钟;或改用"跟随视频"统一时钟域 |
| 间歇性爆音/卡顿 | ALSA XRUN、USB 带宽不足 | 降视频分辨率给 USB 留余量;视频改 CBR |
| 加密流只有画面无声音 | 拉流解密未启用/验证码错 | 拉流解密栏输入推流端 6 位验证码并启用(仅一路) |
| 本地有声、远端无声音 | 推流未带音频轨/声音加密未开 | 确认音频输入已配置;若需保密,推流端开启"声音加密" |
六、总结
直播音频在 MEDAI V2 / RK3528 上,是一套以 ALSA 为底座、Tinyalsa 为嵌入式精简接口 的独立子系统:
- 框架层 :ALSA = 用户态(tinyalsa/alsa-lib)→ 内核 ASoC(Machine/Platform/Codec)→ 硬件(I2S/USB/HDMI);Tinyalsa 用
pcm_open→pcm_set_params→pcm_write/read极简地打通采集与播放,靠tinymix做路由、tinypcminfo查能力; - 采集层 :UVC 摄像头与博雅无线麦都是 UAC 设备,插上即被 ALSA 认成采集声卡;NDI/网络流的 RTP 音频解封装后汇入同一数字音频域;
- 输出层 :RK3528 I2S3 接 HDMI ,音频经
rockchip-hdmi声卡以 48K 双通道 从 HDMI 2.0 输出,供本地监视器/电视监听; - 编码层 :统一 AAC 48K 立体声,随视频打包进 5 路 RTMP 推流,并支持视频+声音同步加密;
- 配置层:信号配置页"音频输入:跟随视频 / WLM"就是 ALSA 路由的两组预设,切换视频源时"跟随视频"保证声音不错位。
一句话收尾:视频决定观众看什么,音频决定观众留不留------而 ALSA/Tinyalsa 就是 RK3528 上让声音"进得来、编得对、出得去"的那条看不见的管道。
核心要点回顾:
- ALSA = 用户态(tinyalsa) → 内核 ASoC → 硬件(I2S/USB/HDMI);Tinyalsa 是嵌入式精简实现(无 dmix/resample)
- PCM 设备模型:card/device,播放 p、采集 c;
/dev/snd/pcmCxDyp、controlCx - 工具:tinyplay(播放)/tinycap(录制)/tinymix(路由音量)/tinypcminfo(查能力)
- UVC 摄像头、博雅无线麦 = USB Audio Class 设备,插上即被 ALSA 认成采集声卡
- MEDAI V2 音频输入:跟随视频 / WLM(WLM 接 USB 2.0)
- 音频输出:HDMI,48K 双通道;RK3528 I2S3 接 HDMI(rockchip-hdmi 声卡)
- 声音编码:AAC 48K 双通道;5 路 RTMP 推流支持视频+声音加密,拉流仅一路解密
- 排障先看系统状态"HDMI 输出接入状态";无线麦与画面分属双时钟域,注意累积漂移