Description
Thanks to @mickgiles for the inspiration in #508, I wanted to share what worked for me in newer versions (v3) of homebridge-camera-ffmpeg. If running in docker, remember to pass through your /dev/dri:/dev/dri
devices.
Obviously you'll need a working copy of ffmpeg that has been built with VAAPI (h264_vaapi) support. Lots of resources for compiling your own out there.
ffmpeg.sh Script
The script acts a middle man between homebridge and ffmpeg. This is needed to fix a few hardcoded elements in the ffmpeg command, this wouldn't be needed if the plugin gave the additional config control needed. Also #504 is still an issue and should be reopened.
Update the CMD
variable to be the actual path to ffmpeg.
What it does:
-
-pix_fmt yuv420p
is changed to-pix_fmt vaapi
-
-filter:v <value>
is removed from the command when a snapshot is being performed (see Still images not updating when using custom videoFilter #504) -
scale
filters are changed toscale_vaapi
filters
#!/bin/bash
CMD="/home/user/bin/ffmpeg"
SNAPSHOT="FALSE"
while [[ $# > 1 ]]
do
key="$1"
if [[ "${key}" == "-frames:v" ]]; then
SNAPSHOT="TRUE"
fi
case ${key} in
-pix_fmt)
CMD+=" $1 vaapi"
shift
;;
-filter:v)
if [[ "${SNAPSHOT}" == "FALSE" ]]; then
CMD+=" $1"
else
shift
fi
;;
*)
CMD+=" $1"
;;
esac
shift
done
CMD="${CMD//scale=/scale_vaapi=}"
exec $CMD ${!#}
Plugin config:
Update the videoProcessor
value to be the path to your ffmpeg.sh script.
This seems to work with and without videoFilter
, but I have left it in for now as it's used in all VAAPI examples I've seen.
"platform": "Camera-ffmpeg",
"videoProcessor": "/home/user/bin/ffmpeg.sh",
"cameras": [
{
"name": "Front Camera",
"videoConfig": {
"source": "-vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -rtsp_transport tcp -i rtsp://axis-accc8e6d470a.local/axis-media/media.amp?streamprofile=Media?tcp",
"stillImageSource": "-i http://axis-accc8e6d470a.local/axis-cgi/jpg/image.cgi?resolution=1280x720",
"encoderOptions": "-bf 0",
"vcodec": "h264_vaapi",
"videoFilter": "format=nv12|vaapi,hwupload"
"maxBitrate": 0,
"packetSize": 940
}
}
Config notes:
-
maxBitrate
andpacketSize
are not essential, but gave me much higher quality streams -
encoderOptions
set to-bf 0
is the same as using the traditionalbframes=0
, without this the frame rate is very poor -
If the H264 profile of your camera is baseline (normally the case with lower power, cheaper devices), you might need to add the following parameter into the
source
value to have ffmpeg/vaapi ignore the profile and try to process the stream anyway:
-hwaccel_flags allow_profile_mismatch
View your live camera in the Home app, and then run intel_gpu_top
on the host machine to confirm the GPU cores are being used. Success.