#!/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}"