config/pkgs/v4l2-play/script.sh

101 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env nix-shell
#!nix-shell -i bash -p ffmpeg v4l-utils alsa-utils gnome.zenity lxterminal
set -euo pipefail
#if [[ -z ${_IS_IN_GUI:-} ]]; then
# exec lxterminal --command "_IS_IN_GUI=1 $(printf "%q" "$(realpath "$0")")" &
#fi
video_devices=()
audio_devices=()
tab=$(printf '\t')
current_name=
while IFS= read line; do
if ! [[ $line == "$tab"* ]]; then
current_name="$line"
else
video_devices+=("$(echo "$line - $current_name" | xargs)")
fi
done < <( v4l2-ctl --list-devices )
printf "%s\n" "${video_devices[@]}"
current_name=
current_device=
current_subdevice=
while IFS= read line; do
if ! [[ $line == " "* ]]; then
current_name=$(echo $line | cut -d: -f2- | cut -c2-)
current_device=$(echo $line | grep -E 'card [0-9]+:' -o | tr -dc '[:digit:]' || true)
elif [[ $line == " Subdevice #"* ]]; then
current_subdevice=$(echo $line | grep -E 'Subdevice #[0-9]+:' -o | tr -dc '[:digit:]' || true)
#audio_devices+=("$(echo "$line - $current_name" | xargs)")
audio_devices+=("hw:$current_device,$current_subdevice - $current_name")
else
:
fi
done < <( arecord -l )
printf "%s\n" "${audio_devices[@]}"
zenity_cells=()
maybe_true=TRUE
for video_device in "${video_devices[@]}"; do
if grep <<<"$video_device" -q Elgato; then
zenity_cells+=("$maybe_true")
maybe_true=FALSE
else
zenity_cells+=(FALSE)
fi
zenity_cells+=("$video_device")
done
selected_video_device=$(
zenity --list --text="Which video device" --radiolist --column=Select --column=Device "${zenity_cells[@]}" \
| cut -d' ' -f1
)
zenity_cells=()
maybe_true=TRUE
for audio_device in "${audio_devices[@]}"; do
if grep <<<"$audio_device" -q Elgato; then
zenity_cells+=("$maybe_true")
maybe_true=FALSE
else
zenity_cells+=(FALSE)
fi
zenity_cells+=("$audio_device")
done
selected_audio_device=$(
zenity --list --text="Which audio device" --radiolist --column=Select --column=Device "${zenity_cells[@]}" \
| cut -d' ' -f1
)
# TODO:
# ffmpeg -f video4linux2 -list_formats all -i /dev/video3
# [video4linux2,v4l2 @ 0x23ed7140] Raw : yuyv422 : YUYV 4:2:2 : 1920x1080 1600x1200 1280x720 720x576 720x480 640x480
# [video4linux2,v4l2 @ 0x23ed7140] Raw : nv12 : Y/UV 4:2:0 : 3840x2160 2560x1440 1920x1080 1600x1200 1280x720 720x576 720x480 640x480
ffmpeg_common=(
-fflags nobuffer
-flags nobuffer
-flags low_delay
-strict experimental
)
ffmpeg_args=(
-f v4l2
-input_format nv12
-video_size 1920x1080
-framerate 60
#-i /dev/video3
-i "$selected_video_device"
-f alsa
#-i hw:5,0
-i "$selected_audio_device"
)
set -x
ffmpeg "${ffmpeg_common[@]}" "${ffmpeg_args[@]}" -c copy -f nut pipe: | ffplay -framedrop "${ffmpeg_common[@]}" -f nut -i pipe: