【黑金云课堂】FPGA技术教程Linux开发:DP音频播放与VCU视频解码
一、DP 音频播放1. 音频基础知识数字音频由采样率、位深、声道数三个参数定义。参数说明常见值采样率每秒采样次数44100Hz(CD)、48000Hz(DVD)位深单个采样存储位数16bit、24bit、32bit声道数音频通道数量1 (单声道)、2 (立体声)计算公式比特率 采样率 × 位深 × 声道数示例CD 音质 44100 × 16 × 2 1,411,200 bps ≈ 1.4 Mbps常见音频格式格式类型说明WAV无损PCM 原始音频数据文件体积大FLAC无损压缩压缩率约 50%音质无损失MP3有损压缩通用音频格式压缩率高AAC有损压缩同等码率下音质优于 MP3Linux 音频子系统分层架构应用层 ├── ALSA lib (libasound) # 底层音频标准API ├── PulseAudio / PipeWire # 音频服务混音器 └── GStreamer / Qt Multimedia # 多媒体开发框架 内核层 ├── ALSA Core (sound/core/) # ALSA音频内核核心 ├── ASoC (ALSA System on Chip) # 嵌入式片上音频框架 └── DP Audio Driver # DisplayPort音频驱动 硬件层 ├── DP Controller # DisplayPort显示控制器 └── Audio Codec # 音频编解码芯片2. PetaLinux 配置2025.2 版本驱动说明PetaLinux 2025.2 中 DP 音频驱动已默认配置无需修改内核RootFS 必须预装组件GStreamer 运行环境、MP3 解码插件、Qt 图形运行库必须勾选软件包列表[*] packagegroup-xilinx-gstreamer [*] packagegroup-xilinx-matchbox [*] packagegroup-xilinx-multimedia [*] packagegroup-opencv [*] packagegroup-xilinx-qt [*] populate_sdk_qt5 [*] packagegroup-xilinx-qt-extended [*] packagegroup-core-x113. 命令行控制 GStreamer 音频播放管道aplay -l查看播放设备amixer设置音量aplay播放WAV文件。GStreamer支持更多格式MP3、AAC等通过decodebin自动检测格式。实践要点DP音频需要DP线缆连接且显示器支持音频。常用格式为48000Hz/16bit/立体声。调试时先确认设备存在再设置音量最后播放测试。二、VCU 视频解码1. VCU 概述1.1 VCU 基础介绍VCUVideo Codec Unit是Zynq UltraScale MPSoC EV系列内置硬件视频编解码单元专门处理 H.264/H.265 实时编解码转码优势将高算力视频压缩 / 解压交给专用硬件ARM CPU 仅负责驱动、缓冲、调度、显示输出硬件互联VCU 硬核通过 AXI 总线与 PS、DDR 内存交互依赖驱动 固件协同工作性能上限支持 H.264/H.265 硬编硬解最高 4K60fps1.2 VCU 软件栈分层架构2. Vivado 工程vcu_demo 参考工程包含 VCU IP、DP 显示控制器、AXI 互联、时钟约束输出文件生成硬件比特流、硬件 HDF/XSA 文件用于 PetaLinux 导入生成设备树配套文件SD 卡 BOOT 分区启动镜像BOOT.BIN、image.ub3. PetaLinux 工程配置要点驱动校验内核开启 VCU、V4L2、KMS/DRM 显示驱动固件检查RootFS 内置 VCU 编解码固件开机自动加载设备树配置 VCU 内存地址、DP 显示控制器、CMA 预留内存内存关键项CMA 连续内存必须分配足够大小否则 4K 解码会内存溢出参考工程Linux 应用第 24 节 Qt 界面显示工程配套 petalinux 模板4. GStreamer 编解码实战前置操作关闭 X11 占用 KMS 显示systemctl stop xserver-nodm.service systemctl disable xserver-nodm.serviceMP4 视频解码输出 DP 显示器gst-launch-1.0 uridecodebin uriFile:///run/media/BOOT-mmcblk1p1/h264_720P.mp4 ! queue max-size-bytes0 ! videoconvert ! kmssink bus-idfd4a0000.display fullscreen-overlay1测试画面编码生成 MP4 文件gst-launch-1.0 -e videotestsrc num-buffers600 patternball ! \ video/x-raw,width1280,height720,framerate30/1 ! \ clockoverlay time-format%H:%M:%S font-descSans, 36 ! \ videoconvert ! video/x-raw,formatNV12 ! \ omxh264enc ! h264parse ! mp4mux ! \ filesink location/run/media/BOOT-mmcblk1p1/test_clock_ball_720p30.mp4数据流链路测试图像源 → 分辨率帧率约束 → 时间水印叠加 → 格式转 NV12 → VCU 硬件 H.264 编码 → 码流解析 → MP4 封装 → 本地文件保存视频转码23.97fps → 30fpsgst-launch-1.0 -e filesrc location/run/media/BOOT-mmcblk1p1/h264_720P.mp4 ! \ qtdemux ! h264parse ! omxh264dec low-latency0 ! \ videorate ! video/x-raw,framerate30/1 ! \ omxh264enc ! h264parse ! mp4mux ! \ filesink location/run/media/BOOT-mmcblk1p1/h264_720P_30fps.mp4USB 摄像头采集编码 UDP 本地回环推流接收端解码 DP 显示后台运行gst-launch-1.0 -v udpsrc port5000 buffer-size10000000 \ capsapplication/x-rtp,mediavideo,clock-rate90000,payload96,encoding-nameH264 ! \ queue max-size-buffers4 leakydownstream ! \ rtph264depay ! h264parse ! video/x-h264,alignmentnal ! \ omxh264dec low-latency1 ! \ queue max-size-buffers4 leakydownstream ! \ kmssink bus-idfd4a0000.display plane-id33 fullscreen-overlay1 syncfalse asyncfalse 发送端摄像头采集 VCU 编码 UDP 发送gst-launch-1.0 -v v4l2src device/dev/video0 io-modemmap ! \ video/x-raw,formatYUY2,width640,height480,framerate25/1 ! \ videoconvert ! video/x-raw,formatNV12,width640,height480,framerate25/1 ! \ omxh264enc target-bitrate2000 control-ratelow-latency gop-modelow-delay-p \ gop-length25 periodicity-idr25 ! \ h264parse ! rtph264pay config-interval1 pt96 ! \ udpsink host127.0.0.1 port5000 syncfalse asyncfalse 完整视频讲解可前往 ALINX 视频号进行直播回看更多细节欢迎关注我们黑金云课堂全年免费直播课黑金云课堂六月直播日历 我们将在每周二、三、四同步推进Verilog开发、Vitis开发、Linux开发三大系列带你从零开始稳扎稳打掌握 FPGA 开发全流程系列内容定位Verilog开发硬件描述语言基础、逻辑设计、仿真调试Vitis开发Zynq软硬件协同、外设驱动、网络协议栈Linux开发嵌入式Linux系统移植、驱动编写、应用开发