ffmpeg GStreamer
ffmpeg-7.13 GStreamer-1.26.2
树莓派5 raspberry pi 5 hevc(h.265) h.264硬件视频编码支持如下
一、ffmpeg支持硬件编码:
1、hevc_v4l2m2m、 h264_v4l2m2m两个都支持
2、支持视频H.265 H.264室内编码识别
/dev/dri/renderD128,DRM,渲染节点(无显示也能用),
ffmpeg -v verbose -rtsp_transport tcp -hwaccel drm -hwaccel_device /dev/dri/renderD128 -i rtsp://admin:SHnb888A@192.168.112.13:554 -f null /dev/null
ffmpeg-7.13 一、检测硬件视频编码支持 steven_roc@stevenroc-PCH:~ $ ffmpeg -codecs | grep hevc_v4l2m2m ffmpeg version 7.1.3-0+deb13u1+rpt1 Copyright (c) 2000-2025 the FFmpeg developers built with gcc 14 (Debian 14.2.0-19) configuration: --prefix=/usr --extra-version=0+deb13u1+rpt1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-libmfx --disable-mmal --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --disable-libvpl --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-vout-drm --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sand --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared libavutil 59. 39.100 / 59. 39.100 libavcodec 61. 19.101 / 61. 19.101 libavformat 61. 7.100 / 61. 7.100 libavdevice 61. 3.100 / 61. 3.100 libavfilter 10. 4.100 / 10. 4.100 libswscale 8. 3.100 / 8. 3.100 libswresample 5. 3.100 / 5. 3.100 libpostproc 58. 3.100 / 58. 3.100 DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_v4l2m2m hevc_cuvid) (encoders: libx265 hevc_nvenc hevc_v4l2m2m hevc_vaapi hevc_vulkan) steven_roc@stevenroc-PCH:~ $ ffmpeg -codecs | grep h264_v4l2m2m ffmpeg version 7.1.3-0+deb13u1+rpt1 Copyright (c) 2000-2025 the FFmpeg developers built with gcc 14 (Debian 14.2.0-19) configuration: --prefix=/usr --extra-version=0+deb13u1+rpt1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-libmfx --disable-mmal --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --disable-libvpl --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-vout-drm --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sand --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared libavutil 59. 39.100 / 59. 39.100 libavcodec 61. 19.101 / 61. 19.101 libavformat 61. 7.100 / 61. 7.100 libavdevice 61. 3.100 / 61. 3.100 libavfilter 10. 4.100 / 10. 4.100 libswscale 8. 3.100 / 8. 3.100 libswresample 5. 3.100 / 5. 3.100 libpostproc 58. 3.100 / 58. 3.100 DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_cuvid) (encoders: libx264 libx264rgb h264_nvenc h264_v4l2m2m h264_vaapi h264_vulkan) 二、视频编码自动检测 steven_roc@stevenroc-PCE:/opt/openAI/project/007.coze.plateApp/workspace/projects/cpp/config $ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1:nk=1 rtsp://admin:123456qwe@192.168.16.13 hevc steven_roc@stevenroc-PCE:/opt/openAI/project/007.coze.plateApp/workspace/projects/cpp/config $ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1:nk=1 rtsp://admin:SHnb888A@192.168.112.13 [h264 @ 0x5555dfdba590] missing picture in access unit with size 33 [h264 @ 0x5555dfdba590] no frame! h264 三、连接视频解码 ffmpeg -rtsp_transport tcp -i rtsp://admin:123456qwe@192.168.16.12 -c:v copy output.hevc steven_roc@stevenroc-PCH:~ $ ffmpeg -rtsp_transport tcp -i rtsp://admin:123456qwe@192.168.16.12 -c:v copy output.hevc ffmpeg -rtsp_transport tcp -i rtsp://admin:123456qwe@192.168.16.12:554/stream1 -f null - 1、 正确的 FFmpeg 硬件解码命令 最简洁可靠的命令(自动选择硬解)h.265 ffmpeg -v verbose \ -rtsp_transport tcp \ -hwaccel drm \ -hwaccel_device /dev/dri/renderD128 \ -i rtsp://admin:123456qwe@192.168.16.17:554/h265/ch0/main/av_stream \ -f null /dev/null 2、h.264 ffmpeg -v verbose \ -rtsp_transport tcp \ -hwaccel drm \ -hwaccel_device /dev/dri/renderD128 \ -i rtsp://admin:SHnb888A@192.168.112.13:554 \ -f null /dev/null 3、 1)、 ffmpeg -v verbose -rtsp_transport tcp -hwaccel drm -hwaccel_device /dev/dri/renderD128 -i rtsp://admin:SHnb888A@192.168.112.13:554 -f null /dev/null ffmpeg -v verbose -rtsp_transport tcp -hwaccel drm -hwaccel_device /dev/dri/renderD128 -i rtsp://admin:123456qwe@192.168.16.17:554/h265/ch0/main/av_stream -f null /dev/null ffmpeg -v verbose -rtsp_transport tcp -hwaccel drm -hwaccel_device /dev/dri/renderD128 -i rtsp://admin:123456qwe@192.168.16.17:554 -f null /dev/null 2)、 ffmpeg -rtsp_transport tcp -hwaccel drm -hwaccel_device /dev/dri/card0 -i rtsp://admin:123456qwe@192.168.16.17:554/stream1 -f null - 3)、本地视频解码ffmpeg -c:v hevc_v4l2m2m -i test_1080p_hevc.mp4 -f null - 自动解码 ffmpeg -i test_1080p_hevc.mp4 -f null - 注意:使用 /dev/dri/renderD128无显示也能用 1、命令参数有误: /dev/dri/video19 是 V4L2 视频设备,不是 DRM 渲染节点。FFmpeg 的 -hwaccel_device 需要指向 DRM 设备(如 /dev/dri/renderD128 或 /dev/dri/card0),而你给了一个 V4L2 节点,导致 Device creation failed: -2。另外 RTSP 丢包是因为默认走 UDP,需要强制 TCP。 2、节点,类型,用途, /dev/video19,V4L2,Pi 5 HEVC 解码器(rpi-hevc-dec), /dev/dri/card0,DRM,显示卡主节点, /dev/dri/renderD128,DRM,渲染节点(无显示也能用), 4、 steven_roc@stevenroc-PCE:~ $ pkg-config --modversion opencv4 4.10.0 steven_roc@stevenroc-PCE:~ $ ffmpeg -hwaccels | grep drm ffmpeg version 7.1.3-0+deb13u1+rpt1 Copyright (c) 2000-2025 the FFmpeg developers built with gcc 14 (Debian 14.2.0-19) configuration: --prefix=/usr --extra-version=0+deb13u1+rpt1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-libmfx --disable-mmal --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --disable-libvpl --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-vout-drm --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sand --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared libavutil 59. 39.100 / 59. 39.100 libavcodec 61. 19.101 / 61. 19.101 libavformat 61. 7.100 / 61. 7.100 libavdevice 61. 3.100 / 61. 3.100 libavfilter 10. 4.100 / 10. 4.100 libswscale 8. 3.100 / 8. 3.100 libswresample 5. 3.100 / 5. 3.100 libpostproc 58. 3.100 / 58. 3.100 drm steven_roc@stevenroc-PCE:~ $ ls /dev/dri/ by-path card0 card1 renderD128 5、 steven_roc@stevenroc-PCE:~ $ ffmpeg -decoders | grep v4l2 ffmpeg version 7.1.3-0+deb13u1+rpt1 Copyright (c) 2000-2025 the FFmpeg developers built with gcc 14 (Debian 14.2.0-19) configuration: --prefix=/usr --extra-version=0+deb13u1+rpt1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-libmfx --disable-mmal --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --disable-libvpl --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-vout-drm --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sand --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared libavutil 59. 39.100 / 59. 39.100 libavcodec 61. 19.101 / 61. 19.101 libavformat 61. 7.100 / 61. 7.100 libavdevice 61. 3.100 / 61. 3.100 libavfilter 10. 4.100 / 10. 4.100 libswscale 8. 3.100 / 8. 3.100 libswresample 5. 3.100 / 5. 3.100 libpostproc 58. 3.100 / 58. 3.100 V..... h263_v4l2m2m V4L2 mem2mem H.263 decoder wrapper (codec h263) V..... h264_v4l2m2m V4L2 mem2mem H.264 decoder wrapper (codec h264) V..... hevc_v4l2m2m V4L2 mem2mem HEVC decoder wrapper (codec hevc) V..... mpeg1_v4l2m2m V4L2 mem2mem MPEG1 decoder wrapper (codec mpeg1video) V..... mpeg2_v4l2m2m V4L2 mem2mem MPEG2 decoder wrapper (codec mpeg2video) V..... mpeg4_v4l2m2m V4L2 mem2mem MPEG4 decoder wrapper (codec mpeg4) V..... vc1_v4l2m2m V4L2 mem2mem VC1 decoder wrapper (codec vc1) V..... vp8_v4l2m2m V4L2 mem2mem VP8 decoder wrapper (codec vp8) V..... vp9_v4l2m2m V4L2 mem2mem VP9 decoder wrapper (codec vp9)
二、GStreamer
1、gst-inspect-1.0 输出来看,你的系统同时存在软解和硬解元素
元素 类型 说明
`v4l2slh265dec` 硬解 ✅ V4L2 Stateless H.265 解码器,调用 VideoCore VII
`avdec_h265` 软解 ❌ FFmpeg 软件解码,CPU 占用高
`libde265dec` 软解 ❌ libde265 库软件解码
`avdec_h264` 软解 ❌ H.264 软件解码
`openh264dec` 软解 ❌ OpenH264 软件解码
2、GStreamer-1.26.2
1)v4l2slh265dec 只支持硬件h.265视频编码 v4l2slh265dec
GStreamer 1.26.2 一、检测硬件视频编码支持 v4l2slh265dec steven_roc@stevenroc-PCH:~ $ gst-inspect-1.0 | grep 265 closedcaption: h265ccextractor: H.265 Closed Caption Extractor closedcaption: h265ccinserter: H.265 Closed Caption Inserter codec2json: h2652json: H2652json codectimestamper: h265timestamper: H.265 timestamper de265: libde265dec: HEVC/H.265 decoder libav: avdec_h265: libav HEVC (High Efficiency Video Coding) decoder rtp: rtph265depay: RTP H265 depayloader rtp: rtph265pay: RTP H265 payloader typefindfunctions: video/x-h265: h265, x265, 265 v4l2codecs: v4l2slh265dec: V4L2 Stateless H.265 Video Decoder videoparsersbad: h265parse: H.265 parser x265: x265enc: x265enc steven_roc@stevenroc-PCH:~ $ gst-inspect-1.0 | grep 264 closedcaption: h264ccextractor: H.264 Closed Caption Extractor closedcaption: h264ccinserter: H.264 Closed Caption Inserter codec2json: h2642json: H2642json codectimestamper: h264timestamper: H.264 timestamper libav: avdec_h264: libav H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 decoder libav: avmux_ipod: libav iPod H.264 MP4 (MPEG-4 Part 14) muxer openh264: openh264dec: OpenH264 video decoder openh264: openh264enc: OpenH264 video encoder rtp: rtph264depay: RTP H264 depayloader rtp: rtph264pay: RTP H264 payloader typefindfunctions: video/x-h264: h264, x264, 264 uvch264: uvch264deviceprovider (GstDeviceProviderFactory) uvch264: uvch264mjpgdemux: UVC H264 MJPG Demuxer uvch264: uvch264src: UVC H264 Source videoparsersbad: h264parse: H.264 parser 三、连接视频解码 1、avdec_h265 是纯软件解码,CPU 占用会很高(单核可能 80%+),但能验证 RTSP 流和下游 AI 管道是否正常。 gst-launch-1.0 -v \ rtspsrc location=rtsp://admin:123456qwe@192.168.16.17:554/stream1 \ latency=200 protocols=tcp \ ! rtph265depay \ ! h265parse \ ! avdec_h265 \ ! queue max-size-buffers=3 leaky=downstream \ ! videoconvert \ ! "video/x-raw,format=BGR" \ ! appsink max-buffers=1 drop=true 2)、 gst-launch-1.0 rtspsrc location=rtsp://admin:123456qwe@192.168.16.12 latency=0 ! queue ! application/x-rtp,media=video,encoding-name=H265 ! rtpjitterbuffer latency=0 ! rtph265depay ! h265parse ! avdec_h265 ! videoconvert ! autovideosink sync=false 2、如果项目依赖 GStreamer 硬件解码,最稳定的方案是重装 Raspberry Pi OS Bookworm(64-bit)。Trixie 目前处于测试阶段,该 bug 尚未修复[^3^]。 v4l2slh265dec 1)、Bookworm 下硬解命令(与之前你成功协商的命令一致) v4l2slh265dec gst-launch-1.0 -v \ rtspsrc location=rtsp://admin:123456qwe@192.168.16.17:554/stream1 \ latency=200 protocols=tcp \ ! rtph265depay \ ! h265parse \ ! v4l2slh265dec \ ! queue max-size-buffers=3 leaky=downstream \ ! videoconvert \ ! "video/x-raw,format=BGR" \ ! appsink max-buffers=1 drop=true 2)、 gst-launch-1.0 -v \ rtspsrc location=rtsp://admin:123456qwe@192.168.16.17:554/stream1 \ latency=200 protocols=tcp name=src \ src. ! rtph265depay \ ! h265parse config-interval=-1 \ ! v4l2slh265dec \ ! queue max-size-buffers=10 \ ! videoconvert \ ! "video/x-raw,format=RGBA" \ ! autovideosink sync=false # 1. 看 CPU(硬解时 gst-launch-1.0 应 < 15%) top -p $(pgrep -d',' gst-launch-1.0) # 2. 确认 /dev/video20(HEVC 解码器)正在被使用 sudo v4l2-ctl -d /dev/video20 --get-fmt-video # 3. 确认没有回退到软解 avdec_h265 GST_DEBUG=2 gst-launch-1.0 ... 2>&1 | grep -i "avdec" # 无输出 = 硬解成功 # 检查v4l2slh265dec是否存在 gst-inspect-1.0 v4l2slh265dec # 测试本地H.265文件播放(实验性,可能不稳定) gst-launch-1.0 playbin uri=file:///path/to/test_h265.mp4 # 或手动pipeline gst-launch-1.0 filesrc location=test.h265 ! h265parse ! v4l2slh265dec ! videoconvert ! autovideosink
自适应IP