如何在Nvidia Jetson上启用硬件加速实现图片转H264/H265视频编码
使用GStreamer将PNG/JPG图片编码为硬件加速H264/H265 MP4的问题
我需要将jpg/png格式的图片编码为h264/h265格式的mp4视频,条件允许的话优先使用h265编码。
我先尝试了公开的可用命令,如下两个可以成功输出视频:
- H265编码命令:
gst-launch-1.0 -e multifilesrc location="IMG%03d.png" index=1 caps="image/png,framerate=30/1" ! pngdec ! videoconvert ! omxh265enc ! qtmux ! filesink location=image2.mp4 - H264编码命令:
gst-launch-1.0 -e multifilesrc location="IMG%03d.png" index=1 caps="image/png,framerate=30/1" ! pngdec ! videoconvert ! queue ! x264enc ! queue ! mp4mux ! filesink location=image3.mp4
为了使用硬件加速提升编码效率,我参考NVIDIA官方L4T GStreamer加速文档的示例,将输入源修改为本地图片序列后调整得到命令如下:gst-launch-1.0 multifilesrc location="IMG%03d.png" index=1 caps="image/png,framerate=30/1" ! pngdec ! videoconvert ! queue ! nvv4l2h265enc bitrate=8000000 ! h265parse ! qtmux ! filesink location=output.mp4 -e
运行后报如下错误:WARNING: erroneous pipeline: could not link queue0 to nvv4l2h264enc0
我确认nvv4l2h265enc编码器在当前使用的GStreamer 1.0版本中是可用的,请问我的操作存在什么问题?
问题原因和解决方法
你的错误核心是内存类型和像素格式不匹配:NVIDIA的硬件加速编码器nvv4l2h265enc只接受存在NVMM内存(NVIDIA专用内存空间)里的NV12格式视频帧,你前面用pngdec解出来的帧是存在普通内存里的RGB/RGBA格式,自然没法直接连到编码器上。
你需要在解码、格式转换后加一步nvvidconv组件,把普通内存的帧转成NVMM内存的NV12格式,同时要显式指定caps匹配编码器要求的格式。
另外注意检查命令里的编码器名称是否正确,你报错信息里出现的是nvv4l2h264enc0(H264编码器),如果你的需求是H265编码,要确认命令里写的是nvv4l2h265enc,不要拼写错误。
修正后的可用命令如下:
gst-launch-1.0 -e multifilesrc location="IMG%03d.png" index=1 caps="image/png,framerate=30/1" ! \ pngdec ! videoconvert ! nvvidconv ! 'video/x-raw(memory:NVMM), format=NV12' ! \ nvv4l2h265enc bitrate=8000000 ! h265parse ! qtmux ! filesink location=output.mp4
如果要做硬件加速H264编码,把nvv4l2h265enc换成nvv4l2h264enc、h265parse换成h264parse即可。
补充验证方法
如果运行还是报错,可以先执行gst-inspect-1.0 nvv4l2h265enc确认编码器组件正常安装,再执行gst-inspect-1.0 nvvidconv确认转换组件可用,两个组件都存在的情况下上述命令可以正常运行。
内容的提问来源于stack exchange,提问作者user3605780
相关产品推荐
相关产品推荐

