I want to write a script that simultaneously renders what's on my webcam to a window on my screen and records a video
4
votes
2
answers
661
views
I have tried a combination of:
* v4l2loopback
* ffmpeg
* mpv
But either the web-cam view, or the web-cam record works, but never both together.
Can anyone provide a script that achieves this?
This is what I've tried so far:
#!/usr/bin/env bash
set -x
# This needs the video loopback module to be installed.
# sudo modprobe v4l2loopback devices=1 video_nr=10 card_label="VirtualCam" exclusive_caps=1
# use pw-cli list-objects | grep node.name
to get the audio device
AUDIO_DEVICE="alsa_input.pci-0000_00_1f.3.analog-stereo"
VIDEO_DEVICE="/dev/video0"
VIRTUAL_VIDEO_DEVICE="/dev/video10"
read -p "Enter a name for the video: " VIDEO_NAME
if [ -z "$VIDEO_NAME" ]; then
VIDEO_NAME="unnamed_video"
fi
OUTPUT_FILE="$HOME/videos/${VIDEO_NAME}_$(date +%Y%m%d_%H%M%S).mkv"
trap 'echo "Stopping recording..."; pkill -P $$; exit 0' SIGINT
ffmpeg -f v4l2 -framerate 30 -video_size 640x480 -i "$VIDEO_DEVICE" \
-f v4l2 -video_size 640x480 -i "$VIRTUAL_VIDEO_DEVICE" &
sleep 2
# Start displaying the virtual webcam feed with mpv
mpv --no-osc \
--no-input-default-bindings \
--profile=low-latency \
--geometry=50%:50% \
--autofit=100% \
--input-conf=/dev/null \
--title='WebcamDisplay' \
--framedrop=no \
--vf=scale=640:-1 \
--vo=vaapi \
"$VIRTUAL_VIDEO_DEVICE" &
# Start recording from the virtual device with ffmpeg
ffmpeg -f v4l2 -framerate 30 -video_size 640x480 -i "$VIRTUAL_VIDEO_DEVICE" \
-f pulse -i "$AUDIO_DEVICE" \
-c:v libx264 -preset ultrafast -crf 28 -pix_fmt yuv420p \
-c:a aac -b:a 192k -ar 48000 \
"$OUTPUT_FILE"
# Stop all processes when done
pkill ffmpeg
pkill mpv
This is my loopback setup:
$ v4l2-ctl --list-devices
VirtualCam (platform:v4l2loopback-010):
/dev/video10
Integrated_Webcam_HD: Integrate (usb-0000:00:14.0-12):
/dev/video0
/dev/video1
/dev/media0
Asked by Brad
(331 rep)
Sep 10, 2024, 11:24 AM
Last activity: Nov 24, 2024, 02:16 PM
Last activity: Nov 24, 2024, 02:16 PM