scripts/va2-capture

106 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
set -x
monitor="HDMI1"
xrandr_out="$(xrandr)"
output="/tmp/vid.mkv"
find_device_info() {
pactl list sources \
| grep "Name: ${1}" -A3
}
parse_device_name() {
echo "${1}" \
| grep Name \
| awk '{print $2}'
}
parse_channels() {
echo "${1}" \
| grep 'Sample Specification' \
| awk '{print $4}' \
| sed 's/ch//'
}
parse_rate() {
echo "${1}" \
| grep 'Sample Specification' \
| awk '{print $5}' \
| sed 's/Hz//'
}
find_monitor_info() {
dev="${2}"
echo "${1}" \
| awk "BEGIN {found = \"false\"}
/^${dev}/ {found = \"true\"; print \$0; next}
/^[[:space:]]/ {if (found == \"true\") {print \$0} }
/^\w/ {if (found == \"true\") {exit 0}}"
}
get_monitor_size() {
dev="${2}"
echo "${1}" \
| awk "/^${dev}.*primary/ {print \$4; exit}
/^${dev}/ {print \$3; exit}" \
| sed 's/^\([[:digit:]]*x[[:digit:]]*\).*/\1/'
}
get_monitor_pos() {
dev="${2}"
echo "${1}" \
| awk "/^${dev}.*primary/ {print \$4; exit}
/^${dev}/ {print \$3; exit}" \
| sed 's/.*\([[:digit:]]+[[:digit:]]*\)/\1/' \
| sed 's/+/,/'
}
get_monitor_rate() {
echo "${1}" \
| awk '/*/ {print $2}' \
| sed 's/\([[:digit:]]\+\).*/\1/'
}
get_screen_number() {
echo "${1}" \
| awk '/Screen / {print $2; exit 0}' \
| sed 's/://'
}
get_minimum() {
echo "${*}" \
sed 's/ /\n/g' \
| awk "BEGIN {min = 1000000000}
{if (\$1 < min) {min = \$1}}
END {print min}"
}
odev_info=$(find_device_info "alsa_output")
odev=$(parse_device_name "${odev_info}")
odev_c=$(parse_channels "${odev_info}")
odev_r=$(parse_rate "${odev_info}")
idev_info=$(find_device_info "alsa_input")
idev=$(parse_device_name "${idev_info}")
idev_c=$(parse_channels "${idev_info}")
idev_r=$(parse_rate "${idev_info}")
min_sound_r=$(get_minimum "${odev_r}" "${idev_r}")
mon_info=$(find_monitor_info "${xrandr_out}" "${monitor}")
mon_s=$(get_monitor_size "${mon_info}" "${monitor}")
mon_p=$(get_monitor_pos "${mon_info}" "${monitor}")
mon_r=$(get_monitor_rate "${mon_info}")
screen=$(get_screen_number "${xrandr_out}")
ffmpeg -f pulse -ac "${odev_c}" -ar "${odev_r}" -i "${odev}" \
-f pulse -ac "${idev_c}" -ar "${idev_r}" -i "${idev}" \
-filter_complex amix=inputs=2 \
-f x11grab -s "${mon_s}" -r "${mon_r}" -probesize 100M -i "${DISPLAY}.${screen}+${mon_p}" \
-vcodec libx264 -preset veryfast -crf 18 \
-acodec libmp3lame -ar "${min_sound_r}" \
"${output}"