128 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| ############
 | |
| # TODO:
 | |
| ############
 | |
| # - audio format RAW possible? might be preferrable over WAV
 | |
| # - remove temporary files after muxing?
 | |
| # - test how far can push video size
 | |
| # - allow substituting aucat with custom other audio recording for portability?
 | |
| # - check if ffmpeg and aucat available in path
 | |
| # - if -m works, set muxflag=on as default
 | |
| # - don't set audiostream (-a flag) to snd/0.mon because not enabled by default?
 | |
| # - check with regex that format of -r (resolution) is correct? (shouldn't this
 | |
| #   be left to ffmpeg)
 | |
| # - test if position can be added to resolution (-r) argument? (like 640x480+48+48)
 | |
| # - add mention of $DISPLAY variable for the recording?
 | |
| # - AFAIK '-preset ultrafast' is specific to libx264 and needs to be disabled
 | |
| #   for use of other codecs
 | |
| # - get default framerate from xrandr? same for resolution - default to desktop
 | |
| #   resolution?
 | |
| # - mention need to stop recording with Ctrl-C??
 | |
| # - don't check for filename if -m (muxflag=off)
 | |
| # - add flag to skip recording and only mux (to adjust volume ratio, for example)
 | |
| # - add highpass=f=200,lowpass=f=3000
 | |
| # - HIGH PRIORITY: replace libfdk_aac!
 | |
| ###########
 | |
| 
 | |
| USAGE="Usage: `basename $0` [-m] [-r resolution] [-a stream] [-c codec] [-p path] [-f framerate] [-v0 volume_adjustment] [-v1 volume_adjustment] file"
 | |
| 
 | |
| # Parse arguments based on http://www.shelldorado.com/goodcoding/cmdargs.html
 | |
| 
 | |
| filename=
 | |
| resolution=
 | |
| audiostream=
 | |
| videocodec=
 | |
| streampath=
 | |
| volume1=
 | |
| volume2=
 | |
| framerate=
 | |
| muxflag=on
 | |
| hilopass=
 | |
| 
 | |
| if [[ $# -eq 0 ]];then
 | |
| 	echo $USAGE; exit 0
 | |
| fi
 | |
| 
 | |
| while [[ $# -gt 0 ]]
 | |
| do
 | |
| 	case "$1" in
 | |
| 		-m) muxflag=off;;
 | |
| 		-r) resolution="$2"; shift;;
 | |
| 		-a) audiostream="$2"; shift;;
 | |
| 		-c) videocodec="$2"; shift;;
 | |
| 		-p) streampath="$2"; shift;;
 | |
| 		-v0) volume0="$2"; shift;;
 | |
| 		-v1) volume1="$2"; shift;;
 | |
| 		-f) framerate="$2"; shift;;
 | |
| 		-hl) hilopass=",highpass=f=200,lowpass=f=3000";;
 | |
| 		-h) echo $USAGE; exit 0;;
 | |
| 		-*) echo $USAGE; exit 0;;
 | |
| 		*) filename="$1"; break;;
 | |
| 	esac
 | |
| 	shift
 | |
| done
 | |
| 
 | |
| # set defaults if not specified in arguments
 | |
| if [[ -z "$streampath" ]];then
 | |
| 	streampath="/tmp"
 | |
| fi
 | |
| if [[ -z "$resolution" ]];then
 | |
| 	resolution=640x480
 | |
| fi
 | |
| if [[ -z "$framerate" ]];then
 | |
| 	framerate=60
 | |
| fi
 | |
| # FIXME: find a way that -a not needed
 | |
| if [[ -z "$audiostream" ]];then
 | |
| 	echo "IN DEVELOPMENT: -a argument needed at the moment (e.g. '-a snd/0.mon')"; exit 1
 | |
| fi
 | |
| if [[ -z "$videocodec" ]];then
 | |
| 	videocodec=libx264
 | |
| fi
 | |
| if [[ -z "$filename" ]];then
 | |
| 	echo $USAGE; exit 0
 | |
| fi
 | |
| if [[ -z "$volume0" ]];then
 | |
| 	volume0=1.0
 | |
| fi
 | |
| if [[ -z "$volume1" ]];then
 | |
| 	volume1=1.0
 | |
| fi
 | |
| 
 | |
| # remove temp files in case they exist (from prior attempts)
 | |
| rm $streampath/fauxrec_{v0.mp4,a{0,1}.wav}
 | |
| 
 | |
| # record the streams
 | |
| # 'sh -i' makes it so that the aucat and ffmpeg jobs receive SIGINT rather than
 | |
| # this running script
 | |
| sh -i -c "aucat -f snd/0 -o \"$streampath/fauxrec_a0.wav\" | \
 | |
| 	aucat -f $audiostream -o \"$streampath/fauxrec_a1.wav\" | \
 | |
| 	ffmpeg -f x11grab -video_size $resolution -framerate $framerate \
 | |
| 	-i $DISPLAY -c:v $videocodec -preset ultrafast \
 | |
| 	$streampath/fauxrec_v0.mp4"
 | |
| 
 | |
| echo ""
 | |
| echo "*** Recording complete. ***"
 | |
| echo ""
 | |
| 
 | |
| # multiplex the separate streams
 | |
| if [[ $muxflag = on ]];then
 | |
| 	echo "Multiplexing streams to $filename..."
 | |
| 	echo $hilopass
 | |
| 	echo ""
 | |
| 	ffmpeg -i "$streampath/fauxrec_v0.mp4" -i "$streampath/fauxrec_a0.wav" \
 | |
| 		-i "$streampath/fauxrec_a1.wav" -filter_complex \
 | |
| 		"[1]volume=$volume0,aformat=channel_layouts=stereo$hilopass[l];[2]volume=$volume1,aformat=channel_layouts=stereo[m];[l][m]amerge=inputs=2[a]" \
 | |
| 		-map '0:v:0' -map '[a]' -c:v copy -c:a aac -q:a 2 -ac 2 \
 | |
| 		$filename
 | |
| 	if [[ $? -eq 0 ]];then
 | |
| 		echo ""
 | |
| 		echo "*** Multiplexing complete. ***"
 | |
| 	else
 | |
| 		echo ""
 | |
| 		echo "*** Multiplexing failed. ***"
 | |
| 	fi
 | |
| 	echo ""
 | |
| fi
 | 
