From 6b28c54491460fd59daba3cff8acfb4deeaf993b Mon Sep 17 00:00:00 2001 From: cpu Date: Tue, 6 Feb 2024 22:00:48 +0100 Subject: [PATCH] added files --- capture_video.sh | 113 ++++++++++++++++++++++++++++++++++++++++ webcam-streamer.service | 26 +++++++++ webcam-streamer.sh | 35 +++++++++++++ 3 files changed, 174 insertions(+) create mode 100755 capture_video.sh create mode 100644 webcam-streamer.service create mode 100755 webcam-streamer.sh diff --git a/capture_video.sh b/capture_video.sh new file mode 100755 index 0000000..d5dbba4 --- /dev/null +++ b/capture_video.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +if [[ "$1" == *help ]]; then + echo "Usage: ${0} [-duration 10] [-sound plughw:1,0]" + echo "default duration (in seconds) is infinite" + echo "default sound is anullsrc i.e. silent sound" + exit 1 +fi +# available options + +# 640x480/60 +# 1296x972/43 +# 1920x1080/30 +# 2592x1944/15 + +#VIDEO_RES_HEIGHT="1080" +#VIDEO_RES_WIDTH="1920" + +#VIDEO_RES_HEIGHT="972" +#VIDEO_RES_WIDTH="1296" + +VIDEO_BITRATE="700000" +VIDEO_RES_HEIGHT="480" +VIDEO_RES_WIDTH="640" +VIDEO_FRAMERATE="10" +VIDEO_FILE="camera_$(date +%Y-%m-%d_%H-%M-%S).mp4" +VIDEO_DURATION="1000000000" +SOUND_SOURCE="anullsrc" + +while [[ $# -gt 0 ]]; do + case $1 in + -sound) + if [ -n "$2" ]; then + SOUND_SOURCE="$2" + shift + fi + ;; + -duration) + if [ -n "$2" ]; then + VIDEO_DURATION="$2" + shift + fi + ;; + *) + echo "Unknown parameter $1" + exit 1 + esac + shift +done + +# Set up a trap to check for SIGINT +trap "pkill rpicam-vid; exit 130" SIGINT + +# Start the pipeline +rpicam-vid --inline \ + -n \ + -t 0 \ + --width ${VIDEO_RES_WIDTH} \ + --height ${VIDEO_RES_HEIGHT} \ + --nopreview \ + --exposure long \ + --sharpness 1.2 \ + --contrast 1.4 \ + --brightness 0.2 \ + --saturation 1.0 \ + --awb auto \ + --denoise auto \ + --rotation 0 \ + --autofocus-mode auto \ + --codec h264 \ + --framerate ${VIDEO_FRAMERATE} \ + -b ${VIDEO_BITRATE} \ + -o - | \ + +if [ "${SOUND_SOURCE}" = "anullsrc" ]; then + # ffmpeg params with silent audio + ffmpeg -hide_banner \ + -f lavfi \ + -i anullsrc=channel_layout=stereo:sample_rate=44100 \ + -thread_queue_size 1024 \ + -use_wallclock_as_timestamps 1 \ + -i pipe:0 \ + -c:v copy \ + -c:a aac \ + -preset fast \ + -strict experimental \ + -f mp4 \ + -t ${VIDEO_DURATION} \ + ${VIDEO_FILE} & +else + # ffmpeg params with audio + ffmpeg -hide_banner \ + -f alsa \ + -thread_queue_size 1024 \ + -ac 2 \ + -i ${SOUND_SOURCE} \ + -thread_queue_size 1024 \ + -use_wallclock_as_timestamps 1 \ + -i pipe:0 \ + -c:v copy \ + -c:a aac \ + -b:a 32k \ + -ar 44100 \ + -f mp4 \ + -t ${VIDEO_DURATION} \ + ${VIDEO_FILE} & +fi + +# Get process ID +pid=$! + +# Wait for process to finish or get terminated signal +wait || pkill rpicam-vid; exit 130 diff --git a/webcam-streamer.service b/webcam-streamer.service new file mode 100644 index 0000000..1b445cf --- /dev/null +++ b/webcam-streamer.service @@ -0,0 +1,26 @@ +[Unit] +Description=Webcam Streamer service +Requires=network-online.target +After=network-online.target +DefaultDependencies=no + +[Service] +Type=simple + +User=pi +Group=pi + +Environment="HOME=/home/pi" + +ExecStartPre=-/usr/bin/env sh -c 'killall webcam-streamer.sh 2>/dev/null || true' + +ExecStart=/bin/bash -c '/home/pi/webcam-streamer.sh' + +ExecStop=-/usr/bin/env sh -c 'killall webcam-streamer.sh 2>/dev/null || true' + +Restart=always +RestartSec=3 +SyslogIdentifier=webcam-streamer + +[Install] +WantedBy=multi-user.target diff --git a/webcam-streamer.sh b/webcam-streamer.sh new file mode 100755 index 0000000..03ab95a --- /dev/null +++ b/webcam-streamer.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# To run this as a service: +# sudo systemctl start webcam-streamer +# see logs: +# journalctl -fu webcam-streamer +PEERTUBE_LIVE="rtmp://peertube.virtonline.eu:1935/live/b3f26a2f-24f1-4f81-a3d4-d539acf4b401" +VIDEO_BITRATE="700000" +VIDEO_RES_HEIGHT="480" +VIDEO_RES_WIDTH="640" +#VIDEO_RES_HEIGHT="972" +#VIDEO_RES_WIDTH="1296" +VIDEO_FRAMERATE="10" +VIDEO_DURATION=0 + +rpicam-vid --inline \ + -n \ + -t ${VIDEO_DURATION} \ + --width ${VIDEO_RES_WIDTH} \ + --height ${VIDEO_RES_HEIGHT} \ + --nopreview \ + --exposure long \ + --sharpness 1.2 \ + --contrast 1.4 \ + --brightness 0.2 \ + --saturation 1.0 \ + --awb auto \ + --denoise auto \ + --rotation 0 \ + --autofocus-mode auto \ + --codec libav \ + --libav-format flv \ + --framerate ${VIDEO_FRAMERATE} \ + -b ${VIDEO_BITRATE} \ + -o ${PEERTUBE_LIVE}