#!/bin/bash # can include extra mencoder options after the filename/s #ASAMPLERATE="${ASAMPLERATE:-8000}" # Hz #ACHANNELS="${ACHANNELS:-1}" #ABITSIZE="${ABITSIZE:-8}" #AQUALITY="${AQUALITY:-100}" #ASAMPLERATE=8000 #ASAMPLERATE="${ASAMPLERATE:-44100}" # Hz #ACHANNELS="${ACHANNELS:-2}" #ABITSIZE="${ABITSIZE:-16}" #VKBITRATE="${VKBITRATE:-1000}" # Kbp/s #FPS="${FPS:-30}" # Hz # 23.976 v() { echo "$@" >&2 "$@" } AUDIO="${AUDIO:-1}" TWOPASS="${TWOPASS:-1}" if [ -z "$1" ]; then echo >&2 usage: `basename $0` infile.ext [outfile.mp4] exit fi I="$1" shift if [ -n "$1" ]; then O="$1" shift else O="$I" fi O="${O%.*}" # method from http://www.brad-x.com/2007/05/19/yet-another-linuxnix-video-h264-howto # changes: not to use dvd, no cropping, normal stereo not 6-channel stuff, tweaked for my camera's video format, autodetect parameters rm -f audiodump.wav "$O".aac "$O".264 divx2pass.log "$O".mp4 mplayerparams.sh # get video / audio parameters mplayer "$I" -identify -vc null -vo null -ao null -endpos 0 -frames 0 2>&1 | perl -ne 'print STDERR $_; chomp; /^VIDEO:\s+\[(.*?)\]\s+(\d+)x(\d+)\s+(\d+)bpp\s+([\d.]+) fps\s+([\d.]+) kbps/ && print "VINTYPE=$1\nVINWIDTH=$2\nVINHEIGHT=$3\nVINBPP=$4\nFPS=$5\nVINKBITRATE=".int($6)."\n"; /AUDIO: (\d+) Hz, (\d+) ch, ([us])(\d+)([bl]e)?, ([\d\.]+)/ && print "AINSAMPLERATE=$1\nACHANNELS=$2\nASIGN=$3\nABITSIZE=$4\nAENDIAN=$5\nAINKBITRATE=$6\n"; /^(ID_.*?)=(.*)$/ && !$already{$1}++ && print qq{$1="$2"\n}' > mplayerparams.sh # TODO use easily-parsed -identify parameters, rename my params to match cat mplayerparams.sh source mplayerparams.sh VKBITRATE="${VKBITRATE:-$VINKBITRATE}" # Kbp/s if [ "$VKBITRATE" = 0 -o "$VKBITRATE" = "0.0" ]; then export VINWIDTH VINHEIGHT VKBITRATE=`perl -e 'print int($ENV{VINWIDTH}*$ENV{VINHEIGHT}/(640*480)*1000)'` echo >&2 "WARNING: VINKBITRATE was reported as 0, using VKBITRATE=$VKBITRATE" fi ASAMPLERATE="${ASAMPLERATE:-$AINSAMPLERATE}" if [ -z "$AQUALITY" ]; then AQUALITY=`perl -e '$aq = int('$ID_AUDIO_BITRATE'/1000/120.0*100+0.5); if ($aq<10) { $aq=100 } elsif ($aq>800) { $aq=500 } print $aq'` # TODO might be better to use the -b (bitrate) option to faac? fi if [ "$AUDIO" = 1 ]; then mkfifo audiodump.wav # RESAMPLE="" # if [ "$ASAMPLERATE" != "$AINSAMPLERATE" ]; then # RESAMPLE="-srate $ASAMPLERATE -af-adv force=5" # fi echo >&2 echo >&2 AUDIO: if [ -e audiodump.wav ]; then v faac --mpeg-vers 4 -q "$AQUALITY" audiodump.wav -o "$O".aac & v mplayer "$I" -vo null -ao pcm:fast & else v mplayer "$I" -vo null -ao pcm:fast v faac --mpeg-vers 4 -q "$AQUALITY" audiodump.wav -o "$O".aac fi wait elif [ "$AUDIO" = mp3 -a "`macodec "$I"`" = mp3 ]; then ffmpeg -i "$I" -vn -acodec copy "$O".mp3 fi if [ "$TWOPASS" = 1 ]; then echo >&2 echo >&2 VIDEO 1: v mencoder -nosound -of rawvideo -ovc x264 -vf scale,harddup "$@" -x264encopts bitrate=$VKBITRATE:frameref=6:analyse=all:me=umh:subme=7:trellis=2:bframes=1:subq=7:brdo:mixed_refs:weight_b:bime:no_fast_pskip:direct_pred=auto:mixed_refs:nr=200:threads=auto:turbo=2:pass=1 -noskip "$I" -o /dev/null echo >&2 echo >&2 VIDEO 2: v mencoder -nosound -of rawvideo -ovc x264 -vf scale,harddup "$@" -x264encopts bitrate=$VKBITRATE:frameref=6:analyse=all:me=umh:subme=7:trellis=2:bframes=1:subq=7:brdo:mixed_refs:weight_b:bime:no_fast_pskip:direct_pred=auto:mixed_refs:nr=200:threads=auto:pass=2 -noskip "$I" -o "$O".264 else echo >&2 echo >&2 VIDEO: v mencoder -nosound -of rawvideo -ovc x264 -vf scale,harddup "$@" -x264encopts bitrate=$VKBITRATE:frameref=6:analyse=all:me=umh:subme=7:trellis=2:bframes=1:subq=7:brdo:mixed_refs:weight_b:bime:no_fast_pskip:direct_pred=auto:mixed_refs:nr=200:threads=auto -noskip "$I" -o "$O".264 fi echo >&2 echo >&2 MP4: v mp4creator -rate "$FPS" -a "$O".264 "$O".mp4 if [ "$AUDIO" = 1 ]; then v MP4Box -add "$O".aac "$O".mp4 elif [ "$AUDIO" = mp3 ]; then v MP4Box -add "$O".mp3 "$O".mp4 fi if [ "$KEEP" != 1 ]; then rm -f audiodump.wav "$O".aac "$O".264 divx2pass.log mplayerparams.sh fi echo >&2 echo >&2 DONE echo >&2