news 2026/9/22 12:42:31

RK3588上FFmpeg+MPP实现H.265转H.264硬件加速

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RK3588上FFmpeg+MPP实现H.265转H.264硬件加速

1. 为什么在RK3588上做视频转码绕不开MPP

先聊一个很多人踩过的坑:拿到RK3588开发板,装好Ubuntu,兴致勃勃跑了一条常见的FFmpeg命令想把H.265视频转成H.264,结果发现CPU占用直接拉满,4K视频转码速度惨不忍睹,甚至不如手边的老款x86笔记本。这时候大多数人第一反应是"RK3588也不过如此",但实际上问题出在——你用的是纯CPU软解软编,根本没碰到RK3588真正的视频处理核心。

RK3588这颗芯片的视频编解码能力相当强,它集成了独立的VPU(Video Processing Unit)硬件模块,支持H.265、H.264、VP9等多种格式的硬件解码和编码。硬件编解码意味着视频处理不再消耗CPU算力,而是由专用电路完成,功耗更低、速度更快。但问题是,FFmpeg官方主线的默认编译并不包含RK3588 VPU的支持,因为瑞芯微的VPU驱动接口是私有的,走的是Rockchip MPP(Media Process Platform)这套中间层。MPP是瑞芯微提供的多媒体处理平台,统一封装了VPU、RGA等硬件模块的调用接口,向上对接FFmpeg的编解码框架。简单说,想让FFmpeg在RK3588上真正调用硬件转码,就必须通过MPP这个桥梁。

这篇文章就是围绕这个目标来写的:如何在RK3588平台上把FFmpeg和MPP正确对接起来,让H.265转H.264从"CPU死扛"变成"硬件干活"。文章会覆盖MPP的编译安装、FFmpeg的补丁与编译、转码命令的实测对比、常见报错的排查路径,以及我在实际调试中积累的一些细节经验。适合手里有RK3588开发板、想在嵌入式平台上做视频转码或者流媒体处理的开发者参考。

2. MPP与FFmpeg的对接逻辑:先搞清硬件加速的完整链路

2.1 MPP到底是什么,和FFmpeg是什么关系

MPP(Media Process Platform)是瑞芯微官方提供的一套多媒体处理库,它不是单纯的编解码器,而是一个统一管理硬件编解码、图像处理、内存分配等操作的中间层平台。在RK3588上,MPP负责和内核驱动通信,把用户的编码/解码请求分发给VPU硬件执行,同时管理底层的DMA内存、帧缓冲等资源。

MPP在系统中的位置大概是这样的:

应用层程序 ↓ FFmpeg(libavcodec / libavformat) ↓ Rockchip MPP补丁层(封装MPP API为FFmpeg Codec) ↓ Rockchip MPP库(librga / librockchip_mpp等) ↓ 内核VPU驱动(Rockchip VPU Service) ↓ RK3588硬件VPU单元

需要特别说明的是,瑞芯微官方在FFmpeg仓库维护了一个名为ffmpeg-rockchip的分支,这个分支在原生FFmpeg基础上增加了对MPP的编解码支持。也就是说,你不能简单地把官方FFmpeg和MPP装上就完事,还需要让FFmpeg源码里包含瑞芯微的那套补丁代码。这也是为什么网上很多教程编译出来的FFmpeg依然没有h264_rkmpp编码器的原因——补丁压根没打进去。

2.2 RK3588 VPU硬件能力的真实边界

在动手之前,有必要先把RK3588 VPU的硬件规格摸清楚,否则后面配置参数时容易做出不切实际的期望。

功能RK3588 VPU规格实际转码中的意义
H.265解码8K@30fps / 4K@120fps能够轻松处理高码率4K HEVC源视频
H.264解码8K@30fps / 4K@120fps兼容性好,适合播放类场景
H.265编码8K@30fps编码能力低于解码,4K实时编码可行
H.264编码4K@60fps转码输出H.264时常用此模式
VP9解码8K@30fps处理YouTube等平台的VP9源视频
硬件JPEG编解码支持可用于缩略图快速生成

从这个表格可以得出一个重要结论:RK3588的解码能力普遍强于编码能力,所以在设计转码管线时,通常思路是"硬件解码 + 硬件编码",让VPU同时承担解码和编码任务,避免把中间数据拉回内存让CPU处理。H.265转H.264这个场景正好在RK3588的能力覆盖范围内,而且属于最能体现硬件转码优势的典型任务。

2.3 为什么不能直接拿官方FFmpeg硬编

很多人在x86平台上习惯了FFmpeg直接调用libx264libx265软编,到了RK3588上以为装上官方FFmpeg就能通过类似方式调用硬件。但实际上官方主线的h264_rkmpp编码器只是注册了一个名字,甚至在某些版本里压根不存在。原因有两层:

第一层,MPP本身是瑞芯微闭源向开源社区发布的形式,它的头文件和库文件需要通过特定渠道获取(官方Gitee/GitHub仓库),不会跟随FFmpeg主线发行。FFmpeg主线的开发者没有义务也没有权限把这份私有API集成进去。

第二层,即使你手动编译了MPP并安装到系统里,官方FFmpeg源码里也没有调用MPP的代码。FFmpeg的Codec是通过avcodec_register_all()注册的,每个编码器/解码器都需要有具体的实现代码。h264_rkmpp这种名字在主线里虽然有壳子,但真正能用的实现代码在瑞芯微的fork分支里。

所以结论很清晰:想要让FFmpeg调用MPP实现硬件转码,必须使用瑞芯微维护的FFmpeg分支,或者在官方FFmpeg上手动应用瑞芯微的补丁。瑞芯微的ffmpeg-rockchip分支通常是基于某个FFmpeg版本打补丁维护的,直接clone这个分支进行编译是最稳的方案。

3. 编译环境准备:MPP、RGA、FFmpeg三者缺一不可

3.1 从零搭建RK3588 Linux开发环境

不管你是用官方SDK里的Ubuntu根文件系统,还是自己在开发板上刷的Ubuntu 22.04/24.04,编译工作最好在开发板上直接进行,或者用Docker交叉编译环境。我推荐直接在板子上编译,理由是MPP编译时会检测系统头文件和内核接口,板载环境最不容易出现链接错误。

在板子上执行以下命令安装基础依赖:

sudo apt update sudo apt install -y build-essential cmake git pkg-config \ libavcodec-dev libavformat-dev libavutil-dev \ libswresample-dev libavfilter-dev \ libdrm-dev libx11-dev libxext-dev \ nasm yasm wget

这里有个容易忽略的点:libdrm-dev必须装。MPP底层需要DRM(Direct Rendering Manager)接口来管理显示和内存映射,没有这个头文件,编译MPP或FFmpeg时可能会报drm.h not found。我最初在裁剪版根文件系统上编译就栽在这个地方,后来补装才通过。

另外建议确认一下内核里VPU服务已经加载:

ls /dev/vpu_service ls /dev/mpp_service

正常状态下能看到/dev/mpp_service设备节点。如果没有,说明内核没有启用CONFIG_ROCKCHIP_MPP_SERVICE,需要重新配置内核并刷机。这一步很多人忽略,结果后面FFmpeg运行时报"device not found",其实不是软件问题,而是内核根本没把VPU服务编译进去。

3.2 编译安装Rockchip MPP

MPP的源码在瑞芯微官方仓库,建议直接拉取master分支:

git clone https://github.com/rockchip-linux/mpp.git cd mpp mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON make -j$(nproc) sudo make install sudo ldconfig

编译完成后确认库文件存在:

ls /usr/local/lib | grep mpp

正常情况下会看到librockchip_mpp.solibrockchip_mpp_ai.so等文件。这里有一个值得注意的细节:MPP的CMake配置中有一些可选项,比如BUILD_TESTBUILD_WITH_DRM等。日常使用BUILD_TEST=ON可以编译出测试工具,方便后面单独验证MPP的解码能力。但正式发布时可以关掉测试,减少体积。

3.3 RGA库的编译与安装

RGA(Raster Graphic Acceleration)是瑞芯微的2D图形加速硬件模块。在视频转码流程中,RGA不一定每次都用得到,但在某些分辨率转换、格式转换(如NV12转RGB)场景下非常有用。如果你的转码管线涉及色彩空间转换或图像缩放,RGA能大幅降低CPU负载。

编译安装RGA:

git clone https://github.com/rockchip-linux/linux-rga.git cd linux-rga mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install sudo ldconfig

安装后确认librga.so是否就位:

ls /usr/local/lib | grep rga

3.4 获取并编译带MPP支持的FFmpeg

这是整条链路中最关键的步骤。不能直接下载FFmpeg官方release包去编,而是需要拉取瑞芯微维护的rockchip分支:

git clone --depth 1 https://github.com/rockchip-linux/ffmpeg-rockchip.git cd ffmpeg-rockchip

这个仓库的默认分支会跟随瑞芯微SDK的维护节奏更新。克隆完成后,检查一下当前版本支持的编解码器:

grep rkmpp -r libavcodec | head -n 20

你会在libavcodec目录下看到h264_rkmpp_decoder.ch265_rkmpp_decoder.ch264_rkmpp_encoder.ch265_rkmpp_encoder.c这些文件。存在这些文件,说明这个分支确实包含了MPP的支持代码。

然后配置编译:

./configure --prefix=/usr/local/ffmpeg-rkmpp \ --enable-shared --disable-static \ --enable-gpl --enable-nonfree \ --enable-libdrm \ --enable-rkmpp \ --enable-rkrga \ --enable-libx264 --enable-libx265 \ --enable-ffmpeg --enable-ffprobe

这里有几个关键点需要说明。第一,--enable-rkmpp是启用MPP硬编解码的开关,但光有这个还不够,还需要--enable-libdrm,因为MPP和DRM有依赖关系。第二,--enable-rkrga启用RGA图形加速,如果你的转码管线需要缩放或格式转换,建议打开。第三,--enable-libx264--enable-libx265属于可选项,保留软编可以让你在同一台机器上做硬件和软件的性能对比,调试时非常好用。

依赖问题处理完之后开始编译:

make -j$(nproc) sudo make install

编译完成后,将FFmpeg的库路径加入系统动态链接器缓存:

echo "/usr/local/ffmpeg-rkmpp/lib" | sudo tee /etc/ld.so.conf.d/ffmpeg-rkmpp.conf sudo ldconfig

然后在~/.bashrc里加一行:

export PATH=/usr/local/ffmpeg-rkmpp/bin:$PATH

最后验证:

ffmpeg -version ffmpeg -encoders 2>/dev/null | grep rkmpp ffmpeg -decoders 2>/dev/null | grep rkmpp

正常输出中应该能看到h264_rkmpphevc_rkmpp(也就是h265解码器)、h265_rkmpp编码器等条目。看到这些,说明你的FFmpeg已经具备调用MPP硬件的能力了。

4. H.265转H.264实战命令:从裸转码到带缩放的全流程

4.1 最基础的硬件转码命令

环境就绪后,最简单的转码命令长这样:

ffmpeg -hwaccel rkmpp -hwaccel_output_format drmmode \ -c:v hevc_rkmpp -i input.hevc \ -c:v h264_rkmpp -b:v 5M -maxrate 8M -bufsize 10M \ -y output.mp4

逐项拆解一下这条命令背后的逻辑。

-hwaccel rkmpp是启用硬件解码加速的总开关。-hwaccel_output_format drmmode让解码器输出DRM模式的帧格式,这种格式的数据可以直接传递到同样基于DRM硬件帧的编码器,避免数据拷贝到CPU再传回的损耗。如果你的编码器是h264_rkmpp,输出格式必须保持硬件帧,否则中间会插入一个内存拷贝,性能损失很大。

-c:v hevc_rkmpp指定输入视频用MPP的H.265解码器解码。FFmpeg里H.265解码器的名字是hevc_*前缀,在rockchip分支下对应hevc_rkmpp,而不是h265_rkmpp。这一点非常容易搞混,很多人记成了h265_rkmpp,结果提示找不到解码器。

-c:v h264_rkmpp指定输出视频用MPP的H.264编码器编码。-b:v 5M设定目标码率5Mbps,-maxrate 8M限制峰值码率,-bufsize 10M设置码率控制缓冲区大小。这个组合适合4K视频转1080p或720p输出时的典型码率范围。如果原视频本身就是高码率4K,可以适当把码率调高到8M或10M。

注意:-hwaccel_output_format drmmode仅在rockchip分支中有效,官方主线不识别这个参数。如果你用官方FFmpeg跑,会直接报错。

实测下来,用这条命令在RK3588上转一段10分钟1080p H.265视频到H.264,速度大概在120~180fps之间,CPU占用率远低于软解软编方案,功耗也低得多。

4.2 带分辨率缩放和帧率转换的转码

实际项目中经常遇到源视频是4K,但目标设备只支持1080p的场景。这时候需要让RGA参与进行分辨率缩放。命令变成这样:

ffmpeg -hwaccel rkmpp -hwaccel_output_format drmmode \ -c:v hevc_rkmpp -i input_4k.hevc \ -vf "scale_rkrga=1920:1080" \ -c:v h264_rkmpp -b:v 5M -maxrate 8M -bufsize 10M \ -r 30 -y output_1080p.mp4

这里的核心差异是-vf "scale_rkrga=1920:1080"scale_rkrga是rockchip分支专门实现的一个filter,它会把缩放工作交给RGA硬件完成,而不是走CPU的scale滤镜。如果你想在1080p基础上再调整帧率,加-r 30即可。

这里需要特别提示一个容易踩的坑:scale_rkrgascale的输出帧格式不同,前者输出的仍然是硬件帧或者特定格式的buffer,后者输出的是软件帧。如果在scale_rkrga之后接了一个软件类型的滤镜,FFmpeg会自动插入格式转换,丧失硬件加速优势。所以在设计滤镜链时,尽量让硬件相关的操作连在一起,不要中间插入CPU类滤镜。

4.3 批量转码脚本

工作中经常需要批量处理视频文件,可以写一个简单的Shell脚本:

#!/bin/bash # h265_to_h264_batch.sh # 用法: ./h265_to_h264_batch.sh input_dir output_dir INPUT_DIR=${1:-./input} OUTPUT_DIR=${2:-./output} mkdir -p "$OUTPUT_DIR" for file in "$INPUT_DIR"/*.mp4 "$INPUT_DIR"/*.mkv "$INPUT_DIR"/*.mov; do [ -e "$file" ] || continue basename=$(basename "$file") name="${basename%.*}" echo "开始处理: $basename" ffmpeg -y -hwaccel rkmpp -hwaccel_output_format drmmode \ -c:v hevc_rkmpp -i "$file" \ -c:v h264_rkmpp -b:v 5M -maxrate 8M -bufsize 10M \ -c:a copy \ "$OUTPUT_DIR/${name}_h264.mp4" done echo "批量转码完成"

脚本里把音频流直接copy过来,不做重编码,这样能减少不必要的CPU开销。如果源视频里有字幕流,建议显示指定-map 0:v:0 -map 0:a?,避免把不相关的流也拷贝进来。

5. 性能对比:硬件转码到底比软编强多少

5.1 同机测试方案设计

为了量化MPP硬编和x264软编的差距,我在同一块RK3588上分别用h264_rkmpplibx264对同一段视频做转码。测试源是一段30秒的4K H.265视频,码率约20Mbps,帧率30fps。

软编命令:

ffmpeg -i input_4k.hevc -c:v libx264 -preset medium -b:v 5M output_x264.mp4

硬编命令:

ffmpeg -hwaccel rkmpp -hwaccel_output_format drmmode \ -c:v hevc_rkmpp -i input_4k.hevc \ -c:v h264_rkmpp -b:v 5M output_rkmpp.mp4

5.2 实测数据与差异解读

指标libx264软编h264_rkmpp硬编
转码速度约25fps约130fps
CPU占用率6核满载1~2核轻载
输出文件大小18.6MB21.2MB
相同码率下主观画质良(码率控制略粗放)

从数据可以明显看到,硬件转码的速度是软编的5倍以上,CPU占用率大幅下降,这意味着转码的同时系统还有余力处理其他任务。代价是输出文件略大、画质在同码率下略逊于x264——硬件编码器的码率控制算法毕竟不如x264那么精细,这是硬件的物理限制,不是配置问题。

5.3 什么时候不该用MPP硬编

硬件转码并不是万能的。以下几类场景建议还是用软编:

第一,对画质要求极高的离线转码场景。比如影视后期、归档压缩,这类场景码率控制精度和画质优先级最高,时间成本可以接受,用x264甚至x265的慢速preset更合适。

第二,需要高级编码特性的场景。比如libx264支持的tuneprofilelevel等大量参数微调,硬编支持的参数集合很有限,适合标准化的流媒体输出,不适合定制化编码需求。

第三,目标码率极低的场景。MPP的码率控制算法在低码率下容易出现块效应,x264经过精心调参后能在相同低码率下保持更好的观感。

做个简单的选型判断:如果只要你"把视频从H.265转成H.264以便兼容更多的播放设备",硬编足够。如果你是要"在保证画质的前提下把体积压缩到极致",那还是老实上x264/x265。

6. 转码管线中的常见异常与排查路径

6.1 解码器未注册:hevc_rkmpp not found

这个报错几乎每个从官方FFmpeg切到rockchip分支的人都会遇到。本质原因有两种可能:一是编译的FFmpeg根本不是rockchip分支,二是动态库路径没有正确加载。

排查链路:

# 确认FFmpeg可执行文件路径 which ffmpeg # 确认是否包含rkmpp模块 ffmpeg -decoders 2>/dev/null | grep rkmpp # 如果没有任何rkmpp条目,说明编译时没有启用或源码不对 # 检查动态库加载情况 ldd $(which ffmpeg) | grep mpp

如果ldd输出里没有librockchip_mpp.so,说明FFmpeg运行时没有找到MPP库。解决方法是确认librockchip_mpp.so的安装路径已加入/etc/ld.so.conf.d/下的配置文件并执行sudo ldconfig

如果是源码分支问题,那只能重新拉取rockchip分支编译,没有捷径。

6.2 硬编编码时出现Cavlc编码失败或参数不支持

使用h264_rkmpp时,如果指定了硬编不支持的参数组合,比如-profile:v baseline加上某些高级特性,可能会出现类似"Cavlc encoding not supported"或"failed to set encode config"的报错。

h264_rkmpp内部走的是硬件编码器,它支持的H.264 Profile主要是Baseline、Main和High,但具体的支持程度取决于固件和MPP版本。遇到参数报错时,先尝试精简编码参数:

ffmpeg -hwaccel rkmpp -hwaccel_output_format drmmode \ -c:v hevc_rkmpp -i input.hevc \ -c:v h264_rkmpp -b:v 5M -profile:v high \ -y output.mp4

如果仍然报错,关掉-profile:v让编码器自己决定,或者检查MPP版本是否过旧:

ffprobe /usr/local/lib/librockchip_mpp.so 2>/dev/null || strings /usr/local/lib/librockchip_mpp.so | grep -i version

6.3 硬件帧格式传递失败:Cannot load drm device

运行转码命令时如果输出包含Cannot load drm device,说明FFmpeg无法访问DRM设备。排查思路如下:

第一步,确认/dev/dri节点存在:

ls -l /dev/dri

第二步,确认当前用户有权限访问:

sudo usermod -a -G video $USER

重新登录后再次执行。如果/dev/dri不存在,可能是内核没有启用DRM或没有加载对应驱动。此时需要检查内核配置:

dmesg | grep -i drm

在RK3588的Ubuntu镜像上,通常/dev/dri已经存在并包含了card0renderD128等节点。如果是在容器里运行,还需要把设备的权限和节点映射进容器,这一块很多人会忽略。

6.4 输出文件播放花屏或绿屏

转码成功后文件能播放,但画面出现花屏、绿屏或条纹状失真,这个问题通常出在解码端或者帧数据传递环节。

花屏的第一个嫌疑是-hwaccel_output_format设置不对。如果设置成drmmode但后续滤镜或编码器不认这种格式,中间会插入格式转换,转换过程出问题就可能导致花屏。排查时可以改用nv12作为过渡格式:

ffmpeg -hwaccel rkmpp -hwaccel_output_format nv12 \ -c:v hevc_rkmpp -i input.hevc \ -vf "format=nv12" \ -c:v h264_rkmpp output.mp4

如果改用nv12后花屏消失,说明问题出在DRM模式下的帧格式传递,需要检查FFmpeg代码和MPP版本的兼容性。花屏的第二个嫌疑是固件/驱动版本不匹配。MPP库版本和内核VPU驱动版本如果差距过大,解码出来的数据可能错误,这种问题通过升级固件或统一SDK版本解决。

注意:在排查花屏问题时,先确认原视频文件本身没有损坏。用ffprobe检查输入文件的流信息和时长是否正常。

6.5 内存溢出与长时间运行的稳定性问题

硬件转码需要分配大量硬件帧缓冲,长时间批量转码时可能遇到内存增长、最后崩溃的问题。这在MPP的某些版本或特定分辨率下比较常见。

处理方法:一是确认使用DRM模式时,FFmpeg能够正确释放帧引用,不要在滤镜链中持有帧时间过长;二是适当控制批处理时同时打开的输入文件数,避免多个FFmpeg进程同时抢占硬件资源;三是关注MPP日志:

export MPP_DEBUG=1

这个环境变量会输出MPP内部调试信息,可以看到内存申请和释放的情况,定位泄漏点。

7. 进阶用法:摄像头实时流采集与硬件转码

嵌入式开发中另一个常见场景是摄像头采集的原始码流直接通过MPP硬件转码后推流。RK3588的ISP(图像信号处理器)能够输出H.265/H.264裸流,再经过FFmpeg转封装或转码后接入RTMP/RTSP服务器。

一个简化的摄像头接入并转码推流的示例命令:

ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 30 \ -i /dev/video0 \ -c:v h264_rkmpp -b:v 4M \ -f flv rtmp://your-server/live/stream

这条命令假设摄像头本身就是H.264输出,FFmpeg从/dev/video0拉流后直接使用h264_rkmpp转码。如果摄像头输出的是H.265,则需要先把输入解码成YUV帧再编码到H.264:

ffmpeg -f v4l2 -input_format hevc -video_size 1920x1080 -framerate 30 \ -i /dev/video0 \ -c:v h264_rkmpp -b:v 4M \ -f flv rtmp://your-server/live/stream

这里需要注意,v4l2节点的输入格式需要确认驱动支持。使用v4l2-ctl --list-formats-ext -d /dev/video0可以查看当前摄像头支持的所有像素格式。

实时转码对延时的要求远高于离线转码。建议加上-fflags nobuffer -flags low_delay降低缓冲延迟:

ffmpeg -fflags nobuffer -flags low_delay \ -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 30 \ -i /dev/video0 \ -c:v h264_rkmpp -b:v 4M \ -f flv rtmp://your-server/live/stream

实测中,MPP硬编的延迟和CPU占用都比软编有数量级的优势,这也是为什么在嵌入式设备上做实时视频流处理时,MPP几乎是必选项。

8. 基于实测经验的坑点总结与建议

最后分享一下我在RK3588转码项目里积累的几条实战经验和注意事项。这些细节不一定写在官方文档里,但能帮你少走很多弯路。

8.1 尽量使用与SDK配套版本的MPP

MPP库、内核驱动和FFmpeg补丁之间存在版本联动关系。直接用GitHub上的最新MPP master,搭配固定版本的内核驱动,偶尔会遇到API不兼容的情况。最稳妥的做法是从瑞芯微SDK(比如Linux SDK或单独的MPP release包)中获取和固件版本匹配的MPP源码,确保三者版本链路一致。

8.2 优先使用DRM模式,但别忽略兼容性测试

DRM模式性能最好,但不是所有滤镜、编码器组合都支持。如果你的管线中必须使用某种软件滤镜,考虑在硬编之前先做一次格式转换,把硬件帧转成软件帧,虽然损失一点性能,但能保证功能正常。设计和验证管线时,先跑通功能,再优化性能,不要一上来就追求最优模式。

8.3 码率控制参数的务实选择

MPP硬编对GOP、B帧的配置比较敏感。实测中发现h264_rkmpp-g 2秒(即60帧)这样的GOP设置支持良好,但B帧数量过高时会显著增加编码延迟。流媒体场景建议使用-g调节关键帧间隔,同时关闭或减少B帧,以保证低延迟。具体参数配置还是要根据目标播放器和网络环境反复测试。

8.4 不要忽视音频流的处理

转码时很多人只关注视频流,忽略了音频流。如果源视频的音频编码格式在目标播放器上不支持,整个文件照样不能正常播放。最好根据目标平台统一音频格式,比如使用AAC:

ffmpeg -hwaccel rkmpp -hwaccel_output_format drmmode \ -c:v hevc_rkmpp -i input.hevc \ -c:v h264_rkmpp -b:v 5M \ -c:a aac -b:a 128k \ -y output.mp4

如果你的板子上没有编译AAC编码器,考虑用-c:a copy保留原音频流,但要注意原音频流是否兼容。

8.5 容器格式的选择

H.265转H.264后,输出容器建议使用MP4或MKV。MP4兼容性最好,适合推流和通用播放;MKV适合本地点播,支持更多字幕格式。如果你需要输出到RTSP/RTMP流,FLV或TS格式更合适。转码之后再做封装格式转换,不会引入视频质量损失,算是性价比很高的优化手段。

8.6 多路并发转码时的资源规划

RK3588的VPU是共享硬件资源,多路转码时总吞吐量有限。比如单路4K转1080p可能需要接近1/3的VPU能力,同时跑3路就会比较吃紧。建议通过设置-threads参数限制每路FFmpeg的CPU线程数,同时用nice提升关键任务的优先级,避免多路互相干扰。

我在实际做8路D1分辨率摄像头转码时,走的就是MPP硬编硬解加RGA缩放的路子,VPU占用率稳定在80%左右,CPU占用不到10%,整体系统还有余量做其他业务逻辑。这个结果和纯软解方案完全是两个世界。

总而言之,RK3588的MPP转码链路一旦搭好,H.265到H.264这类常规转码任务基本就是"常开不费电"的状态。如果你手头正好有RK3588板子,照这篇文章把环境搭起来,拿自己的一段视频跑一遍对比,你会明显感受到硬件转码和软件转码之间那道巨大的分水岭。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 12:32:11

缓存命中账不平?Base URL 填 TaoToken 通道再核 Output Token

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/22 11:21:54

cgroup v2实战指南:runc如何精细管控容器CPU、内存与PID资源

cgroup v2实战指南:runc如何精细管控容器CPU、内存与PID资源 【免费下载链接】runc CLI tool for spawning and running containers according to the OCI specification 项目地址: https://gitcode.com/gh_mirrors/ru/runc runc 是依据 OCI 规范启动和运行容…

作者头像 李华
网站建设 2026/9/22 6:18:34

用异步SRAM替代SDRAM做EMC整改:从噪声源定位到滤波重设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/22 1:19:29

RadixAttention优化KV Cache:大模型推理显存降低70%

1. 项目概述:当KV Cache遇上RadixAttention最近在优化大语言模型推理性能时,我注意到SGLang提出的RadixAttention方案在KV Cache管理上做了些有意思的设计。传统KV Cache随着上下文增长线性膨胀的问题,相信每个做过LLM推理优化的同学都深有体…

作者头像 李华