All pastes #1175534 Raw Edit

Stuff

public text v1 · immutable
#1175534 ·published 2008-08-17 07:07 UTC
rendered paste body
#!/bin/bash

echo "Re-encoding script (c) 2008 Zider"

main () {
	checkapps
	getsrcinfo
	printsrcinfo
	calcaudiosize
	calcvidres
	printdstinfo
if [ "$copyaudio" = "yes" ]; then
	audio
else
	audfile=$infile
fi

	encode 1
	encode 2
}

getconfig () {
	vid_maxx="720"
	vid_maxy="576"
	cfg_aspect="4:3"
	vid_bitrate="1500"
	aud_bitrate="128"
	aud_format="vorbis"

	threads=1
	tmpfile="/dev/null"
	tmpvid="$HOME/.reencode.$$.vid"
	tmpaud="$HOME/.reencode.$$.aud"
	tmptime="$HOME/.reencode.$$.time"
	tmpout="$HOME/.reencode.$$.out"
	tmppipe="$HOME/.reencode.$$.pipe"
	logfile="$HOME/.reencode.$$.log"
	rm -f $logfile $tmpvid $tmpaud

	cfg_ratio=$(echo "scale=10; `echo ${cfg_aspect} | awk -F\: '{print $1}'`/`echo ${cfg_aspect} | awk -F\: '{print $2}'`"|bc)
	vid_realx=$(echo "scale=0; $vid_maxx * $cfg_ratio"|bc|awk -F\. '{print $1}')
	if [ $(echo "scale=1; $vid_maxx * $cfg_ratio"|bc|awk -F\. '{print $2}') -gt 5 ]; then
		((vid_realx++))
	fi
}

checkapps () {
	timepath=$(which time 2>/dev/null)
	if [ -n "$timepath" ]; then
		timecmd="eval $timepath -o $tmptime --format=\" (finished in %E, using %P CPU)\""
	else
		timecmd=""
	fi

	mplayerpath=$(which mplayer 2>/dev/null)
	if [ -z "$mplayerpath" ];then
		echo "ERR: mplayer not found, exiting"
		exit 1
	fi

	mencoderpath=$(which mencoder 2>/dev/null)
	if [ -z "$mencoderpath" ];then
		echo "ERR: mencoder not found, exiting"
		exit 1
	fi

	mkvmergepath=$(which mkvmerge 2>/dev/null)
	if [ -z "$mkvmergepath" ];then
		echo "ERR: mkvmerge not found, exiting"
		exit 1
	fi
}


trap 'echo "ERR: some command failed, exiting" ; exit 1' ERR
trap 'echo Control-C trap caught && rm -f $logfile $tmpvid $tmpaud $tmptime && exit 1' 2


### Get information from the source file..

getsrcinfo () {
#	echo $infile
	audid_count=0
	while read line
	do
		STR=$line
		var="`echo $line | awk -F\= '{print $1}'`"
		val=`echo $line | awk -F\= '{print $2}'`

		if [ "$var" = "ID_AUDIO_ID" ]; then
			if [ ! -z "$ID_AUDIO_ID" ];then
				oldvar=$ID_AUDIO_ID
			fi
			if [ "$audid_count" == 0 ];then
				eval `echo $var`=$val
			else
				eval `echo $var`="$oldvar $val"
			fi
			((audid_count++))
		else
			eval `echo $line | awk -F\= '{print $1}'`=\"$val\"
		fi
	done < <(mplayer -vo null -ao null -frames 1 -identify "$infile" 2>/dev/null | awk '/^ID_/')

	if [[ -n ${vid_aspect} ]]; then
		if [[ ${vid_aspect} =~ [0-9]*\.[0-9]* ]]; then
			ID_VIDEO_ASPECT=${vid_aspect}
		elif [[ ${vid_aspect} =~ [0-9]*:[0-9]* ]]; then
			ID_VIDEO_ASPECT=$(echo "scale=4; `echo ${vid_aspect} | awk -F\: '{print $1}'`/`echo ${vid_aspect} | awk -F\: '{print $2}'`"|bc)
		else
			echo "-va must be in the form of 16:9 or 1.7778!"
			exit 0
		fi
	fi

	echo $ID_VIDEO_ASPECT

}

### ..and print it..

printsrcinfo () {
	seconds=$(echo "$ID_LENGTH"|awk -F\. '{print $1}')

	echo "Source file info:"
	echo "Play length:      $((seconds / 3600)):$(printf "%.2d" $(($((seconds % 3600)) / 60))):$(printf "%.2d" $((seconds % 60)))"
	echo "Video format:     $ID_VIDEO_FORMAT"
	echo "Video resolution: $ID_VIDEO_WIDTH x $ID_VIDEO_HEIGHT (aspect $ID_VIDEO_ASPECT)"
	echo "Audio format:     $ID_AUDIO_CODEC"
	echo ""
}

## Calculate audio track size and video bitrate..

calcaudiosize () {
	if [ "$copyaudio" = "yes" ]; then
		aud_br=0
		for ID_AUDIO_ID in $ID_AUDIO_ID;do
			aud_br=$(echo "$aud_br+($aud_bitrate*1000)"|bc)
		done
	else
		aud_br=$ID_AUDIO_BITRATE
		aud_format="$ID_AUDIO_CODEC (copy)"
	fi


	if [ -n "$vid_size" ];then
		vid_bitrate="$(echo "((($vid_size*1024)-(($aud_br/1024/8)*$ID_LENGTH)/1024)/$ID_LENGTH)*10"|bc)"
	fi
}

### Calculate video resolution..

calcvidres () {
	ID_VIDEO_WIDTH=$(echo "scale=0; $ID_VIDEO_WIDTH * $ID_VIDEO_ASPECT"|bc|awk -F\. '{print $1}')

	rx=$(echo "scale=10; $ID_VIDEO_HEIGHT / $ID_VIDEO_WIDTH"|bc)
	ry=$(echo "scale=10; $ID_VIDEO_WIDTH / $ID_VIDEO_HEIGHT"|bc)

	if [ ${ID_VIDEO_WIDTH} -gt $vid_realx ]; then
	        ID_VIDEO_WIDTH=$vid_realx
	        ID_VIDEO_HEIGHT=$(echo "scale=10; $ID_VIDEO_WIDTH * $rx"|bc|awk -F\. '{print $1}')
	fi

#	echo "scale=10; $ID_VIDEO_WIDTH * $rx"|bc|awk -F\. '{print $2}'

	if [ ${ID_VIDEO_HEIGHT} -gt $vid_maxy ]; then
	        ID_VIDEO_HEIGHT=$vid_maxy
	        ID_VIDEO_WIDTH=$(echo "scale=10; $ID_VIDEO_HEIGHT * $ry"|bc|awk -F\. '{print $1}')
	fi
	echo "$ID_VIDEO_WIDTH x $ID_VIDEO_HEIGHT"

#	echo "scale=10; $ID_VIDEO_WIDTH / $cfg_ratio"|bc|awk -F\. '{print $2}'

	ID_VIDEO_WIDTH=$(echo "scale=0; $ID_VIDEO_WIDTH / $cfg_ratio"|bc|awk -F\. '{print $1}')

#	((ID_VIDEO_WIDTH++))

	ID_VIDEO_WIDTH=$(echo "scale=0; ($ID_VIDEO_WIDTH/16)*16"|bc)
	ID_VIDEO_HEIGHT=$(echo "scale=0; ($ID_VIDEO_HEIGHT/16)*16"|bc)
}

### Print out what we will encode to..

printdstinfo () {
	if [ -z "$vid_size" ];then
		vid_size="$(echo "(($vid_bitrate/8)+($aud_br/1024/8))*$ID_LENGTH/1024"|bc)"
	#	echo "(($vid_bitrate/8)+($aud_br/1024/8))*$ID_LENGTH/1024"
	fi
	echo "Destination file info:"
	echo "Video format:     XVID @ $vid_bitrate kbps"
	echo "Video resolution: $ID_VIDEO_WIDTH x $ID_VIDEO_HEIGHT (${cfg_aspect})"
	echo "Audio format:     $aud_format @ $(($aud_br/1000)) kbps"
	echo "File size:        $vid_size MB"
	echo ""
}

### Extract audio track(s)..

audio () {
	audid_count=1
	aud_size=0
	for ID_AUDIO_ID in $ID_AUDIO_ID;do
		echo -n "Extracting audio track $audid_count..        "
		rm -f $tmppipe && mkfifo $tmppipe
		$($timecmd $mplayerpath $short "$infile" -vo null -vc dummy -aid $ID_AUDIO_ID -ao pcm:waveheader:file="/dev/fd/3" 3>&1 1>$tmppipe 2>&1| oggenc -Q -b $aud_bitrate -o "$tmpaud-$audid_count" /dev/stdin | cat $tmppipe | tr "\r" "\n" | sed -u -n '0~5p' >$tmpout)&
		mppid=$!

		while [ "$(ps -p $mppid | wc -l)" = "2" ];do
			sleep 1
			line="$(tail -n 2 $tmpout|head -n 1)"

			vid_pos="$(printf "%6s" `echo -n "$line" | sed -n -e "s/.*A:\([ ,0-9]*\.[0-9]\) (.*/\1/p"`)"
			if [ ! "$vid_pos" = "" ]; then
				if [ "$short" = "" ]; then
					vid_length=$(printf "%4s" `echo $ID_LENGTH | awk -F\. '{print $1}'`)
					vid_pct="$(printf "%2s" `echo "scale=2; ($vid_pos/$vid_length)*100"|bc|awk -F\. '{print $1s}'`)%"
				else
					vid_length="  30"
					vid_pct="$(printf "%2s" `echo "scale=2; ($vid_pos/$vid_length)*100"|bc|awk -F\. '{print $1s}'`)%"
				fi

				echo -en "$(echo "$vid_pos" | awk -F\. '{print $1}')/$vid_length sec ($vid_pct)\033[19D"
			fi
		done

		audfile=$tmpaud-$audid_count
		((audid_count++))

		aud_size=$(echo "$aud_size+(($aud_bitrate/8)*$ID_LENGTH)"|bc)
		echo "OK $(cat $tmptime)"
		rm -f $tmppipe
	done
}


### Start video encoding pass 1 and 2..

encode () {
	pass=$1

	echo -n "Encoding to temp file (pass $pass)..  "

	$($timecmd $mencoderpath \"$infile\" -lavdopts threads=$threads $short -vf scale=$ID_VIDEO_WIDTH:$ID_VIDEO_HEIGHT -nosound -ovc lavc -lavcopts vcodec=mpeg4:threads=2:vpass=$pass:turbo -ffourcc XVID -passlogfile \"$logfile\" -o \"$tmpvid\" 2>&1 | tr "\r" "\n" | sed -u -n '0~5p' >$tmpout)&
	mppid="$!"

	while [ "$(ps -p $mppid | wc -l)" = "2" ];do
		sleep 1
		line="$(tail -n 2 $tmpout|head -n 1)"

		vid_pos="$(echo -n "$line" | sed -n -e "s/.*Pos:\([ ,0-9]*\.[0-9]\)s.*/\1/p")"
		if [ ! "$vid_pos" = "" ]; then
			if [ "$short" = "" ]; then
				vid_length=$(printf "%4s" `echo $ID_LENGTH | awk -F\. '{print $1}'`)
				vid_pct="$(printf "%3s"  `echo -n "$line" | sed -n -e "s/.*(\([ ,0-9]*%\)).*/\1/p"`)"
			else
				vid_length="  30"
				vid_pct="$(printf "%3s" `echo "scale=2; ($vid_pos/$vid_length)*100"|bc|awk -F\. '{print $1s}'`)%"
			fi

#			echo -en "$(echo "$vid_pos" | awk -F\. '{print $1}')/$vid_length sec ($vid_pct)\033[19D"
			echo -en "\r\033[34C$(printf "%5s" `echo "$vid_pos" | awk -F\. '{print $1}'`)/$(printf "%5s" `echo $vid_length`) sec ($vid_pct)"
		fi
	done
	echo -e "\r\033[34COK $(cat $tmptime)"
}

getconfig

getargs () {
	mkvmopts="/dev/null"
	debug="no"
	short=
	copyaudio="no"
	infile=
	outfile=
	alang=
	slang=
	vid_size=
	vid_aspect=
	while [ $# -gt 0 ]
	do
	    case "$1" in
		-ab) aud_bitrate="$2"; copyaudio="yes"; shift;;
		-am) aud_format="mp3"; shift;;

		-vb) vid_bitrate=$2; shift;;
		-vx) vid_maxx="$2"; shift;;
		-vy) vid_maxy="$2"; shift;;
		-vs) vid_size="$2"; shift;;
		-va) vid_aspect="$2"; shift;;

		-c)  copyaudio="yes";;
		-d)
			mkvmopts="/dev/stdout"
			debug="yes";;
		-s) short="-endpos 00:00:30";;
		-t) tmpfile="$tmpvid";;
		-i) infile="$2"; shift;;
		-o) outfile="$2"; shift;;
	        -alang) alang="--language 0:$2"; shift;;
	        -slang) slang="--language 0:$2"; shift;;
		-*) echo >&2 \
		    "usage: $0 -i infile -o outfile [-ab <audiobitrate>] [-vb <videobitrate>] [-x <max width>] [-y <max height>] [-alang <audio language>] [-slang <subtitle language>] [-c] [-d] [-t] [-s] [-v] [-nw] [-t <tempfile>]"
		    exit 1;;
		*)  break;;	# terminate while loop
	    esac
	    shift
	done

	srtfile=`echo $1|sed s/.[^-.]*$/.srt/i -`
}

getargs $@
main

echo -n "Merging into mkv file..           "
if [ "${infile#*.}" = "mkv" ]; then
	mkvmerge -o "$outfile" --aspect-ratio 0:${cfg_ratio} -S -A -B "$tmpvid" -S -D -B $alang "$audfile" -A -D -B $slang "$infile" >$mkvmopts
else
	if [ -e "$srtfile" ]; then
		mkvmerge -o "$outfile" --aspect-ratio 0:16/9 -S -A -B "$tmpvid" -S -D -B $alang "$audfile" -A -D -B $slang "$srtfile" >$mkvmopts
	else
		mkvmerge -o "$outfile" --aspect-ratio 0:16/9 -S -A -B "$tmpvid" -S -D -B $alang "$audfile" >$mkvmopts
	fi
fi
echo "OK"

rm -f $logfile $tmpvid $tmpaud $tmptime