Using ffmpeg to encode a video stream, I found the encoding process to use my CPU excessively. I wanted to reduce the CPU usage by transferring the encoding to my built-in Intel GPU. To determine details about the on board Intel GPU driver, you can use the following command on Ubuntu:
$ vainfo
In the example screenshots below, I used the libx264 software encoding option in the ffmpeg command to encode a video stream coming from the device /dev/video0 into an output mpeg file output.mp4:
$ sudo ffmpeg -hide_banner -i /dev/video0 -c:v libx264 output.mp4
While this command is running, the top command shows a high CPU usage.
After reading through the ffmpeg manual pages and a lot of trials, I found the options to use to enable Intel GPU encoding with the ffmpeg command:
$ sudo ffmpeg -hide_banner -vaapi_device /dev/dri/renderD128 -i /dev/video0 -vf 'format=nv12,hwupload' -c:v h264_vaapi output.mp4
Running the top command shows reduce CPU usage during the encoding process:
Another example with more options is illustrated below:
$ ffmpeg \
-vaapi_device /dev/dri/renderD128 \
-s 1280x720 \
-i /dev/video0 \
-vf 'scale=320x240,fps=fps=25,format=nv12,hwupload' \
-c:v h264_vaapi \
-b:v 600k \
output.mp4
ffmpeg will request a video stream of resolution 1280x720 from the source, then scale the frames to 320x240 resolution with a fps of 25. Then it uploads the video data to the Intel GPU for encoding before writing it out with a video bitrate of 600k to the output.mp4 file.