RV1106开发板实战:手把手教你编译FFmpeg 3.4.8并集成到LVGL 9.2.3播放视频

news2026/5/15 10:56:58
RV1106开发板实战从零构建FFmpeg 3.4.8与LVGL 9.2.3视频播放系统在嵌入式设备上实现流畅的视频播放一直是开发者面临的挑战之一。RV1106作为一款高性能的嵌入式处理器结合FFmpeg强大的多媒体处理能力和LVGL轻量级图形库的优雅界面能够打造出功能丰富且响应迅速的嵌入式视频应用。本文将带你一步步完成从交叉编译到系统集成的全过程解决实际开发中可能遇到的各种问题。1. 开发环境搭建与工具链配置在开始编译FFmpeg之前我们需要准备好开发环境。RV1106开发板通常采用ARM架构因此需要在x86主机上搭建交叉编译环境。以下是环境配置的关键步骤Ubuntu 22.04基础环境准备sudo apt update sudo apt install -y build-essential cmake git wget \ pkg-config libssl-dev libdrm-dev \ libavcodec-dev libavformat-dev libswscale-devRV1106开发板通常配套提供专用的交叉编译工具链。假设工具链已下载到/opt/rv1106-toolchain目录我们需要设置环境变量export CROSS_COMPILE/opt/rv1106-toolchain/bin/arm-rockchip830-linux-uclibcgnueabihf- export PATH$PATH:/opt/rv1106-toolchain/bin验证工具链是否正常工作${CROSS_COMPILE}gcc --version提示不同RV1106开发板厂商可能提供不同的工具链版本务必使用与你的开发板匹配的工具链。2. FFmpeg 3.4.8交叉编译详解FFmpeg 3.4.8是一个相对稳定的版本特别适合嵌入式系统使用。我们将从源码开始编译确保获得最佳兼容性。2.1 源码获取与配置首先下载FFmpeg 3.4.8源码并解压wget http://www.ffmpeg.org/releases/ffmpeg-3.4.8.tar.gz tar -zxvf ffmpeg-3.4.8.tar.gz cd ffmpeg-3.4.8配置编译选项时需要特别注意以下几点--enable-cross-compile启用交叉编译模式--archarm指定目标架构--target-oslinux指定目标操作系统--enable-shared生成动态链接库--prefix指定安装目录完整的配置命令如下./configure \ --enable-cross-compile \ --archarm \ --target-oslinux \ --cross-prefix${CROSS_COMPILE} \ --enable-shared \ --prefix/opt/ffmpeg-rv1106 \ --disable-static \ --enable-small \ --disable-programs \ --disable-doc \ --disable-avdevice \ --disable-swresample \ --disable-postproc \ --disable-avfilter \ --disable-pthreads \ --disable-w32threads \ --disable-os2threads \ --disable-network \ --disable-dct \ --disable-dwt \ --disable-error-resilience \ --disable-lsp \ --disable-lzo \ --disable-mdct \ --disable-rdft \ --disable-fft2.2 编译与安装配置完成后开始编译和安装make -j$(nproc) make install编译完成后/opt/ffmpeg-rv1106目录将包含以下内容/opt/ffmpeg-rv1106/ ├── bin/ # 可执行文件如果未禁用 ├── include/ # 头文件 ├── lib/ # 动态库文件 └── share/ # 其他资源2.3 常见问题解决在编译过程中可能会遇到以下问题libdrm版本不兼容解决方案更新libdrm或使用与FFmpeg兼容的版本检查命令${CROSS_COMPILE}pkg-config --modversion libdrm头文件缺失确保安装了所有依赖的开发包使用pkg-config检查依赖关系链接错误确认工具链路径正确检查LD_LIBRARY_PATH是否包含工具链的库目录3. 部署FFmpeg到RV1106开发板编译完成后需要将FFmpeg部署到开发板上。以下是详细步骤3.1 文件传输与目录结构将编译好的FFmpeg文件复制到开发板的/usr/local/ffmpeg目录scp -r /opt/ffmpeg-rv1106 root板子IP:/usr/local/ffmpeg建议的目录结构/usr/local/ffmpeg/ ├── bin/ ├── include/ ├── lib/ └── share/3.2 环境变量配置在开发板上设置环境变量确保系统能够找到FFmpeg的库和可执行文件编辑/etc/profile文件添加以下内容export FFMPEG_DIR/usr/local/ffmpeg export PATH$FFMPEG_DIR/bin:$PATH export LD_LIBRARY_PATH$FFMPEG_DIR/lib:$LD_LIBRARY_PATH使配置生效source /etc/profile3.3 验证安装在开发板上运行以下命令验证FFmpeg是否正常工作ffmpeg -version如果一切正常你将看到类似如下的输出ffmpeg version 3.4.8 Copyright (c) 2000-2020 the FFmpeg developers built with gcc 6.3.0 (Rockchip rk3308_linux_release_20210323) configuration: --enable-cross-compile --archarm --target-oslinux ... libavutil 55. 78.100 / 55. 78.100 libavcodec 57.107.100 / 57.107.100 libavformat 57. 83.100 / 57. 83.100 libswscale 4. 8.100 / 4. 8.1004. LVGL 9.2.3集成FFmpeg实战LVGLLight and Versatile Graphics Library是一款轻量级的嵌入式图形库版本9.2.3开始提供了对FFmpeg的良好支持。4.1 启用LVGL的FFmpeg支持首先需要在LVGL配置中启用FFmpeg支持。编辑lv_conf.h文件#define LV_USE_FFMPEG 1LVGL的FFmpeg组件需要以下库支持libavformatlibavcodeclibswscalelibavutil4.2 CMake工程配置在CMakeLists.txt中添加FFmpeg的查找和链接配置# FFmpeg配置 find_package(PkgConfig REQUIRED) pkg_check_modules(FFMPEG REQUIRED libavformat libavcodec libswscale libavutil) # 包含头文件 include_directories( ${FFMPEG_INCLUDE_DIRS} ${LVGL_INCLUDE_DIRS} ) # 链接库 target_link_libraries(your_target ${FFMPEG_LIBRARIES} lvgl # 其他依赖... )如果使用自定义编译的FFmpeg可以手动指定路径set(FFMPEG_DIR /usr/local/ffmpeg) include_directories(${FFMPEG_DIR}/include) link_directories(${FFMPEG_DIR}/lib)4.3 视频播放实现下面是一个基本的LVGL FFmpeg播放器实现示例#include lvgl/lvgl.h #include lv_lib_ffmpeg/lv_ffmpeg.h void create_video_player(const char *video_path) { // 创建播放器对象 lv_obj_t *player lv_ffmpeg_player_create(lv_scr_act()); // 设置视频源 lv_ffmpeg_player_set_src(player, video_path); // 设置自动重启 lv_ffmpeg_player_set_auto_restart(player, true); // 开始播放 lv_ffmpeg_player_set_cmd(player, LV_FFMPEG_PLAYER_CMD_START); // 居中显示 lv_obj_center(player); }4.4 常见问题与修复在实际集成过程中可能会遇到以下问题文件无法打开 在较新版本的FFmpeg中需要显式调用av_register_all()在FFmpeg 3.4中已废弃但某些情况下仍需要。修改lv_ffmpeg.c文件在打开文件前添加av_register_all();内存不足 RV1106内存有限需要优化视频解码参数// 设置较小的解码缓冲区 AVCodecContext *codec_ctx ...; codec_ctx-flags | AV_CODEC_FLAG_LOW_DELAY; codec_ctx-thread_count 1; // 减少线程数显示格式不匹配 确保视频像素格式与LVGL显示格式匹配通常需要转换为RGB565// 在解码后添加格式转换 SwsContext *sws_ctx sws_getContext( codec_ctx-width, codec_ctx-height, codec_ctx-pix_fmt, display_width, display_height, AV_PIX_FMT_RGB565, SWS_BILINEAR, NULL, NULL, NULL);5. 性能优化与调试技巧在资源受限的RV1106上实现流畅的视频播放需要精心优化。以下是一些实用的优化技巧5.1 视频参数优化参数推荐值说明分辨率≤480pRV1106适合处理较低分辨率视频帧率15-24fps平衡流畅度和CPU负载编码格式H.264硬件加速支持更好码率≤1Mbps降低I/O和解码压力5.2 内存管理嵌入式系统内存有限需要特别注意帧缓冲重用避免频繁分配释放内存双缓冲技术减少显示撕裂内存池预分配关键数据结构示例内存池实现#define FRAME_POOL_SIZE 3 AVFrame *frame_pool[FRAME_POOL_SIZE]; void init_frame_pool() { for (int i 0; i FRAME_POOL_SIZE; i) { frame_pool[i] av_frame_alloc(); } } AVFrame *get_frame_from_pool() { // 简单的轮询分配 static int index 0; return frame_pool[(index) % FRAME_POOL_SIZE]; }5.3 多线程处理合理使用多线程可以提高性能但需要注意解码线程单独线程处理视频解码显示线程主线程负责UI刷新同步机制使用互斥锁保护共享资源示例线程模型pthread_t decode_thread; pthread_mutex_t frame_mutex; void *decode_func(void *arg) { while (running) { pthread_mutex_lock(frame_mutex); // 解码一帧视频 pthread_mutex_unlock(frame_mutex); usleep(1000); // 适当休眠 } return NULL; } void start_decode_thread() { pthread_mutex_init(frame_mutex, NULL); pthread_create(decode_thread, NULL, decode_func, NULL); }5.4 硬件加速RV1106具有视频解码硬件加速能力可以通过以下方式利用检查硬件解码支持cat /proc/cpuinfo dmesg | grep -i vpu使用FFmpeg硬件解码 在配置FFmpeg时启用硬件加速选项./configure --enable-omx --enable-omx-rk ...专用API调用 某些平台提供专用的硬件解码API可以显著提高性能。6. 实际应用案例让我们通过一个完整的视频播放器示例展示如何将上述技术整合到一起。6.1 播放器UI设计使用LVGL创建简单的播放器界面typedef struct { lv_obj_t *player; lv_obj_t *play_btn; lv_obj_t *stop_btn; lv_obj_t *progress; bool is_playing; } video_player_t; video_player_t *create_video_ui() { video_player_t *vp malloc(sizeof(video_player_t)); // 创建容器 lv_obj_t *cont lv_obj_create(lv_scr_act()); lv_obj_set_size(cont, 320, 240); lv_obj_center(cont); // 创建播放器区域 vp-player lv_ffmpeg_player_create(cont); lv_obj_set_size(vp-player, 300, 180); lv_obj_align(vp-player, LV_ALIGN_TOP_MID, 0, 10); // 创建控制按钮 vp-play_btn lv_btn_create(cont); lv_obj_align(vp-play_btn, LV_ALIGN_BOTTOM_LEFT, 10, -10); lv_obj_t *play_label lv_label_create(vp-play_btn); lv_label_set_text(play_label, Play); vp-stop_btn lv_btn_create(cont); lv_obj_align(vp-stop_btn, LV_ALIGN_BOTTOM_RIGHT, -10, -10); lv_obj_t *stop_label lv_label_create(vp-stop_btn); lv_label_set_text(stop_label, Stop); // 创建进度条 vp-progress lv_bar_create(cont); lv_obj_set_size(vp-progress, 280, 10); lv_obj_align(vp-progress, LV_ALIGN_BOTTOM_MID, 0, -30); vp-is_playing false; return vp; }6.2 播放控制逻辑实现基本的播放控制功能void play_btn_cb(lv_event_t *e) { video_player_t *vp lv_event_get_user_data(e); if (!vp-is_playing) { lv_ffmpeg_player_set_src(vp-player, /root/test.mp4); lv_ffmpeg_player_set_cmd(vp-player, LV_FFMPEG_PLAYER_CMD_START); vp-is_playing true; } } void stop_btn_cb(lv_event_t *e) { video_player_t *vp lv_event_get_user_data(e); if (vp-is_playing) { lv_ffmpeg_player_set_cmd(vp-player, LV_FFMPEG_PLAYER_CMD_STOP); vp-is_playing false; } } void setup_controls(video_player_t *vp) { lv_obj_add_event_cb(vp-play_btn, play_btn_cb, LV_EVENT_CLICKED, vp); lv_obj_add_event_cb(vp-stop_btn, stop_btn_cb, LV_EVENT_CLICKED, vp); }6.3 进度更新与状态显示实时更新播放进度和状态void update_progress(lv_timer_t *timer) { video_player_t *vp timer-user_data; if (vp-is_playing) { int64_t duration lv_ffmpeg_player_get_duration(vp-player); int64_t position lv_ffmpeg_player_get_position(vp-player); if (duration 0) { lv_bar_set_value(vp-progress, (position * 100) / duration, LV_ANIM_ON); } } } // 在主循环中添加定时器 lv_timer_create(update_progress, 100, vp);7. 高级功能扩展基础播放功能实现后可以考虑添加更多高级特性。7.1 网络视频流播放通过FFmpeg支持网络流媒体播放// RTSP流播放示例 lv_ffmpeg_player_set_src(player, rtsp://example.com/stream);需要注意确保RV1106网络连接稳定适当增加网络缓冲区大小处理网络中断情况7.2 视频滤镜应用利用FFmpeg的滤镜功能实现简单特效// 添加旋转滤镜 lv_ffmpeg_player_set_filter(player, transpose1); // 90度旋转 // 添加缩放滤镜 lv_ffmpeg_player_set_filter(player, scale160:120);7.3 音频同步处理如果需要音频支持可以扩展音频处理编译FFmpeg时启用音频支持添加音频设备初始化代码实现音视频同步逻辑音频初始化示例SDL_AudioSpec wanted_spec, spec; wanted_spec.freq 44100; wanted_spec.format AUDIO_S16SYS; wanted_spec.channels 2; wanted_spec.silence 0; wanted_spec.samples 1024; wanted_spec.callback audio_callback; if (SDL_OpenAudio(wanted_spec, spec) 0) { LV_LOG_ERROR(Failed to open audio: %s, SDL_GetError()); }7.4 性能监控与调优添加性能监控界面实时显示帧率(FPS)CPU使用率内存占用解码延迟实现示例void update_stats(lv_timer_t *timer) { static uint32_t last_time 0; static uint32_t frames 0; uint32_t current lv_tick_get(); if (current - last_time 1000) { float fps frames * 1000.0 / (current - last_time); lv_label_set_text_fmt(fps_label, FPS: %.1f, fps); last_time current; frames 0; } frames; }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2519886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…