root@mythtv:~# cat /usr/bin/myth720-TV #!/bin/bash # # H.264 encode script for 720p/AC3. Based on Steve Adeff's excellent # script from the Myth Wiki. I used his math but replaced the transcoding # stuff with ffmpeg to preserve good sync. I also added a variable # to define number of processors in order to take advantage of multithreaded # transcoding. This speeds my system up fourfold. I also changed the # bitrate calculation to make it a bit mroe accurate. # ## SCRIPT USAGE IN MYTH IS scriptname "%DIR%/%FILE%" "%TITLE%" "%SUBTITLE%" # # Define your number of processors/cores here so that I can figure out # how many threads to encode with. # # You need to define all of the below or things may not work right. # # Prerequisites for using this script are: # # -Working ffmpeg with x.264 support # -Mencoder/mplayer for timing/framerate/etc # -A /usr/bin/pc (or somewhere in your path "pc") file. Just a simple # perl calculator. It's just an executable script that contains: # # #!/usr/bin/perl # print eval(join(' ',@ARGV)).qq{ # }; # processors=4 resolution=1280x720 mkdir "/home/mythtv/720p/$2" OUTDIR=/home/mythtv/720p/$2 # Miscellaneous encode options to pass. Add new options here. encopts="-coder 1 -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -me_method hex -subq 5 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 1 -i_qfactor 0.71 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -async 1" ## End of definitions. Don't change anything after this point unless ## you know what you're doing, or if I screwed something up. SUBTITLE=$3 overheardbytes=16 server_default=POT threads=`pc $processors*2-2` #Functions #Video Length Calculation function VideoSizeCalc() { audiosize=`pc $audiobitrate/1000*$totalseconds*0.1220703125/1024` echo "Audio Size in MB = $audiosize" totalseconds=`echo $totalseconds|sed -e 's/\.[0-9]*//'` if [ $totalseconds -lt 1800 ]; then totalsize=500 elif [ $totalseconds -lt 3600 ]; then totalsize=1050 elif [ $totalseconds -lt 9000 ]; then #Here I assume you will want to be more totalsize=5000 #generous if you run it on a movie. else echo "I don't know how to handle this length!" exit 1 fi echo "Total Size = $totalsize" videosize=`pc $totalsize-$audiosize` videosize=`echo `${videosize:0:3}`` echo "Videosize = $videosize MB" } function FolderNameClean() { input=$1 input=`echo "$input" | sed -e 's/.[Aa][Vv][Ii]//'` input=`echo "$input"` folder_name="$input" } #test for arguements if [[ -z "@ARGV" ]]; then echo "First argument is, in myth syntax, %DIR%/%FILE%" echo "Second argument is, in myth syntax, %TITLE%" echo "third argument is, in myth syntax, %SUBTITLE%" exit else #Reassign variables if [[ ! -e $1 ]]; then echo "no such input mpg!" exit else original_name=$1 fi folder_name="$2" FolderNameClean $2 file_name=`echo "$folder_name" | tr A-Z a-z` # display arguments echo "Original mpeg is: $original_name" echo "File name will be: $2 - $3.mp4" fi #Grab input file information echo "Determining total file length..." totalseconds=`mencoder $original_name -ovc copy -nosound -o /dev/null -quiet 2>&1 | awk '/^Video stream:/{print $10+$10/$12}'` echo "total seconds = $totalseconds" audiobitrate=`mplayer -vo null -ao null -frames 0 -identify "$original_name" 2>/dev/null | grep "ID_AUDIO_BITRATE" | sed -e 's/ID_AUDIO_BITRATE=0//' | grep "ID_AUDIO_BITRATE" | sed -e 's/ID_AUDIO_BITRATE=//'` echo "audio bitrate = $audiobitrate" videowidth=`mplayer -vo null -ao null -frames 0 -identify "$original_name" 2>/dev/null | grep "ID_VIDEO_WIDTH" | sed -e 's/ID_VIDEO_WIDTH=//'` videoheight=`mplayer -vo null -ao null -frames 0 -identify "$original_name" 2>/dev/null | grep "ID_VIDEO_HEIGHT" | sed -e 's/ID_VIDEO_HEIGHT=//'` videofps=`mplayer -vo null -ao null -frames 0 -identify "$original_name" 2>/dev/null | grep "ID_VIDEO_FPS" | sed -e 's/ID_VIDEO_FPS=//'` videofps=`echo `${videofps:0:2}`` echo "FPS: $videofps" aspect=`pc $videowidth/$videoheight` aspect=`echo "$aspect" | tr -s [:digit:]` echo "Aspect Ratio: $aspect" #Calculate Video size VideoSizeCalc sleep 5 videosize=`pc $videosize*1024` echo "Videosize = $videosize" BITRATE_CALC_AUDIO=`pc $audiobitrate/8000` CALC_1=`pc $BITRATE_CALC_AUDIO*$totalseconds` CALC_2=`pc $videosize` CALC_3=`pc $CALC_2-$CALC_1` BITRATE_CALC_FINAL=`pc $CALC_3/$totalseconds` BITRATE_CALC=`pc $BITRATE_CALC_FINAL/100` BITRATE_CALC=`echo $BITRATE_CALC | sed 's/^\([^\.]*\...\).*/\1/'` BITRATE=`echo $BITRATE_CALC`M echo "Video bitrate will be = $BITRATE" sleep 5 if [[ -e "$original_name" ]]; then echo start `date +%H:%M`>$file_name.runtime if [[ "$videofps" -eq "59" ]]; then cd "$OUTDIR" # nice -n 17 ffmpeg -i $original_name -an -pass 1 -vcodec libx264 -threads $threads -s $resolution -b $BITRATE -bt $BITRATE $encopts "$OUTDIR/$file_name.1stpass.mp4" # nice -n 17 ffmpeg -i $original_name -acodec libfaac -ab $audiobitrate -pass 2 -vcodec libx264 -threads $threads -s $resolution -b $BITRATE -bt $BITRATE $encopts "$OUTDIR/$2 - $SUBTITLE.mp4" # elif [[ "$videofps" -eq "29" ]]; then cd "$OUTDIR" # nice -n 17 ffmpeg -i $original_name -acodec libfaac -ab $audiobitrate -pass 1 -vcodec libx264 -threads $threads -s $resolution -b $BITRATE -bt $BITRATE $encopts "$OUTDIR/$file_name.1stpass.mp4" # nice -n 17 ffmpeg -i $original_name -acodec libfaac -ab $audiobitrate -pass 2 -vcodec libx264 -threads $threads -s $resolution -b $BITRATE -bt $BITRATE $encopts "$OUTDIR/$2 - $SUBTITLE.mp4" # # Cleanup! #rm $OUTDIR/$file_name.1stpass.mp4 #rm $OUTDIR/x264_2pass.log #rm $OUTDIR/ffmpeg2pass-0.log fi echo stop `date +%H:%M`>>$file_name.runtime echo "Runtime" more $file_name.runtime rm $file_name.runtime fi exit root@mythtv:~#