RK3528 Tinyalsa/ALSA框架:输入源声音获取与HDMI out声音输出,一文讲透直播音频链路

RK3528 Tinyalsa/ALSA框架:输入源声音获取与HDMI out声音输出,一文讲透直播音频链路

标签 :RK3528 Tinyalsa ALSA 音频采集 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 音频的底层姿势):

c 复制代码
struct 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 直播链路里的职责就很清晰了:

  1. 采集(Capture) :UVC/无线麦的 UAC 声卡 → pcm_read → 原始 PCM;NDI/网络流的 RTP 音频解封装后也汇入同一数字音频域;
  2. 混音(Mix):解说(WLM)+ 视频自带声,在应用/驱动层叠加成一路;
  3. 编码(Encode) :PCM → AAC(48K 双通道),交给 MPP/推流模块打包进 RTMP/RTSP/SRT;
  4. 输出(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 输出接入状态";无线麦与画面分属双时钟域,注意累积漂移

相关推荐
镭封1 小时前
做电视剧解说视频用什么软件?配音、文案处理一次解决
人工智能·小程序·音视频·语音识别·媒体
VidDown3 小时前
自动给视频挑一张能看的封面:帧评分、构图与批量生成
python·ffmpeg·音视频·视频
AliCloudROS4 小时前
MiniMax-H3 视频生成模型 — 一键部署与使用指南
人工智能·音视频
揽秀亭长16 小时前
视频转脚本有哪些方法?5种方案技术拆解
人工智能·音视频
Android系统攻城狮17 小时前
Linux Gstreamer深度解析之gst_audio_sink_get_type调用流程与实战(六十五)
linux·运维·服务器·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
程序猿追18 小时前
HarmonyOS 6 音视频实战:用 AVPlayer 做一个本地音乐播放器
华为·音视频·harmonyos
weixin_6906547421 小时前
龙迅#LT9611EX 现MIPI转HDMI1.4功能主推型号,分辨率高达4K30HZ,IC内置I2C无需外部12C控制。
嵌入式硬件·音视频·信号处理
Light601 天前
谁在给大模型出题、卖题、判卷:一门 300 亿估值的生意,和它正在漏掉的部分
音视频
甜到心里的蛋糕1 天前
云主机部署图片/视频管理系统的实践经验
python·音视频