#!/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}" fork() { JOBS="$JOBS $( "$@" > /dev/null 2> /dev/null & echo $! )" } # 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" _mpv() { fork mpv \ --quiet --msg-level=input=no \ --no-config --input-conf=/dev/null \ --no-osc --no-border \ --no-input-default-bindings --pause=no --force-seekable=no \ --cache=no \ "$@" } # audio preview _mpv \ --no-demuxer-thread \ --audio-buffer=0 \ --cache-pause=no \ --interpolation=no \ --stream-buffer-size=4k \ --profile=low-latency \ "$AUDIO_URL" # video preview _mpv \ --untimed --no-correct-pts --no-demuxer-thread \ --profile=low-latency \ --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" sleep infinity kill -9 -- $JOBS