User:Steveadeff

From MythTV Official Wiki
Revision as of 20:18, 5 January 2007 by Steveadeff (talk | contribs) (fixes)

Jump to: navigation, search

Me

My Life

I am as of March 2006 an electrical engineer for Parsons in Boston, MA. I help design manufacturing and lab facilities for pharmaceuticals.

My Myth Contributions

I don't really code, but I try to be active in bug and feature testing.

I developed a TV.com import perl script for adding archived shows to the Watch Recordings DB. I've received help from folks on the myth mailing lists in this project.

  • I recently updated it for TVRage.com importing, the new version is sort of "beta" status and can be found here (tvragegrab).

My Systems

I have Comcast cable here in Boston. I use QAM for my HD and have two DCT-6200 digital cable boxen. My area has heavy 5C DRM enabled making firewire capture pretty pointless. So I use one connected to a PVR-150 for recording all the channels I get and the other is connected directly to my TV for HD use. It is also connected to my remote frontend via firewire and can be used for capture, which I've started doing now. Eventually I hope to replace them with two better quality 1000bT switches so this is no longer an issue).

Current Dedicated Back End

Running SVN, currently (and the last time I updated this...) fixes-95??

(I want to replace these with a single ~300GB ATA drive as its about equal on space but uses a lot less electricity and one less PCI slot...)

Current Dedicated Front End

Running 0.20-fixes currently (and the last time I updated this...) fixes-11468?

Current Bedroom Frontend

Since I stole components from my old desktop to build my dedicated backend/dedicated frontend pairing (and eventually my dedicated frontend), I used some old parts to make this, my bedroom frontend. This machine is usually off, I turn it on to play music or watch tv. Sadly, it doesn't quite have enough oomph to play HD in Myth even with XvMC, its also in a huge case, so I'm looking at getting a cheap miniATX mobo and decent looking miniATX case.


Encoding

I've become somewhat of a mencoder/BASH scripting guru through my many adventures using it and writing scripts. Hopefully, one day, MythArchive will allow for custom profiles with some of the better options/features of mencoder so that such scripts are no longer needed. But for now here are some of the scripts I've written for encoding...

So here are some of my encoding scripts. If you like them feel free to drop me an email (adeffs_dot_mythtv_at_gmail_com) and let me know. If you have some improvements drop me an email as well and I'll update the script here and give you a little shout-out!

HR.HDTV script

I wrote this script to create my own versions of what "the scene" calls HR.HDTV encodes. These look decent on HDTV's up to about 50". Beyond that I highly recommend using x264 at 720p encodes. It may take a lot more processing to get done, but if your TV is that big you'll thank me for recommending it.

So what this script does is convert any 1080i or 720p recording to "HR.HDTV" which is basically a 960x544 resolution file with the original AC3 soundtrack. It will encode to the CD size standard of putting one hour of tv on a CD (ie 44minutes into 700MB, 22minutes into 350MB). It's also a good start to doing other conversions as the options can easily be changes to do things like encode to x264 at 1280x720(hint hint)...

You will need PerlCalc for some math in the script...

 #!/bin/bash
 #
 # My script to create hr.hdtv encodes.
 #
 # This script will perform the following tasks:
 # 1. Analyze the original mpeg for
 #       a. play length
 #       b. audio size
 #       c. frame speed (60fps/30fps)
 # 2. Calculate final file size (350MB or 700MB)
 # 3. Calculate final video size based on final file
 #    size and audio size.
 # 4. Encode.
 #
 
 #variables
 overheadbytes=16
 server_default=POT
 
 #Functions
 #Video Length Calculation
 function VideoSizeCalc() {
         audiosize=`pc $audiobitrate/1000*$totalseconds*0.1220703125/1024`
         echo "Audio Size in MB = $audiosize"
 #       audiooverhead=`pc $totalseconds*1000/64`
 #       videooverhead=`pc 23.976*$totalseconds`
 #       totaloverhead=`pc $audiooverhead+$videooverhead`
 #       overheadsize=`pc $totaloverhead*$overheadbytes/1024**2`
 #       overheadsize=`echo `${overheadsize:0:4}``
 #       echo "(DD) Overhead = $overheadsize MB"
         totalseconds=`echo $totalseconds|sed -e 's/\.[0-9]*//'`
 #       echo "(DD) Total Seconds = $totalseconds"
         if [ $totalseconds -lt 1800 ]; then
                 totalsize=350
         elif [ $totalseconds -lt 3600 ]; then
                 totalsize=700
         else
                 echo "I don't know how to handle this length!"
                 exit 1
         fi
         echo "Total Size = $totalsize"
 #       videosize=`pc $totalsize-$overheadsize-$audiosize` #original formula
         videosize=`pc $totalsize-$audiosize`    # new one since overhead doesn't
 
                                                 #really matter its so small
         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".XviD-MythTV`
         folder_name=$input
 }
 
 #test for arguements
 if [[ -z "@ARGV" ]]; then
         echo "first arguement is the original mpg"
         echo "second arguement is the new folder name, will be used for filename"
         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 "Folder name will be: $folder_name"
         echo "File name will be: $file_name"
 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=//'`
 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 10
 videosize=`pc $videosize*1024`
 echo "Videosize = $videosize"
 
 if [[ -e "$original_name" ]]; then
         echo start `date +%H:%M`>$file_name.runtime
         if [[ "$videofps" -eq "59" ]]; then
                 nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf decimate=2:1000:1600:.001,scale=960:544 -ofps 24000/1001 -xvidencopts pass=1:vhq=0:me_quality=5:turbo:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o /dev/null
                 #
                 nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf decimate=2:1000:1600:.001,scale=960:544 -ofps 24000/1001 -xvidencopts pass=2:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o $file_name.avi
         elif [[ "$videofps" -eq "29" ]]; then
                 nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf decimate=2:1000:1600:.001,scale=960:544 -ofps 24000/1001 -xvidencopts pass=1:vhq=0:me_quality=5:turbo:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o /dev/null
                 #
                 nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf decimate=2:1000:1600:.001,scale=960:544 -ofps 24000/1001 -xvidencopts pass=2:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o $file_name.avi
         elif [[ "$videofps" -eq "29" ]]; then
                 nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf pullup,softskip,scale=960:544 -ofps 24000/1001 -xvidencopts pass=1:vhq=0:me_quality=5:turbo:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o /dev/null
                 #
                 nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf pullup,softskip,scale=960:544 -ofps 24000/1001 -xvidencopts pass=2:vhq=0:me_quality=5:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o $file_name.avi
         fi
         echo stop `date +%H:%M`>>$file_name.runtime
         echo "Runtime"
         more $file_name.runtime
 fi
 exit

NeroAAC in linux

Recently Nero released their wonderful AAC encoder for "DOS" (command line app in windows). Since I'm a huge fan of AAC for compressed audio due to its quality I was hoping they'd release a linux version, but as it turns out their windows version was designed to work a-o-k in linux under WINE!

The only caveats I've found is that you need to have the folder where you music ready for conversion is mapped as a drive in Wine. As well, the filenames cannot have any periods in them except for the one that designates the extension (ie this.song.is.good.flac is no good but this song is good.flac is fine), which is an issue I know how to solve with a simple perl rename, but have yet to tackle in the script... Other than that, your good to go.

So what I did, is I wrote a script that will convert any format mplayer supports, as well as APE to M4A. Right now I really only have it setup for WAV, FLAC and APE though, but its pretty easy to add other formats. For mplayer supported formats look at the FLAC functions, for formats that require another decoder to get to WAV look at the APE section. This script can also recursively enter folders, so you can rip a whole lot of CD's (using cdparanoia or EAC under WINE of course!) into seperate folders and run this script from their root and it will go into each folder and convert! how handy!

This site has some great info on the encoder, as well as how to encode directly to M4A when ripping with EAC. This is a good guide to do the same in K3B.

This script has two command line options as of now. First it will allow you to delete the original after a successful encode using -e, or you can specify a specific directory with -d.

This script also has some defined options near the top, EncoderDir=~/.wine/drive_c/Program\ Files/Nero QualityLevel="0.8"

EncoderDir is obviously where your neroAACenc.exe file is, and Quality level is a numerical value for the recording quality setting. I don't like compressed audio and find that 0.8 is a good balance for my ears and my desire to keep file sizes down. This equates to about 300Kbps, which is rather large for even the MP3 format, so feel free to change this value for your needs.

For those that used the old Nero encoder with "Quality Levels", here's a quick conversion chart...

Old Presets Quality Levels
Tape -q=0.0
Radio -q=0.1
Internet -q=0.2
Streaming -q=0.3
Normal -q=0.5
Extreme -q=0.6
Audiophile -q=0.8
Transcoding -q=1.0
 #!/bin/bash
 #
 #
 IFS=$'\n'
 EncoderDir=~/.wine/drive_c/Program\ Files/Nero
 QualityLevel="0.8"
 CURRENTDIR=`pwd`
 directory=$CURRENTDIR
 
 function Main() {
 
         until [ -z "$1" ]
         do
                 echo "Processing parameter of: '$1'"
 
                 if [ ${1:0:1} = '-' ]; then
                         tmp=${1:1} # Strip off leading '-' . . .
                         parameter=${tmp%%=*} # Extract name.
                         if [ "$parameter" = "e" ]; then
                                 echo "Will erase originals upon successful encode!"
                                 opt_e=1
                         fi
                         if [ "$parameter" = "d" ]; then
                                 directory=$1
                                 echo "Directory taken from command line as: $dir
                                 ectory"
                         fi
 
                 fi
 
         shift
         done
         echo "Working directory: $directory"
 
 for dir in $( find -type d )
 do
         cd $dir
         for file in $( find -maxdepth 1 -type f -name '*.flac' -printf '"%f"\n'|
 sort )
         do
                 echo "FLAC format found! Converting \""$file"\"..."
                 rename 's/\.{2,}//' $file
                 file=`echo "$file"|sed 's/\.{2,}//'`
                 basename=`echo "$file"|sed 's/\..*//'`
                 basename=`echo "$basename"|sed 's/\"//'`
 
                 RANDOM='time'
                 TEMPFILE=/dev/shm/neroaac-$RANDOM
                 DecodeMplayerSupported $basename.flac $TEMPFILE
                 EncodeToAAC $basename $TEMPFILE
                 rm -f $TEMPFILE
                 RemoveOriginal $basename flac
                 ls *flac
         done
 
         for file in $( find -maxdepth 1 -type f -name '*.wav' -printf '"%f"\n'|sort )
         do
                 echo "File "$file" already in Wave format, converting to AAC..."
                 basename=`echo "$file"|sed 's/\..*//'`
                 basename=`echo "$basename"|sed 's/\"//'`
                 EncodeToAAC $basename
                 RemoveOriginal $basename wav
                 ls *wav
         done
 
         for file in $( find -maxdepth 1 -type f -name '*.ape' -printf '"%f"\n'|sort )
         do
                 echo "APE format found! Converting \""$file"\"..."
                 basename=`echo "$file"|sed 's/\..*//'`
                 basename=`echo "$basename"|sed 's/\"//'`
                 RANDOM='time'
                 TEMPFILE=/dev/shm/neroaac-$RANDOM
                 DecodeAPE $basename.ape $TEMPFILE
                 EncodeToAAC $basename $TEMPFILE
                 rm -f $TEMPFILE
                 RemoveOriginal $basename ape
                 ls *ape
         done
 cd $CURRENTDIR
 done
         exit 0
 }
 
 function DecodeAPE() {
         inputfile=$1
         outputfile=$2
         nice -n 17 mac $inputfile $outputfile -d
 }
 
 function DecodeMplayerSupported() {
         inputfile=$1
         outputfile=$2
         nice -n 17 mplayer -vc null -vo null -ao pcm:file=$outputfile:fast "$inputfile"
 }
 
 function EncodeToAAC() {
         filebase="$1"
         infile="$filebase".wav
         outfile="$filebase".m4a
         if [ "$2" ]; then
                 infile="$2"
         fi
 
         echo "File base: $filebase"
         echo "TEMPFILE: $2"
         echo "Input File: $infile"
         echo "Output File: $outfile"
         nice -n 17 wine $EncoderDir/neroAacEnc.exe -q $QualityLevel -if "$infile" -of "$outfile"
         if [ $? -eq 0 ]; then
                 echo "Encode Success!"
                 success=1
 #               mv tmp.m4a "$outfile"
         else
                 echo "Encode Failed!"
                 success=0
 #               rm -f "tmp.m4a"
 #               rm -f "tmp.m4a"
         fi
 }
 
 function DiscoverFormat {
         input=$1
 
 
 }
 
 function RemoveOriginal {
         origfile=$1
         extension=$2
         if [ $opt_e -eq 1 ]; then
                 if [ $success -eq 1 ]; then
                         echo "Removing Original file: $origfile.$extension"
                         rm -f $origfile.$extension
                 else
                         echo "Not Removing Original file!"
                 fi
         fi
 }
 
 Main $@