FFmpeg VAAPI硬件编解码插入drawbox滤镜失败求助
解决方案
问题根因
drawbox没有对应的VAAPI硬件滤镜,FFmpeg会自动把硬件帧转成CPU能处理的格式(比如yuv420p),处理完再转回去,但你用的hwmap参数配置导致转回VAAPI帧时内存映射失败。另外J5005的UHD Graphics 600对VAAPI的格式和内存映射规则要求很严格。
修正后的命令
改用hwdownload/hwupload明确处理CPU和GPU帧的转换,同时简化滤镜链,避免自动插入的格式转换冲突:
ffmpeg -hide_banner -v error -allowed_media_types video -loglevel verbose -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device /dev/dri/renderD128 \ -i rtsp://... -c:v h264_vaapi -g 50 -bf 0 -profile:v high -level:v 4.1 -sei:v 0 -an \ -filter_complex "[0:v]scale_vaapi,hwdownload,format=yuv420p[in];\ [in]drawbox=x=10:y=10:w=100:h=100:color=pink@0.5:t=fill[in2];\ [in2]hwupload,format=vaapi[out]" -map "[out]" \ -c:v h264_vaapi -an -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp rtsp://...
关键调整说明
hwdownload转CPU帧:把VAAPI硬件帧下载到系统内存,转成yuv420p(drawbox原生支持的格式),避免FFmpeg自动插入不可控的格式转换滤镜。hwupload转回硬件帧:drawbox处理完后重新把帧上传到iGPU,转回VAAPI格式供后续硬编码用。- 去掉多余的
hwmap和格式强制:J5005的共享内存虽然支持hwmap,但涉及CPU滤镜时,hwdownload/hwupload的兼容性更稳定,不会出现内存映射失败的问题。
额外优化建议
如果担心CPU占用上升,建议用FFmpeg 4.4以上版本,这个版本对VAAPI的CPU-GPU帧转换优化更好。另外J5005的CPU处理1080P级别的drawbox操作,占用一般在10%-15%左右,不会影响系统稳定性。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

