#!/bin/sh # capture card sysfs device path SYSFS_PATH="/devices/pci0000:00/0000:00:14.0/usb1/1-12" # script args WIDTH="$1" HEIGHT="$2" FRAMERATE="$3" # find audio device (pulseaudio) PULSE_DEVICE="$(pactl -f json list sources | jq \ --arg sysfs_path "$SYSFS_PATH" --raw-output \ '.[] | select(.properties["sysfs.path"] | . != null and startswith($sysfs_path)) | .name')" AUDIO_URL="av://pulse:$PULSE_DEVICE" # find video device (video4linux) V4L_PATH="$(find "/sys$SYSFS_PATH" -name 'video4linux' | head -n1)" V4L_PATH="$(find "$V4L_PATH" -name 'index' | xargs grep -l '^0$')" V4L_PATH="$(echo "$V4L_PATH" | sed 's#/index$#/uevent#')" VIDEO_DEVICE="$(. "$V4L_PATH" ; echo "/dev/$DEVNAME")" VIDEO_DEVICE="$(readlink -f "$VIDEO_DEVICE")" VIDEO_URL="av://v4l2:$VIDEO_DEVICE" RESOLUTION="${WIDTH}x${HEIGHT}" # set capture card v4l parameters v4l2-ctl --silent --device "$VIDEO_DEVICE" \ --set-parm "$FRAMERATE" \ --set-fmt-video "width=$WIDTH,height=$HEIGHT,pixelformat=MJPG" \ --set-ctrl "brightness=0,contrast=128,saturation=128,hue=0" # preview window mpv \ --msg-level=input=no --no-config --input-conf=/dev/null \ --no-osc --no-input-default-bindings --pause=no --force-seekable=no \ \ --no-cache --untimed --no-correct-pts \ --no-demuxer-thread \ --video-sync=audio \ --audio-buffer=0 \ --vd-lavc-threads=1 \ --cache-pause=no \ --interpolation=no \ --video-latency-hacks=yes \ --stream-buffer-size=4k \ \ --demuxer-lavf-o-add=fflags=+nobuffer \ --demuxer-lavf-analyzeduration=0 \ --demuxer-lavf-o-add=input_format=mjpeg \ --demuxer-lavf-o-add=framerate="$FRAMERATE" \ --demuxer-lavf-o-add=resolution="$RESOLUTION" \ --demuxer-lavf-o-add=rw_timeout=30000000 \ \ "$VIDEO_URL" --audio-file="$AUDIO_URL"