homebridge-plugins / homebridge-camera-ffmpeg

Homebridge Plugin Providing FFmpeg-based Camera Support
https://homebridge-plugins.github.io/homebridge-camera-ffmpeg/
Apache License 2.0
1.09k stars 227 forks source link

libcamera for raspberry pi configuration #1426

Open nsayer opened 11 months ago

nsayer commented 11 months ago

Manufacturer/Model:

Raspberry Pi camera with the new libcamera support enabled.

This allows you to use the tuning files for noir cameras (among other things).

It's a particularly ugly hack - you use a shell script that pipes the output of either libcamera-vid or libcamera-jpeg into ffmpeg

Homebridge Config:

"videoConfig": {
                        "videoProcessor": "/path_to_bin_directory/fakeffmpeg",
                        "source": "video -video_size 1640x1232 -framerate 30 -input_format h264",
                        "stillImageSource": "still -video_size 1640x1232 -input_format mjpeg",
                        "maxStreams": 1,
                        "maxWidth": 1640,
                        "maxHeight": 1232,
                        "maxFPS": 30,
                        "vcodec": "copy"
                    }

Additional Information:

This is the fakeffmpeg script:

#! /bin/sh

killall libcamera-vid
option=$1; shift
if [ $option = video ]; then
exec libcamera-vid -n --tuning-file /usr/share/libcamera/ipa/rpi/vc4/imx219_noir.json --width 1640 --height 1232 -t 0 -o - | ffmpeg -i - $@
elif [ $option = still ]; then
exec libcamera-jpeg -n --tuning-file /usr/share/libcamera/ipa/rpi/vc4/imx219_noir.json --width 1640 --height 1232 -t 1 -o - | ffmpeg -i - $@
else
exec ffmpeg $option $@
fi
Sarahlizzy commented 11 months ago

The config didn't work for me. I had to move videoProcessor to the top level.

i0ntempest commented 9 months ago

Process does not terminate after video stops. Any workarounds?

nsayer commented 5 months ago

A new and improved version.

First, here's the fake FFmpeg script:

#! /bin/sh

export TUNE=/usr/share/libcamera/ipa/rpi/pisp/imx219_noir.json 
killall libcamera-vid
option=$1; shift
if [ $option = video ]; then
libcamera-vid -n --tuning-file $TUNE --codec yuv420 --width 1280 --height 720 --framerate 15 -t 0 -o - | exec ffmpeg -f rawvideo -pix_fmt yuvj420p -s:v 1280x720 -framerate 15 -i - "$@"
elif [ $option = still ]; then
libcamera-jpeg -n --tuning-file $TUNE --width 1280 --height 720 -t 1 -o - | exec ffmpeg -i - "$@"
else
exec ffmpeg $option $@
fi

And simply use "video" as the "source" and "still" as the "stillImageSource". Lastly, use "libx264" as the "vcodec".