I have had good success on the RPi 3 using ffmpeg to decode h.264 streams from various Ethernet video sources. However, on the RPi 4, when I include the -c:v h264_mmal directive, it appears to generate blank frames, as if the decoder never outputs any data. I have re-compiled ffmpeg from the latest source, using the --enable-mmal flag, but it still only outputs what appear to be blank frames. Example output below.
Also, if I use ffplay
to play the same video, it plays fine using the software decoder (but uses high CPU, due to software decoding), but when I add the -c:v h264_mmal tag to enable hardware decoding, I get nothing (never loads a video window, etc). (no error message, however)
However, omxplayer does successfully play the video and seems to be using hardware-assisted decoding, as the CPU usage is much lower than ffmpeg on software decoder.
What am I doing wrong? How can I get ffmpeg to work with the hardware decoder?
Example output of ffmpeg
(generating snapshots of a video stream)
ffmpeg -c:v h264_mmal -i "rtsp://192.168.1.87/stream0:554?username=admin&password=admin" -vf fps=1/60 img%03d.jpg
ffmpeg version git-2020-02-20-56df829 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (Raspbian 8.3.0-6+rpi1)
configuration: --arch=armel --target-os=linux --enable-gpl --enable-omx --enable-omx-rpi --enable-nonfree --enable-mmal
libavutil 56. 41.100 / 56. 41.100
libavcodec 58. 71.100 / 58. 71.100
libavformat 58. 38.101 / 58. 38.101
libavdevice 58. 9.103 / 58. 9.103
libavfilter 7. 76.100 / 7. 76.100
libswscale 5. 6.100 / 5. 6.100
libswresample 3. 6.100 / 3. 6.100
libpostproc 55. 6.100 / 55. 6.100
[udp @ 0x36e1fc0] attempted to set receive buffer to size 393216 but it only ended up set as 327680
[udp @ 0x36f2310] attempted to set receive buffer to size 393216 but it only ended up set as 327680
Input #0, rtsp, from 'rtsp://192.168.1.87/stream0:554?username=admin&password=admin':
Metadata:
title : RTSP/RTP stream from anjvision ipcamera
Duration: N/A, start: 0.083000, bitrate: N/A
Stream #0:0: Video: h264 (Main), yuvj420p(pc, progressive), 1280x720, 12 tbr, 90k tbn, 180k tbc
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_mmal) -> mjpeg (native))
Press [q] to stop, [?] for help
frame= 0 fps=0.0 q=0.0 size=N/A time=-577014:32:22.77 bitrate=N/A
speed=N/A frame= 0 fps=0.0 q=0.0 size=N/A time=-577014:32:22.77 bitrate=N/A speed=N/A frame= 0 fps=0.0 q=0.0 size=N/A time=-577014:32:22.77 bitrate=N/A
...
snip
...
speed=N/A frame= 0 fps=0.0 q=0.0 size=N/A time=-577014:32:22.77 bitrate=N/A speed=N/A [h264_mmal @ 0x381f0c0] Did not get output frame from MMAL.
Error while decoding stream #0:0: Unknown error occurred
Finishing stream 0:0 without any data written to it.
[mjpeg @ 0x3718b30] bitrate tolerance 4000000 too small for bitrate 200000, overriding
Output #0, image2, to 'img%03d.jpg':
Metadata:
title : RTSP/RTP stream from anjvision ipcamera
encoder : Lavf58.38.101
Stream #0:0: Video: mjpeg, yuvj420p(pc), 1280x720, q=2-31, 200 kb/s, 0.02 fps, 0.02 tbn, 0.02 tbc
Metadata:
encoder : Lavc58.71.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame= 0 fps=0.0 q=0.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed= 0x
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)
^C