106 lines
2.9 KiB
Plaintext
106 lines
2.9 KiB
Plaintext
|
#!/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}"
|