The Raspberry Pi 4 can encode videos using hardware acceleration by using 64 bit Raspberry Pi OS, a particular ffmpeg
fork and the h264_v4l2m2m
codec. Alternatively, Ubuntu and the 4.4 version of ffmpeg
available via apt
also yields the same results (but runs at much lower fps). For example:
ffmpeg -i big_buck_bunny_720p_10mb.mp4 -c:v h264_v4l2m2m -c:a copy out.mp4
However, ffmpeg will emit one warning:
Failed to set gop size: Invalid argument
This means that the -g
option, and hence information about number/ distance of keyframes, can't be set. Example for setting gop explicitly, which will result in the same warning:
ffmpeg -f v4l2 -s 1280x720 -r 25 -i /dev/video0 -c:v h264_v4l2m2m -g 50 -keyint_min 25 -c:a copy out.mp4
This doesn't seem to be much of a problem when encoding to a video file, which works fine, but makes it impossible to stream the video data to services like YouTube or Twitch.
Using the non-hardware accelerated libx264
instead will enable to set the GOP/ keyframes, and enable streaming to aforementioned platforms. However, without acceleration, the performance makes this practically impossible.
I'm not sure whether this is a problem with the h264_v4l2m2m
codec, this ffmepg
fork (I've opened an issue report), ffmpeg
in general, drivers or something else. I am therefore looking for insights into what causes this and how to either work around or - ideally - solve this issue. In short, how to use hardware acceleration, yet set the GOP/ keyframes?