1. RK3568开发板视频播放系统开发实战
作为一名嵌入式开发工程师,最近在RK3568开发板上实现了一个电梯广告播放系统,过程中遇到了不少视频播放相关的问题。本文将详细记录从环境准备到问题解决的全过程,特别是针对H.264视频解码和MIPI屏幕显示输出的技术细节。
1.1 开发环境准备
首先需要确认开发板的基本视频播放能力。通过SSH连接到开发板后,我执行了以下命令检查FFmpeg版本:
bash复制ffmpeg -version
这个命令输出了当前系统中FFmpeg的版本信息和编译配置,确认了硬件加速支持情况。对于RK3568平台,关键的配置项是看是否启用了rkmpp硬件解码器。
1.2 测试视频准备
我将一个10秒的MP4测试视频test1.mp4上传到了开发板的/userdata/mnt目录。这是一个标准的H.264编码视频,使用以下命令进行测试播放:
bash复制ffplay -nodisp -autoexit -volume 80 test1.mp4
参数说明:
-nodisp:隐藏终端里的视频预览窗口-autoexit:视频播放完后自动退出-volume 80:设置音量为80%
1.3 播放失败分析
执行播放命令后遇到了失败情况。通过ffprobe分析视频文件信息:
bash复制ffprobe test1.mp4
输出显示视频使用的是H.264 High Profile编码,级别为3.1。这正是问题的关键所在——RK3568的硬件解码器对H.264 High Profile的支持不够完善。
2. 视频解码问题解决方案
2.1 尝试软件解码
首先尝试强制使用软件解码:
bash复制ffplay -vcodec libx264 -autoexit -volume 80 /userdata/mnt/test1.mp4
虽然这样可以播放,但CPU占用率很高,不适合长期运行的广告播放系统。
2.2 视频转码方案(推荐)
更合理的解决方案是将视频转换为RK3568硬件解码最佳支持的格式。在电脑端执行以下转码命令:
bash复制ffmpeg -i test1.mp4 -vcodec libx264 -profile:v baseline -level 3.1 -pix_fmt yuv420p -acodec aac -ar 44100 test1_compat.mp4
关键参数说明:
-profile:v baseline:使用Baseline Profile,兼容性最好-level 3.1:设置H.264级别-pix_fmt yuv420p:使用最通用的像素格式
转换完成后,将新视频上传到开发板,使用硬件解码播放:
bash复制ffplay -autoexit -volume 80 /userdata/mnt/test1_compat.mp4
3. MIPI屏幕显示配置
3.1 显示输出问题
在MobaXterm中直接播放视频无法显示画面,这是因为:
- MobaXterm通过SSH连接,只能传输命令行界面
- FFplay默认需要本地显示设备输出
3.2 MIPI屏幕配置步骤
3.2.1 确认MIPI屏幕设备节点
bash复制ls /sys/class/drm/ | grep -E "card0-.*"
输出中card0-DSI-1对应MIPI屏幕。
3.2.2 配置Weston显示输出
创建配置文件/tmp/.weston_drm.conf:
bash复制output DSI-1 rotate=0
3.2.3 重启Weston服务
由于开发板使用Buildroot系统,没有systemd,需要手动重启:
bash复制ps aux | grep weston
kill -9 [PID]
weston --config=/tmp/.weston_drm.conf &
4. 广告播放系统实现
4.1 系统架构设计
基于GStreamer实现了一个完整的广告播放系统,主要功能:
- 自动循环播放指定目录下的视频
- 音量控制
- 日志记录
- 进程管理
4.2 核心代码解析
播放器主程序关键部分:
c复制void play_video(const char *video_path) {
char command[1024];
snprintf(command, sizeof(command),
"gst-play-1.0 \"%s\" --videosink=kmssink --audiosink=alsasink --volume=0.8 2>> %s",
video_path, LOG_FILE);
system(command);
}
使用kmssink作为视频输出,alsasink作为音频输出。
4.3 控制脚本实现
完整的控制脚本ad_system.sh提供了丰富的功能:
bash复制./ad_system.sh start /userdata/videos # 启动播放
./ad_system.sh volume 80 # 设置音量
./ad_system.sh stop # 停止播放
5. 常见问题与解决方案
5.1 内存泄漏问题
长时间运行后出现内存耗尽,原因是GStreamer没有正确释放资源。解决方案:
- 定期重启播放进程
- 使用
gst_init(NULL, NULL)和gst_deinit()进行初始化和清理
5.2 音频控制问题
开发板音频控制需要明确指定控制通道:
bash复制amixer set "Master" 80%
5.3 视频格式兼容性
建议统一使用以下编码参数:
- 视频:H.264 Baseline Profile, Level 3.1, yuv420p
- 音频:AAC, 44100Hz
6. 性能优化建议
- 视频预处理:在电脑端批量转换视频格式
- 缓存管理:限制内存使用,定期清理缓存
- 硬件加速:确保使用
rkmpp硬件解码器 - 电源管理:优化CPU频率策略
7. 实际部署注意事项
- 文件系统:使用只读文件系统提高稳定性
- 自动恢复:添加看门狗监控进程
- 日志轮转:防止日志文件过大
- 温度监控:避免长时间运行过热
通过以上方案,我们成功在RK3568开发板上实现了一个稳定运行的电梯广告播放系统。整个开发过程中,视频解码兼容性和显示输出配置是最具挑战性的部分,希望这些经验能对其他开发者有所帮助。