#!/bin/bash # A simple script to grab a screencast of a window using ffmpeg # Once started, select the window you want to record, and start # talking/using the indicated program # Select window to grab info from INFO=$(xwininfo -frame) # Get the window size WIN_SIZE=$(echo $INFO | grep -oEe 'geometry [0-9]+x[0-9]+' | grep -oEe '[0-9]+x[0-9]+') # Get the window position WIN_XY=$(echo $INFO | grep -oEe 'Corners: \+[0-9]+\+[0-9]+' | grep -oEe '[0-9]+\+[0-9]+' | sed -e 's/\+/,/') # Determine window width and window height, and adjust to be divisible by two WIN_WIDTH=$(echo $WIN_SIZE | cut -d "x" -f 1 | awk '{print $1+$1%2}') WIN_HEIGHT=$(echo $WIN_SIZE | cut -d "x" -f 2 | awk '{print $1+$1%2}') # Run ffmpeg # Audio from alsa, using one channel, using the default pulse input device # Video from X11, framerate 30 # Use the libx264 video encoder with the lossless_ultrafast preset # Use the libmp3lame audio encoder # Output to a file in the user's homedir, using current date and time ffmpeg \ -f alsa -ac 1 -i pulse \ -f x11grab -r 30 -s ${WIN_WIDTH}x${WIN_HEIGHT} -i :0.0+${WIN_XY} \ -vcodec libx264 -vpre lossless_ultrafast \ -acodec libmp3lame \ ${HOME}/screencast-$(date +%F-%H-%M-%S).mkv