Sample Header Ad - 728x90

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