编译支持 RKmpp 和 RGA 的 ffmpeg 源码

一、前言

        RK3588 支持VPU硬件解码,需要rkmpp进行调用;支持2D图像加速,需要 RGA 进行调用。

        这两个库均能通过 ffmpeg-rockchip 进行间接调用,编译时需要开启对应的功能。

二、依赖安装

        编译ffmpeg前需要编译 rkmpp 和 RGA,我尝试直接调用板端的库,ffmpeg 编译可以通过,但是使用 rkmpp 解码时会导致段错误,debug 发现是库调用相关的报错,应该是版本差距较大,所以建议下载最新的 rkmpp 和 RGA 进行编译。

1、编译RKmpp

源码来自大佬的GitHub:

https://github.com/nyanmisaka

git clone -b jellyfin-mpp --depth=1 https://github.com/nyanmisaka/mpp.git rkmpp
cd rkmmp
mkdir install
cmake . \-DCMAKE_INSTALL_PREFIX=$PWD/install \-DCMAKE_BUILD_TYPE=Release \-DBUILD_SHARED_LIBS=ON \-DBUILD_TEST=OFFmake -j $(nproc)
make install

我个人喜欢将编译后的库与板端隔离,防止破坏系统库的依赖,所以安装到当前 install 目录下。配置参数与源码的 WIKI 保持一致,省去了 pushd 指令。

2、编译RGA

编译 RGA 需要用到 meson 和 ninja,如果没有,可以直接安装:

sudo apt-get install meson
sudo apt install ninja-build

如果想编译 ninja 的最新源码,我这里也提供方法:

git clone git://github.com/ninja-build/ninja.git
cd ninja
./configure.py --bootstrap
(optional) cp ninja /usr/bin

编译 RGA:

git clone -b jellyfin-rga --depth=1 https://github.com/nyanmisaka/rk-mirrors.git rkrga
cd rkrga
mkdir install rkrga_build
# . 源代码目录,rkrga_build 是构建目录
meson setup . rkrga_build \--prefix=$PWD/install \--libdir=lib \--buildtype=release \--default-library=shared \-Dcpp_args=-fpermissive \-Dlibdrm=false \-Dlibrga_demo=false
meson configure rkrga_build
ninja -C rkrga_build install

源码也是出自 nyanmisaka 大佬。大佬的 WIKI 在源码的父目录进行编译,我这里改成了在源码下编译,看个人喜好。

3、编译 ffmpeg

git clone --depth=1 https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg
cd ffmpeg
mkdir install
./configure --prefix=$PWD/install --enable-gpl --enable-version3 \
--enable-libdrm --enable-rkmpp --enable-rkrga \
--extra-cflags="-I$(pwd)/../rkmpp/install/include/rockchip -I$(pwd)/../rkrga/install/include/rga" \
--extra-ldflags="-L$(pwd)/../rkmpp/install/lib -L$(pwd)/../rkrga/install/lib -Wl,-rpath,$(pwd)/../rkmpp/install/lib:$(pwd)/../rkrga/install/lib -lrockchip_mpp -lrga"make -j $(nproc)
make install

        这里我主要是增加了动态库和头文件的搜索路径,指定为刚刚编译的 RKmpp 和 RGA。另外使用-Wl,-rpath指定了运行时库的搜索路径,防止使用系统的库。

三、验证

        (1)在 ffmpeg 源码目录下,查看编译后的支持情况:

./ffmpeg -decoders | grep rkmpp # 查看是否有 rk 的解码器
./ffmpeg -encoders | grep rkmpp # 查看是否有 rk 的编码器
./ffmpeg -filters | grep rkrga # 查看是否有 rk 的 rga

输出分别为:

V..... av1_rkmpp            Rockchip MPP (Media Process Platform) AV1 decoder (codec av1)V..... h263_rkmpp           Rockchip MPP (Media Process Platform) H263 decoder (codec h263)V..... h264_rkmpp           Rockchip MPP (Media Process Platform) H264 decoder (codec h264)V..... hevc_rkmpp           Rockchip MPP (Media Process Platform) HEVC decoder (codec hevc)V..... mpeg1_rkmpp          Rockchip MPP (Media Process Platform) MPEG1VIDEO decoder (codec mpeg1video)V..... mpeg2_rkmpp          Rockchip MPP (Media Process Platform) MPEG2VIDEO decoder (codec mpeg2video)V..... mpeg4_rkmpp          Rockchip MPP (Media Process Platform) MPEG4 decoder (codec mpeg4)V..... vp8_rkmpp            Rockchip MPP (Media Process Platform) VP8 decoder (codec vp8)V..... vp9_rkmpp            Rockchip MPP (Media Process Platform) VP9 decoder (codec vp9)
V..... h264_rkmpp           Rockchip MPP (Media Process Platform) H264 encoder (codec h264)V..... hevc_rkmpp           Rockchip MPP (Media Process Platform) HEVC encoder (codec hevc)V..... mjpeg_rkmpp          Rockchip MPP (Media Process Platform) MJPEG encoder (codec mjpeg)
 ... overlay_rkrga     VV->V      Rockchip RGA (2D Raster Graphic Acceleration) video compositor... scale_rkrga       V->V       Rockchip RGA (2D Raster Graphic Acceleration) video resizer and format converter... vpp_rkrga         V->V       Rockchip RGA (2D Raster Graphic Acceleration) video post-process (scale/crop/transpose)

        (2)如果有视频文件,可以执行以下指令测试硬件解码:

./ffmpeg -c:v h264_rkmpp -i 720p60hz.mp4 -f null -

在 Stream mapping 部分可以查看使用的解码方式,输出为(h264_rkmpp)。

Stream mapping:Stream #0:0 -> #0:0 (h264 (h264_rkmpp) -> wrapped_avframe (native))Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))

        (3)测试 RGA 需要初始化硬件设备,不能只设置过滤器。

ffmpeg -init_hw_device rkmpp=hw -filter_hw_device hw \
-c:v h264_rkmpp -i 720p60hz.mp4 \
-vf "hwupload,scale_rkrga=w=1920:h=1080:format=nv12" \
-f null -

-init_hw_device rkmpp=hw 初始化一个名为hw的 RKMPP 硬件设备;

-filter_hw_device hw指定过滤器链使用之前初始化的硬件设备hw;

-vf hwupload,scale_rkrga=w=1920:h=1080:format=nv12 将输入的视频帧上传到硬件设备(RKMPP),使用 RKMP 提供的 scale_rkrga 过滤器将视频帧缩放到 1920x1080 分辨率,并转换像素格式为 NV12。

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

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

相关文章

数据科学/数据分析暑期实习题目汇总

文章目录 1. 孤立森林算法2. python私有属性代码解释1. 类的定义2. 构造方法 `__init__`3. 创建类的实例4. 访问私有属性总结python列表拷贝代码示例与分析内存地址不同的原因验证对其中一个列表修改不会影响另一个列表记录一些值得记录的题目。 1. 孤立森林算法 异常点判断的…

Java多线程与高并发专题——原子类和 volatile、synchronized 有什么异同?

原子类和 volatile异同 首先,通过我们对原子类和的了解,原子类和volatile 都能保证多线程环境下的数据可见性。在多线程程序中,每个线程都有自己的工作内存,当多个线程访问共享变量时,可能会出现一个线程修改了共享变…

207、【图论】孤岛的总面积

题目 思路 相比于 206、【图论】岛屿数量,就是在这个代码的基础上。先遍历边界,将边界连接的岛屿变为0,然后再计算一遍当前为1的岛屿面积。 代码实现 import collectionsn, m list(map(int, input().split())) graph []for _ in range(n…

大模型最新面试题系列:微调篇之微调基础知识

一、全参数微调(Full-Finetune) vs 参数高效微调(PEFT)对比 1. 显存使用差异 全参数微调:需存储所有参数的梯度(如GPT-3 175B模型全量微调需约2.3TB显存)PEFT:以LoRA为例&#xff…

【GPT入门】第21课 langchain核心组件

【GPT入门】第21课 langchain核心组件 1. langchain 核心组件2.文档加载器 Document loader3.文档处理器3.1 langchain_text_splitters3.3 FAISS向量数据库和向量检索主要作用应用场景4. 对话历史管理1. langchain 核心组件 模型 I/O 封装 LLMs:大语言模型 Chat Models:一般…

应急响应靶机练习-Linux2

1.背景 前景需要:看监控的时候发现webshell告警,领导让你上机检查你可以救救安服仔吗!! 挑战内容: (1)提交攻击者IP (2)提交攻击者修改的管理员密码(明文) (…

分享一个免费的CKA认证学习资料

关于CKA考试 CKA(Certified Kubernetes Administrator)是CNCF基金会(Cloud Native Computing Foundation)官方推出的Kubernetes管理员认证计划,用于证明持有人有履行Kubernetes管理的知识,技能等相关的能力…

【PTA题目解答】7-2 简化的插入排序(15分)

1.题目 本题要求编写程序&#xff0c;将一个给定的整数插到原本有序的整数序列中&#xff0c;使结果序列仍然有序。 输入格式&#xff1a; 输入在第一行先给出非负整数N&#xff08;<10&#xff09;&#xff1b;第二行给出N个从小到大排好顺序的整数&#xff1b;第三行给…

【最新】 ubuntu24安装 1panel 保姆级教程

系统&#xff1a;ubuntu24.04.1 安装软件 &#xff1a;1panel 第一步&#xff1a;更新系统 sudo apt update sudo apt upgrade 如下图 第二步&#xff1a;安装1panel&#xff0c;运行如下命令 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o …

UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法

有些差异 这么牛逼的引擎&#xff0c;居然有这种入门级别的问题&#xff0c;一触发清理&#xff0c;大概率(80%)会崩溃 无论虚幻5还是UE4都有这个问题&#xff0c;挺烦人的 实在忍不了了&#xff0c;这次&#xff0c;今天 就想问问有什么好的处理方法么&#xff1f;&#x…

【微服务】Nacos 配置动态刷新(简易版)(附配置)

文章目录 1、实现方法2、配置依赖 yaml3、验证效果 1、实现方法 环境&#xff1a;Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id属性下配置refresh:true来实现动态更新 2、配置依赖 yaml 具体的版本参考官方的说明&#xff1a;官方版本说明 <!--读取boo…

设计模式之备忘录设计模式

备忘录设计模式&#xff08;Memento Pattern&#xff09; 在不破坏封闭的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;保存对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;又叫做快照模式&#xff0c;属于行为模式备忘录模式实现的方式需要保证被保…

pytest 框架学习总结

视频&#xff1a;pytest01-快速上手_哔哩哔哩_bilibili 资料&#xff1a;pytest 框架 - 白月黑羽 基于 Python 语言的自动化测试框架 最知名的 有如下 3 款unittest、pytest、robotframework 前两款框架主要&#xff08;或者说很大程度上&#xff09;是 聚焦 在 白盒单元测试…

Day16:最小的k个数

仓库管理员以数组 stock 形式记录商品库存表&#xff0c;其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量&#xff0c;返回 顺序不限。 示例 1&#xff1a; 输入&#xff1a;stock [2,5,7,4], cnt 1 输出&#xff1a;[2]示例 2&#xff1a; 输入…

【最后203篇系列】016 Q201架构思考

前言 Q200已经达到了我既定的目标&#xff0c;在最近的3个月&#xff0c;我需要进一步完善&#xff0c;达到可以试产的程度。 在这个过程当中&#xff0c;许多知识和体会一直在变。 qtv200到目前&#xff0c;虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…

音视频入门基础:RTP专题(20)——通过FFprobe显示RTP流每个packet的信息

通过FFprobe命令&#xff1a; ffprobe -protocol_whitelist "file,rtp,udp" -of json -show_packets XXX.sdp 可以显示SDP描述的RTP流每个packet&#xff08;数据包&#xff09;的信息&#xff1a; 对于RTP流&#xff0c;上述的“packet”&#xff08;数据包&#…

信息系统运行管理员教程6--信息系统安全

信息系统运行管理员教程6–信息系统安全 第1节 信息系统安全概述 1.信息系统安全的概念 信息系统安全是指保障计算机及其相关设备、设施&#xff08;含网络&#xff09;的安全&#xff0c;运行环境的安全&#xff0c;信息的安全&#xff0c;实现信息系统的正常运行。信息系统…

LLM后训练:解锁大型语言模型推理能力的关键路径

引言&#xff1a;从语言生成到逻辑推理的跃迁 大型语言模型&#xff08;LLMs&#xff09;通过预训练掌握了海量语言模式&#xff0c;但其核心缺陷——幻觉、逻辑断裂、价值观偏差——暴露了单纯预训练的局限性。后训练&#xff08;Post-Training&#xff09;作为预训练后的精修…

9.贪心算法

简单贪心 1.P10452 货仓选址 - 洛谷 #include<iostream> #include<algorithm> using namespace std;typedef long long LL; const int N 1e510; LL a[N]; LL n;int main() {cin>>n;for(int i 1;i < n;i)cin>>a[i];sort(a1,a1n);//排序 LL sum 0…

Linux 网络:skb 数据管理

文章目录 1. 前言2. skb 数据管理2.1 初始化2.2 数据的插入2.2.1 在头部插入数据2.2.2 在尾部插入数据 2.2 数据的移除 3. 小结 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. skb 数据管理 数…