View Full Version : Bash Script for Linux User
linuxnutzer
08-22-2008, 05:45
Hi,
here a small :) script that I use for quick video conversion on my computer with mencoder. It is not perfect and maybe I will extend it by other features when I have time. If somebody have nice ideas, pease post.
The main purpose is to control the cropping of videos with larger aspect ratio than 1.333. The solutions I have found before will either crop to much (no black bars on top and bottom) or leave large black bars (Did you ever watch a cinemascope film without crop in width on your D2 :)).
Simply type: "video_to_D2 file" to convert with default settings. (* or *.mov|avi|mpeg|... for batch conversion)
Type: "video_to_D2" to get a detailed help.
Limitations:
- There is no support for subtitles.
Some notes:
1) There seems to be no need for framerate conversion for the D2. My D2
(FW2.50) plays videos with 13, 15, 25, 29.97 fps fine. Furtheremore I
converted a HD video to a 500 kBit/s avi with 59.940 fps and it plays fine.
Try it out if you have A/V sync problems with current solutions.
2) Conversion of black bars around the video wasts video bitrate and leads to
lower quality. Therefore, crop this black bars before encoding.
3) The width of the video for the D2 must be 320. On the other hand, the
height can be smaller than 240. There is no need for add black bars on top
and bottom before encoding (see 2)
4) There must be a audio track in the video. If not, the script will
automatically add a silent track with low bit/sample -rate.
5) If the original video contains a mp3 audio track, it will not be reencoded.
Mplayer seems to have A/V sync problems playing the converted video,
but xine and the D2 do not have any problems.
Save the following lines to a file of any name and make it executable.
video_to_D2
---------------- crop here -------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool]
VBITRATE=500
ABITRATE=128
TWOPASS=1
ProgName=${0##*/}
NUMBERTHREADS=`cat /proc/cpuinfo | grep -c "^processor"`
SCALE="scale=320:-2,crop=:240"
CROP1=0:0
YSIZE=240
AUTOASPECTMODE=0
BARSIZE="0.5"
SCALEMETHOD=0
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
DEVNULL="/dev/null"
usage()
{
echo "Usage: $ProgName"
echo " [-s <mencoder video filter options (crop/scale)> |"
echo " <predefined scale/crop options>]"
echo " [-C <first crop parameter> [-B rel. bar size]"
echo " [-l] [-o]"
echo " [-c <start time>]"
echo " [-v [-C <first crop parameter>]]"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: 500 kBit/s"
echo " audio bitrate: 128 kBit/s"
echo " two pass encoding"
echo " scale=320:-2,crop=:240 -> full width - black bars or cropped in height"
echo " "
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: 250 kBit/s"
echo " -> audio bitrate: 64 kBit/s"
echo "-o: one pass encoding"
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: determine the aspect ratio of video after first crop automatically"
echo "-s: scale/crop"
echo " "
echo "Predefined scale/crop options:"
echo " cut16to9 -> scale=-2:208,crop=320:"
echo " cut16to9on4to3 -> crop=:400,scale=-2:208,crop=320:,expand=320:"
echo " cut1.66on4to3pal -> crop=:432,scale=-2:224,crop=320:,expand=320:"
echo " cut2.21on16to9pal -> crop=:464,scale=-2:176,crop=320:,expand=320:"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $ProgName -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $ProgName -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $ProgName -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $ProgName [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $ProgName -C 704:448:6:64 -B 0.5 *.vob"
}
while getopts "c:vVC:los:dB:a:" options; do
case $options in
s ) SCALEMETHOD=1
SCALEARG=$OPTARG
case $SCALEARG in
"cut16to9") SCALE="scale=-2:208,crop=320:,expand=320:";;
"cut16to9on4to3pal") SCALE="crop=:400,scale=-2:208,crop=320:,expand=320:";;
"cut1.66on4to3pal") SCALE="crop=:432,scale=-2:224,crop=320:,expand=320:";;
"cut2.21on16to9pal") SCALE="crop=:464,scale=-2:176,crop=320:,expand=320:";;
*) SCALE=$SCALEARG;;
esac
;;
C ) CROP1=$OPTARG
;;
B ) AUTOASPECTMODE=1
BARSIZE=$OPTARG
;;
l ) VBITRATE=250
ABITRATE=64
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:max_bframes=0:mi n_iquant=2:min_pquant=2:max_key_interval=100"
PASS=pass
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK -vf rectangle="$CROP1" "$1"
exit
fi
if [ $AUTOASPECTMODE -eq 1 ]; then
ID_VIDEO_HEIGHT=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
ID_VIDEO_ASPECT=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=5; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
if [ $(echo "scale=0; ($ADDSCALE+0.5)/1" | bc) -lt 1 ]; then
ADDSCALE=1
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}')
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}')
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
ASPECTRATIO=$(echo "scale=5; $XCROP*$ADDSCALE/$YCROP" | bc)
BARSIZE=$(echo "if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc)
if [ $FULLBAR -eq 1 ]; then
YSIZE=`echo "scale=3; a=320/$ASPECTRATIO+1; scale=0; (a/1)" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=3; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
if [ $DEBUG -eq 1 ]; then
echo " "
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Add. Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
fi
fi
if [ $SCALEMETHOD -eq 0 ]; then
SCALE=crop="$CROP1",scale=-2:"$YSIZE",crop=320:240,expand=320:
fi
if [ $DEBUG -eq 1 ]; then
echo " "
echo "VBitrate: "$VBITRATE""
echo "ABitrate: "$ABITRATE""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
echo "Number threads: "$NUMBERTHREADS""
echo " "
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK -vf crop="$CROP1",scale=-2:"$YSIZE",expand=:240,rectangle=320:240 "$1"
exit
fi
echo " "
echo "Video filter options: $SCALE"
echo " "
sleep 3
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo "File: "$1""
echo " "
DIGICAM_AVI_AUDIOFILTER_OPTS=""
nameori=$(basename "$1")
namenew="D2 - ${nameori%.*}.avi"
#Example how to enhance noisy audio of digi cam videos
#identify canon powershot 710 avi
#if [ `/usr/bin/exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# DIGICAM_AVI_AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=${ABITRATE} -af-adv force=1 -srate 44100 -af dummy$DIGICAM_AVI_AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `mplayer -frames 0 -really-quiet -identify "$1" 2>"$DEVNULL"| grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `mplayer -frames 0 -really-quiet -identify "$1" 2>"$DEVNULL"| grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $AUDIOTRACK $AUDIO_OPTS -sws 9 -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=1:turbo -audio-preload 0 -o "$DEVNULL"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
nice -19 mencoder "$1" $AUDIOTRACK $AUDIO_OPTS -sws 9 -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=2 -audio-preload 0 -o "$namenew"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
else
nice -19 mencoder "$1" $AUDIOTRACK $AUDIO_OPTS -sws 9 -vf $SCALE -vf-add harddup $VIDEO_OPTS -audio-preload 0 -o "$namenew"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
fi
else
echo "File not found: "$1""
fi
shift
done
---------------- crop here -------------------
linuxnutzer
08-22-2008, 07:01
Here the script as attachment (with formatting)
excellent, thanks very much.
stormzel
08-30-2008, 22:44
thanks
linuxnutzer
09-02-2008, 03:56
I have made some tests on a windows machine and modified the scipt to work under windows. All you need is cygwin (www.cygwin.com). Install the following tools bash, gawk (awk), grep, bc and mplayer/mencoder.
I have not found a recent cygwin port of mplayer/mencoder. Therefore the pseudo device /dev/zero can not be used with native windows ports of mencoder.exe (e.g. http://tirnanog.fate.jp/mirror/mplayer/) and the adding of a silent audio track if there is no audio in the source file is not possible.
video_to_D2
---------------- crop here -------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool]
VBITRATE=500
ABITRATE=128
TWOPASS=1
ProgName=${0##*/}
NUMBERTHREADS=`cat /proc/cpuinfo | grep -c "^processor"`
SCALE="scale=320:-2,crop=:240"
CROP1=0:0
YSIZE=240
AUTOASPECTMODE=0
BARSIZE="0.5"
SCALEMETHOD=0
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
usage()
{
echo "Usage: $ProgName"
echo " [-s <mencoder video filter options (crop/scale)> |"
echo " <predefined scale/crop options>]"
echo " [-C <first crop parameter> [-B rel. bar size]"
echo " [-l] [-o]"
echo " [-c <start time>]"
echo " [-v [-C <first crop parameter>]]"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: 500 kBit/s"
echo " audio bitrate: 128 kBit/s"
echo " two pass encoding"
echo " scale=320:-2,crop=:240 -> full width - black bars or cropped in height"
echo " "
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: 250 kBit/s"
echo " -> audio bitrate: 64 kBit/s"
echo "-o: one pass encoding"
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: determine the aspect ratio of video after first crop automatically"
echo "-s: scale/crop"
echo " "
echo "Predefined scale/crop options:"
echo " cut16to9 -> scale=-2:208,crop=320:"
echo " cut16to9on4to3 -> crop=:400,scale=-2:208,crop=320:,expand=320:"
echo " cut1.66on4to3pal -> crop=:432,scale=-2:224,crop=320:,expand=320:"
echo " cut2.21on16to9pal -> crop=:464,scale=-2:176,crop=320:,expand=320:"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $ProgName -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $ProgName -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $ProgName -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $ProgName [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $ProgName -C 704:448:6:64 -B 0.5 *.vob"
}
while getopts "c:vVC:los:dB:a:" options; do
case $options in
s ) SCALEMETHOD=1
SCALEARG=$OPTARG
case $SCALEARG in
"cut16to9") SCALE="scale=-2:208,crop=320:,expand=320:";;
"cut16to9on4to3pal") SCALE="crop=:400,scale=-2:208,crop=320:,expand=320:";;
"cut1.66on4to3pal") SCALE="crop=:432,scale=-2:224,crop=320:,expand=320:";;
"cut2.21on16to9pal") SCALE="crop=:464,scale=-2:176,crop=320:,expand=320:";;
*) SCALE=$SCALEARG;;
esac
;;
C ) CROP1=$OPTARG
;;
B ) AUTOASPECTMODE=1
BARSIZE=$OPTARG
;;
l ) VBITRATE=250
ABITRATE=64
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:max_bframes=0:mi n_iquant=2:min_pquant=2:max_key_interval=100"
PASS=pass
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK -vf rectangle="$CROP1" "$1"
exit
fi
if [ $AUTOASPECTMODE -eq 1 ]; then
ID_VIDEO_HEIGHT=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
ID_VIDEO_ASPECT=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=5; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
if [ $(echo "scale=0; ($ADDSCALE+0.5)/1" | bc) -lt 1 ]; then
ADDSCALE=1
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}')
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}')
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
ASPECTRATIO=$(echo "scale=5; $XCROP*$ADDSCALE/$YCROP" | bc)
BARSIZE=$(echo "if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc)
if [ $FULLBAR -eq 1 ]; then
YSIZE=`echo "scale=3; a=320/$ASPECTRATIO+1; scale=0; (a/1)" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=3; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
if [ $DEBUG -eq 1 ]; then
echo " "
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Add. Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
fi
fi
if [ $SCALEMETHOD -eq 0 ]; then
SCALE=crop="$CROP1",scale=-2:"$YSIZE",crop=320:240,expand=320:
fi
if [ $DEBUG -eq 1 ]; then
echo " "
echo "VBitrate: "$VBITRATE""
echo "ABitrate: "$ABITRATE""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
echo "Number threads: "$NUMBERTHREADS""
echo " "
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK -vf crop="$CROP1",scale=-2:"$YSIZE",expand=:240,rectangle=320:240 "$1"
exit
fi
echo " "
echo "Video filter options: $SCALE"
echo " "
sleep 3
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo "File: "$1""
echo " "
DIGICAM_AVI_AUDIOFILTER_OPTS=""
nameori=$(basename "$1")
namenew="D2 - ${nameori%.*}.avi"
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `/usr/bin/exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# DIGICAM_AVI_AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=${ABITRATE} -af-adv force=1 -srate 44100 -af dummy$DIGICAM_AVI_AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `mplayer -frames 0 -really-quiet -identify "$1" 2>"$DEVNULL"| grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `mplayer -frames 0 -really-quiet -identify "$1" 2>"$DEVNULL"| grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $AUDIOTRACK $AUDIO_OPTS -sws 9 -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=1:turbo -audio-preload 0 -o "$DEVNULL"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
nice -19 mencoder "$1" $AUDIOTRACK $AUDIO_OPTS -sws 9 -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=2 -audio-preload 0 -o "$namenew"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
else
nice -19 mencoder "$1" $AUDIOTRACK $AUDIO_OPTS -sws 9 -vf $SCALE -vf-add harddup $VIDEO_OPTS -audio-preload 0 -o "$namenew"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
fi
else
echo "File not found: "$1""
fi
shift
done
---------------- crop here -------------------
Have fun.
Linuxnutzer
How did you find out what settings etc to use for the D2?
Is there a document somewhere, or was it just trial and error?
-tim
linuxnutzer
09-03-2008, 11:22
How did you find out what settings etc to use for the D2?
Is there a document somewhere, or was it just trial and error?
-tim
I don't know a document about D2 settings. I read this forum and borrowed :) some ideas from other converter tools. I have been using mencoder for video converting for a long time. There are some documents regarding xvid:
http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html#CODEC SPECIFIC ENCODING OPTIONS (MENCODER ONLY)
http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-xvid.html
The rest is trial and compare.
Linuxnutzer
linuxnutzer
09-03-2008, 11:37
I found out that the script code posted here contains unwanted spaces in the VIDEO_OPTS command string (q uant_type and mi n_iquant). I tried to remove them in edit mode, but without success. Any hints?
The attached files are ok.
Linuxnutzer
linuxnutzer
09-06-2008, 17:03
Hi, I had some time to test the scipt a lot more and I decided to rework it. So I removed the -s option, which can confuse the user. Furthermore, the script now hopefully works fine for videos in portrait mode (aspect ratio < 1.333).
Have fun
linuxnutzer
video_to_D2
---------------- crop here -------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool]
# user options
VBITRATE=500
ABITRATE=128
VBITRATE_LOW=250
ABITRATE_LOW=64
TWOPASS=1
BARSIZE=1
# do not modify below
PROGNAME=${0##*/}
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
COMMON_MENC_OPTS="-noodml -sws 9 -audio-preload 0"
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s"
echo " audio bitrate: $ABITRATE kBit/s"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s"
echo " -> audio bitrate: $ABITRATE_LOW kBit/s"
echo "-o: one pass encoding"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
while getopts "c:vVC:lodB:a:" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
ABITRATE=$ABITRATE_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=2:min_pquant=2:max_key_interva l=100"
PASS=pass
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
ID_VIDEO_HEIGHT=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Error during auto aspect ratio calculation. Maybe not a valid video file?"
exit 1
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT "$1"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.2) 0.2 else if ($ADDSCALE>5) 5 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:
if [ $DEBUG -eq 1 ]; then
echo " "
echo "VBitrate: "$VBITRATE""
echo "ABitrate: "$ABITRATE""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
echo " "
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240 "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo "File: "$1""
echo " "
AUDIOFILTER_OPTS=""
NAMEORI=$(basename "$1")
NAMENEW="D2 - ${NAMEORI%.*}.avi"
PASSLOGFILE=$NAMENEW.log
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=${ABITRATE}:mode=0 -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `mplayer -frames 0 -really-quiet -identify "$1" 2>"$DEVNULL"| grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `mplayer -frames 0 -really-quiet -identify "$1" 2>"$DEVNULL"| grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $COMMON_MENC_OPTS $AUDIOTRACK $AUDIO_OPTS -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=1:turbo -passlogfile "$PASSLOGFILE" -o "$DEVNULL"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE"
exit 1
fi
nice -19 mencoder "$1" $COMMON_MENC_OPTS $AUDIOTRACK $AUDIO_OPTS -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=2 -passlogfile "$PASSLOGFILE" -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE"
exit 1
fi
rm -f "$PASSLOGFILE"
else
nice -19 mencoder "$1" $COMMON_MENC_OPTS $AUDIOTRACK $AUDIO_OPTS -vf $SCALE -vf-add harddup $VIDEO_OPTS -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
fi
else
echo "File not found: "$1""
fi
shift
done
---------------- crop here -------------------
linuxnutzer
09-10-2008, 05:35
Here the latest version of my script. I tried to solve some issues of mencoder/mplayer, which may be interesting for other converter software developer.
1) Sometimes mplayer had problems to seek to a certain time position (option -ss). I use this for the crop detection to skip intros etc. I found out that the usage of a different demuxer can solve this (-demuxer lavf). Therefore, I add the option -x to the script. I mplayer has problems playing/seeking a video, you can try to use this option. Maybe some videos, that have bad A/V sync now plays fine.
2) Some user of this forum reported A/V sync problems introduced by mencoder. As a workaround they use ffmpeg for the final muxing. I can not reproduce this with the D2, but mplayer has problems to play avi's that mencoder created with the copy audio option. Therefore I switched the muxer to the avi muxer of the lavc library, which is the same that uses ffmpeg (-of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames). For me it make no diffence with the D2 but maybe someone with problematic videos can try it and give me some feedback.
Have fun
linuxnutzer
video_to_D2
---------------- crop here -------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool]
# user options
VBITRATE=500
ABITRATE=128
VBITRATE_LOW=250
ABITRATE_LOW=64
TWOPASS=1
BARSIZE=1
# do not modify below
PROGNAME=${0##*/}
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
COMMON_MENC_OPTS="-noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames"
DEMUXER=""
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " [-x]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s"
echo " audio bitrate: $ABITRATE kBit/s"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s"
echo " -> audio bitrate: $ABITRATE_LOW kBit/s"
echo "-o: one pass encoding"
echo "-x: use lavf demuxer (experimental)"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
while getopts "c:vVC:lodB:a:x" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
ABITRATE=$ABITRATE_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
;;
x ) DEMUXER="-demuxer lavf"
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=2:min_pquant=2:max_key_interva l=100"
PASS=pass
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $DEMUXER $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
ID_VIDEO_HEIGHT=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Error during auto aspect ratio calculation. Maybe not a valid video file?"
exit 1
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT "$1"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL| tac | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.2) 0.2 else if ($ADDSCALE>5) 5 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:
if [ $DEBUG -eq 1 ]; then
echo " "
echo "VBitrate: "$VBITRATE""
echo "ABitrate: "$ABITRATE""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
echo " "
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240 "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo "File: "$1""
echo " "
AUDIOFILTER_OPTS=""
NAMEORI=$(basename "$1")
NAMENEW="D2 - ${NAMEORI%.*}.avi"
PASSLOGFILE=$NAMENEW.log
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=${ABITRATE}:mode=0 -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `mplayer -frames 0 -really-quiet -identify "$1" 2>"$DEVNULL"| grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `mplayer -frames 0 -really-quiet -identify "$1" 2>"$DEVNULL"| grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=1:turbo -passlogfile "$PASSLOGFILE" -o "$DEVNULL"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE"
exit 1
fi
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=2 -passlogfile "$PASSLOGFILE" -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE"
exit 1
fi
rm -f "$PASSLOGFILE"
else
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS -vf $SCALE -vf-add harddup $VIDEO_OPTS -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
fi
else
echo "File not found: "$1""
fi
shift
done
---------------- crop here -------------------
linuxnutzer
09-12-2008, 14:49
More tests - more issues :). Time to read more about other converter in this forum, especially iLOVE, which comes with some nice solutions.
1) Lame is not good for constant bit rate audio encoding. I use 3.96, where 128kBit/s CBR is ok, but 3.97 makes it worse (see http://www.hydrogenaudio.org/forums/index.php?showtopic=65367). I switched to variable bit rate modus like iLOVE does.
2) I got a wmv-video that have probably a variable frame rate. Older versions of mencoder reports 25fps but recent mencoder reports 1000fps. I adopted the hack from iLOVE to set 25fps manually with the -ofps option.
Have fun
video_to_D2
---------------- crop here ------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool]
# user options
VBITRATE=500
AUDIOQUALITY=6
VBITRATE_LOW=250
AUDIOQUALITY_LOW=9
TWOPASS=1
BARSIZE=1
# do not modify below
PROGNAME=${0##*/}
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
COMMON_MENC_OPTS="-noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames"
DEMUXER=""
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " [-x]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s"
echo " audio quality: $AUDIOQUALITY [0..9]"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s"
echo " -> audio quality: $AUDIOQUALITY_LOW"
echo "-o: one pass encoding"
echo "-x: use lavf demuxer (experimental)"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
while getopts "c:vVC:lodB:a:x" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
AUDIOQUALITY=$AUDIOQUALITY_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
;;
x ) DEMUXER="-demuxer lavf"
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=2:min_pquant=2:max_key_interva l=100"
PASS=pass
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $DEMUXER $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
BASENAME=$(basename "$1")
INFOFILE="D2 - ${BASENAME%.*}.info"
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
ID_VIDEO_HEIGHT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Error during auto aspect ratio calculation. Maybe not a valid video file?"
rm -f "$INFOFILE"
exit 1
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT "$1"
rm -f "$INFOFILE"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "if ($ADDSCALE<=0) 1 else $ADDSCALE" | bc 2> $DEVNULL)
# Limit Add Scale
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.1) 0.1 else if ($ADDSCALE>10) 10 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
rm -f "$INFOFILE"
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:
if [ $DEBUG -eq 1 ]; then
echo " "
echo "Video bitrate: "$VBITRATE""
echo "Audio quality: "$AUDIOQUALITY""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
echo " "
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240 "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo "File: "$1""
echo " "
AUDIOFILTER_OPTS=""
FPS=""
BASENAME=$(basename "$1")
NAMENEW="D2 - ${BASENAME%.*}.avi"
PASSLOGFILE=$NAMENEW.log
INFOFILE=$NAMENEW.info
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts vbr=2:mode=0:q=$AUDIOQUALITY -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
rm -f "$INFOFILE"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
ID_VIDEO_FPS=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_FPS | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_FPS ]; then
ID_VIDEO_FPS=25
echo "Souce framerate was NOT FOUND! - video and audio will be asynchronized!"
fi
SET_FPS=$(echo "if ($ID_VIDEO_FPS>=100 || $ID_VIDEO_FPS==0) 1 else 0" | bc 2> $DEVNULL)
if [ $SET_FPS -eq 1 ]; then
FPS="-ofps 25"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=1:turbo -passlogfile "$PASSLOGFILE" -o "$DEVNULL"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS -vf $SCALE -vf-add harddup $VIDEO_OPTS:$PASS=2 -passlogfile "$PASSLOGFILE" -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
rm -f "$PASSLOGFILE" "$INFOFILE"
else
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS -vf $SCALE -vf-add harddup $VIDEO_OPTS -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
exit 1
fi
fi
rm -f "$INFOFILE"
else
echo "File not found: "$1""
fi
shift
done
---------------- crop here ------------------
linuxnutzer
09-22-2008, 16:09
After deep testing audio encoding I did much tests regarding video quality and speed. I replaced the constant bit rate one pass encoding by one pass constant quality encoding which makes more sense. The settings are from iLOVE. This one pass encoding is fast and gives very good quality, but depending on the source video, you may got large files. The advantage of the default two pass encoding is the efficiency. For a given bit rate you got the best possible quality. Especially for low rate is is a better choice than constant quality encoding with large quality factor, see http://www.mplayerhq.hu/DOCS/HTML-single/en/MPlayer.html#menc-feat-dvd-mpeg4-2pass.
Some fixes: The last change of the avi muxer can break the encoding. I found out that until july 2007 the option "i_certify_that_my_video_stream_does_not_use_b_fram es" is required. If you have a newer version of mencoder then remove that option from COMMON_MENC_OPTS.
Have fun
video_to_D2
---------------- crop here ------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool]
# user options
VBITRATE=500
AUDIOQUALITY=7
VBITRATE_LOW=250
AUDIOQUALITY_LOW=9
VQSCALE=4
VQSCALE_LOW=7
TWOPASS=1
BARSIZE=1
# do not modify below
PROGNAME=${0##*/}
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
UNSHARP=""
DEMUXER=""
PSNR=""
#mencoder before version RC2
COMMON_MENC_OPTS="-noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames -ffourcc XVID"
#mencoder RC2
#COMMON_MENC_OPTS="-noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi -ffourcc XVID"
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o] [-u]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " [-x]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s (two pass)"
echo " video quality: $VQSCALE (one pass)"
echo " audio quality: $AUDIOQUALITY [0..9]"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s (two pass)"
echo " -> video quality: $VQSCALE_LOW (one pass)"
echo " -> audio quality: $AUDIOQUALITY_LOW"
echo "-u: unsharp mask"
echo "-o: one pass encoding with constant quality"
echo "-x: use lavf demuxer (experimental)"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
while getopts "c:vVC:lodB:a:xu" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
AUDIOQUALITY=$AUDIOQUALITY_LOW
VQSCALE=$VQSCALE_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
PSNR=":psnr"
;;
u ) UNSHARP=",unsharp=l5x5:0.2"
;;
x ) DEMUXER="-demuxer lavf"
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
if [ ! -f "$1" -o ! -r "$1" ]; then
echo "File not exist or not readable: "$1""
exit 1
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=4:min_pquant=4:max_key_interva l=100$PSNR"
PASS=pass
VIDEO_OPTS_ONE_PASS="-ovc lavc -lavcopts vqscale=$VQSCALE:vrc_maxrate=5000:vrc_buf_size=125 0:vqmin=1:threads=$NUMBERTHREADS:vcodec=mpeg4:vmax _b_frames=0:mbd=2:v4mv:trell:cmp=3:subcmp=3:vlelim =-4:vcelim=7:vqcomp=1.0:mpeg_quant:keyint=100$PSNR"
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
BASENAME=$(basename "$1")
INFOFILE="D2 - ${BASENAME%.*}.info"
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
ID_VIDEO_HEIGHT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Can not get video data. Maybe not a valid video file?"
rm -f "$INFOFILE"
exit 1
fi
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $DEMUXER $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT "$1"
rm -f "$INFOFILE"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "if ($ADDSCALE<=0) 1 else $ADDSCALE" | bc 2> $DEVNULL)
# Limit Add Scale
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.1) 0.1 else if ($ADDSCALE>10) 10 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
rm -f "$INFOFILE"
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:$UNSHARP
if [ $DEBUG -eq 1 ]; then
echo " "
echo "Video bitrate: "$VBITRATE""
echo "Audio quality: "$AUDIOQUALITY""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
echo " "
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240$UNSHARP "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo "File: "$1""
echo " "
AUDIOFILTER_OPTS=""
FPS=""
BASENAME=$(basename "$1")
NAMENEW="D2 - ${BASENAME%.*}.avi"
PASSLOGFILE=$NAMENEW.log
INFOFILE=$NAMENEW.info
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts vbr=2:mode=0:q=$AUDIOQUALITY -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
rm -f "$INFOFILE"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
ID_VIDEO_FPS=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_FPS | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_FPS ]; then
ID_VIDEO_FPS=25
echo "Souce framerate was NOT FOUND! - video and audio will be asynchronized!"
fi
SET_FPS=$(echo "if ($ID_VIDEO_FPS>=100 || $ID_VIDEO_FPS==0) 1 else 0" | bc 2> $DEVNULL)
if [ $SET_FPS -eq 1 ]; then
FPS="-ofps 25"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=1:turbo -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$DEVNULL"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=2 -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
rm -f "$PASSLOGFILE" "$INFOFILE"
else
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS_ONE_PASS -vf-add $SCALE -vf-add harddup -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$INFOFILE"
exit 1
fi
fi
rm -f "$INFOFILE"
else
echo "File not exist or not readable: "$1""
fi
shift
done
---------------- crop here ------------------
linuxnutzer
09-26-2008, 04:51
Ok, new week -> new version. I made some enhancements on the debug output to display video quality that may be interesting for someone who is playing with the video bit rate for the two pass encoding mode. The two pass mode is the preferred mode for me. Due to the limited file size per hour it is possible to precalculate the needed space, make estimations wether the video fits on the SD card or not. The disadvantage of this mode is the unpredictable quality. 500kBit/s is enough for most videos, but there may be some videos that needs more. The new debug output gives now a hint about the quality. All you need is a small perl script that parses the psnr_xxxxxx.log file that are created with the debug option. I found the countquant.pl file in the mencoder tools directory, but this was not working anymore. Therefore I rewrote it to analyze psnr files. Move it as count_quant.pl to a valid bin directory and make it executable.
count_quant.pl
---------------- crop here ------------------
#!/usr/bin/perl -w
$quant_total = 0;
while (<STDIN>) {
if (/^[^,]+[,][ ]*([0-9]+)/) {
$quants{$1}++;
$quant_total += $1;
}
}
$frames = 0;
foreach $key (sort(keys(%quants))) {
$frames += $quants{$key};
}
if ($frames > 0) {
foreach $key (sort({ $a <=> $b } keys(%quants))) {
printf("video quality = %2d: num frames: %6d -> ratio: %6.2f%%\n", $key, $quants{$key}, $quants{$key} *
100 / $frames);
}
$average_quant = $quant_total/$frames;
printf("average video quality: %f\n", $average_quant);
if ($average_quant < 3) {
printf("video quality is excellent\n");
}
elsif ($average_quant < 5) {
printf("video quality is very good\n");
}
elsif ($average_quant < 6) {
printf("video quality is good\n");
}
elsif ($average_quant < 7) {
printf("video quality is ok\n");
}
elsif ($average_quant => 7) {
printf("video quality may be not so good\n");
}
}
---------------- crop here ------------------
The script shows the number of frames and the ratio encoded with a certain quality level (1..31) and the average.
2-3 -> excellent quality
4-5 -> very good
6 -> good
7-8 -> ok
9-11 -> not so good
11- -> bad
Have fun
linuxnutzer
video_to_D2
---------------- crop here ------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool]
# user options
VBITRATE=500
AUDIOQUALITY=7
VBITRATE_LOW=250
AUDIOQUALITY_LOW=9
VQSCALE=4
VQSCALE_LOW=7
TWOPASS=1
BARSIZE=1
# do not modify below
PROGNAME=${0##*/}
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
UNSHARP=""
DEMUXER=""
PSNR=""
#mencoder before version RC2
#COMMON_MENC_OPTS="-noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames -ffourcc XVID"
#mencoder RC2
COMMON_MENC_OPTS="-noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi -ffourcc XVID"
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o] [-u]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " [-x]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s (two pass)"
echo " video quality: $VQSCALE (one pass)"
echo " audio quality: $AUDIOQUALITY [0..9]"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s (two pass)"
echo " -> video quality: $VQSCALE_LOW (one pass)"
echo " -> audio quality: $AUDIOQUALITY_LOW"
echo "-u: unsharp mask"
echo "-o: one pass encoding with constant quality"
echo "-x: use lavf demuxer (experimental)"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
while getopts "c:vVC:lodB:a:xu" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
AUDIOQUALITY=$AUDIOQUALITY_LOW
VQSCALE=$VQSCALE_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
PSNR=":psnr"
;;
u ) UNSHARP=",unsharp=l5x5:0.2"
;;
x ) DEMUXER="-demuxer lavf"
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
if [ ! -f "$1" -o ! -r "$1" ]; then
echo "File not exist or not readable: "$1""
exit 1
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=4:min_pquant=4:max_key_interva l=100$PSNR"
PASS=pass
VIDEO_OPTS_ONE_PASS="-ovc lavc -lavcopts vqscale=$VQSCALE:vrc_maxrate=5000:vrc_buf_size=125 0:vqmin=1:threads=$NUMBERTHREADS:vcodec=mpeg4:vmax _b_frames=0:mbd=2:v4mv:trell:cmp=3:subcmp=3:vlelim =-4:vcelim=7:vqcomp=1.0:mpeg_quant:keyint=100$PSNR"
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
BASENAME=$(basename "$1")
INFOFILE="D2 - ${BASENAME%.*}.info"
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
ID_VIDEO_HEIGHT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Can not get video data. Maybe not a valid video file?"
rm -f "$INFOFILE"
exit 1
fi
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $DEMUXER $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT "$1"
rm -f "$INFOFILE"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "if ($ADDSCALE<=0) 1 else $ADDSCALE" | bc 2> $DEVNULL)
# Limit Add Scale
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.1) 0.1 else if ($ADDSCALE>10) 10 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
rm -f "$INFOFILE"
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:$UNSHARP
if [ $DEBUG -eq 1 ]; then
echo " "
if [ $TWOPASS -eq 1 ]; then
echo "Encoding type: Two pass"
echo "Video bitrate: "$VBITRATE""
else
echo "Encoding type: One pass"
echo "Video quality: "$VQSCALE""
fi
echo "Audio quality: "$AUDIOQUALITY""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
echo " "
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240$UNSHARP "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo "File: "$1""
echo " "
AUDIOFILTER_OPTS=""
FPS=""
BASENAME=$(basename "$1")
NAMENEW="D2 - ${BASENAME%.*}.avi"
PASSLOGFILE=$NAMENEW.log
INFOFILE=$NAMENEW.info
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts vbr=2:mode=0:q=$AUDIOQUALITY -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
rm -f "$INFOFILE"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
ID_VIDEO_FPS=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_FPS | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_FPS ]; then
ID_VIDEO_FPS=25
echo "Souce framerate was NOT FOUND! - video and audio will be asynchronized!"
fi
SET_FPS=$(echo "if ($ID_VIDEO_FPS>=100 || $ID_VIDEO_FPS==0) 1 else 0" | bc 2> $DEVNULL)
if [ $SET_FPS -eq 1 ]; then
FPS="-ofps 25"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=1:turbo -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$DEVNULL"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=2 -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
rm -f "$PASSLOGFILE" "$INFOFILE"
else
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS_ONE_PASS -vf-add $SCALE -vf-add harddup -o "$NAMENEW"
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$INFOFILE"
exit 1
fi
fi
if [ $DEBUG -eq 1 ]; then
# look for count_quant.pl
COUNTQUANT=$(which count_quant.pl 2> $DEVNULL)
if [ -n "$COUNTQUANT" ]; then
# look for latest PSNR file
PSNRFILE=$(ls -t1 psnr_* 2> $DEVNULL | head -1 2> $DEVNULL)
if [ -n "$PSNRFILE" ]; then
echo -e "\nQuality statistics from "$PSNRFILE":\n"
"$COUNTQUANT" < "$PSNRFILE"
echo " "
fi
fi
fi
rm -f "$INFOFILE"
else
echo "File not exist or not readable: "$1""
fi
shift
done
---------------- crop here ------------------
linuxnutzer
10-13-2008, 16:02
Ok, again some small fixes.
1) Make mencoder less "noisy" (set -msglevel...)
2) Decrease the min quantizer level to 2 again (two pass encodeing). Level 4 is good quality, but if the bitrate is sufficient, it is sometimes better to get the best possible quality.
Have fun.
count_quant.pl
---------------- crop here ------------------
#!/usr/bin/perl -w
$quant_total = 0;
while (<STDIN>) {
if (/^[^,]+[,][ ]*([0-9]+)/) {
$quants{$1}++;
$quant_total += $1;
}
}
$frames = 0;
foreach $key (sort(keys(%quants))) {
$frames += $quants{$key};
}
if ($frames > 0) {
foreach $key (sort({ $a <=> $b } keys(%quants))) {
printf("video quality = %2d: num frames: %6d -> ratio: %6.2f%%\n", $key, $quants{$key}, $quants{$key} *
100 / $frames);
}
$average_quant = $quant_total/$frames;
printf("average video quality: %f\n", $average_quant);
if ($average_quant < 3) {
printf("video quality is excellent\n");
}
elsif ($average_quant < 5) {
printf("video quality is very good\n");
}
elsif ($average_quant < 6) {
printf("video quality is good\n");
}
elsif ($average_quant < 7) {
printf("video quality is ok\n");
}
elsif ($average_quant >= 7) {
printf("video quality may be not so good\n");
}
}
---------------- crop here ------------------
video_to_D2
---------------- crop here ------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool], [perl]
# user options
VBITRATE=500
AUDIOQUALITY=7
VBITRATE_LOW=250
AUDIOQUALITY_LOW=9
VQSCALE=4
VQSCALE_LOW=7
TWOPASS=1
BARSIZE=1
# do not modify below
PROGNAME=${0##*/}
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
UNSHARP=""
DEMUXER=""
PSNR=""
#mencoder before version RC2
COMMON_MENC_OPTS="-msglevel all=-1:avsync=5:mencoder=4 -noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames -ffourcc XVID"
#mencoder RC2
#COMMON_MENC_OPTS="-msglevel all=-1:avsync=5:mencoder=4 -noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi -ffourcc XVID"
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o] [-u]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " [-x]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s (two pass)"
echo " video quality: $VQSCALE (one pass)"
echo " audio quality: $AUDIOQUALITY [0..9]"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s (two pass)"
echo " -> video quality: $VQSCALE_LOW (one pass)"
echo " -> audio quality: $AUDIOQUALITY_LOW"
echo "-u: unsharp mask"
echo "-o: one pass encoding with constant quality"
echo "-x: use lavf demuxer (experimental)"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
while getopts "c:vVC:lodB:a:xu" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
AUDIOQUALITY=$AUDIOQUALITY_LOW
VQSCALE=$VQSCALE_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
PSNR=":psnr"
;;
u ) UNSHARP=",unsharp=l5x5:0.2"
;;
x ) DEMUXER="-demuxer lavf"
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
if [ ! -f "$1" -o ! -r "$1" ]; then
echo "File not exist or not readable: "$1""
exit 1
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=2:min_pquant=2:max_key_interva l=100$PSNR"
PASS=pass
VIDEO_OPTS_ONE_PASS="-ovc lavc -lavcopts vqscale=$VQSCALE:vrc_maxrate=5000:vrc_buf_size=125 0:vqmin=1:threads=$NUMBERTHREADS:vcodec=mpeg4:vmax _b_frames=0:mbd=2:v4mv:trell:cmp=3:subcmp=3:vlelim =-4:vcelim=7:vqcomp=1.0:mpeg_quant:keyint=100$PSNR"
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
BASENAME=$(basename "$1")
INFOFILE="D2 - ${BASENAME%.*}.info"
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
ID_VIDEO_HEIGHT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Can not get video data. Maybe not a valid video file?"
rm -f "$INFOFILE"
exit 1
fi
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $DEMUXER $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT "$1"
rm -f "$INFOFILE"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "if ($ADDSCALE<=0) 1 else $ADDSCALE" | bc 2> $DEVNULL)
# Limit Add Scale
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.1) 0.1 else if ($ADDSCALE>10) 10 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
rm -f "$INFOFILE"
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:$UNSHARP
if [ $DEBUG -eq 1 ]; then
echo " "
if [ $TWOPASS -eq 1 ]; then
echo "Encoding type: Two pass"
echo "Video bitrate: "$VBITRATE""
else
echo "Encoding type: One pass"
echo "Video quality: "$VQSCALE""
fi
echo "Audio quality: "$AUDIOQUALITY""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
echo " "
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240$UNSHARP "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo "File: "$1""
echo " "
AUDIOFILTER_OPTS=""
FPS=""
BASENAME=$(basename "$1")
NAMENEW="D2 - ${BASENAME%.*}.avi"
PASSLOGFILE=$NAMENEW.log
INFOFILE=$NAMENEW.info
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts vbr=2:mode=0:q=$AUDIOQUALITY -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
rm -f "$INFOFILE"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
ID_VIDEO_FPS=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_FPS | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_FPS ]; then
ID_VIDEO_FPS=25
echo "Souce framerate was NOT FOUND! - video and audio will be asynchronized!"
fi
SET_FPS=$(echo "if ($ID_VIDEO_FPS>=100 || $ID_VIDEO_FPS==0) 1 else 0" | bc 2> $DEVNULL)
if [ $SET_FPS -eq 1 ]; then
FPS="-ofps 25"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=1:turbo -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$DEVNULL" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=2 -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$NAMENEW" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
rm -f "$PASSLOGFILE" "$INFOFILE"
else
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS_ONE_PASS -vf-add $SCALE -vf-add harddup -o "$NAMENEW" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$INFOFILE"
exit 1
fi
fi
if [ $DEBUG -eq 1 ]; then
# look for count_quant.pl
COUNTQUANT=$(which count_quant.pl 2> $DEVNULL)
if [ -n "$COUNTQUANT" ]; then
# look for latest PSNR file
PSNRFILE=$(ls -t1 psnr_* 2> $DEVNULL | head -1 2> $DEVNULL)
if [ -n "$PSNRFILE" ]; then
echo -e "\nQuality statistics from "$PSNRFILE":\n"
"$COUNTQUANT" < "$PSNRFILE"
echo " "
fi
fi
fi
rm -f "$INFOFILE"
else
echo "File not exist or not readable: "$1""
fi
shift
done
---------------- crop here ------------------
linuxnutzer
10-22-2008, 06:18
Hi,
last weekend I had to convert a bunch of cartoons in batch mode with low bit rate (two pass mode) and found out, that the video quality can vary a lot depending on video source. Therfore I found it useful to have a quality summary report at the end of the conversion to be able to reconvert bad videos with a higher bit rate (debug switch only).
I reworked the count_quant.pl to return the average quantizer level as exit code, that is stored in the main script.
Have fun.
Linuxnutzer
count_quant.pl
---------------- crop here ------------------
#!/usr/bin/perl -w
$quant_total = 0;
while (<STDIN>) {
if (/^[^,]+[,][ ]*([0-9]+)/) {
$quants{$1}++;
$quant_total += $1;
}
}
$frames = 0;
foreach $key (sort(keys(%quants))) {
$frames += $quants{$key};
}
if ($frames > 0) {
foreach $key (sort({ $a <=> $b } keys(%quants))) {
printf("video quality = %2d: num frames: %6d -> ratio: %6.2f%%\n", $key, $quants{$key}, $quants{$key} *
100 / $frames);
}
$average_quant = $quant_total/$frames;
printf("Average video quality: %f\n", $average_quant);
if ($average_quant < 3) {
printf("Video quality is excellent\n");
}
elsif ($average_quant < 5) {
printf("Video quality is very good\n");
}
elsif ($average_quant < 6) {
printf("Video quality is good\n");
}
elsif ($average_quant < 7) {
printf("Video quality is ok\n");
}
elsif ($average_quant >= 7) {
printf("Video quality may be not so good\n");
}
exit(int($average_quant + 0.5));
}
exit(255);
---------------- crop here ------------------
video_to_D2
---------------- crop here ------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool], [perl]
# user options
VBITRATE=500
AUDIOQUALITY=7
VBITRATE_LOW=250
AUDIOQUALITY_LOW=9
VQSCALE=4
VQSCALE_LOW=7
TWOPASS=1
BARSIZE=1
# do not modify below
PROGNAME=${0##*/}
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
UNSHARP=""
DEMUXER=""
PSNR=""
#mencoder before version RC2
COMMON_MENC_OPTS="-msglevel all=-1:avsync=5:mencoder=4 -noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames -ffourcc XVID"
#mencoder RC2
#COMMON_MENC_OPTS="-msglevel all=-1:avsync=5:mencoder=4 -noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi -ffourcc XVID"
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o] [-u]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " [-x]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s (two pass)"
echo " video quality: $VQSCALE (one pass)"
echo " audio quality: $AUDIOQUALITY [0..9]"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s (two pass)"
echo " -> video quality: $VQSCALE_LOW (one pass)"
echo " -> audio quality: $AUDIOQUALITY_LOW"
echo "-u: unsharp mask"
echo "-o: one pass encoding with constant quality"
echo "-x: use lavf demuxer (experimental)"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
quality_summary()
{
if [ $DEBUG -eq 1 ]; then
if [ -n $FILE_LIST ]; then
NUM_ENTRIES=${#FILE_LIST[@]}
if [ $NUM_ENTRIES -gt 0 ]; then
echo -e "\n\nVideo quality summary statistics:\n"
IDX=0
while [ $IDX -lt $NUM_ENTRIES ]
do
QUALITY="(ok)"
if [ ${AVGQUANT_LIST[$IDX]} -gt 6 ]; then
QUALITY="(bad - please check!)"
fi
echo -e "File: ${FILE_LIST[$IDX]}\t\tQuality: ${AVGQUANT_LIST[$IDX]}\t$QUALITY"
IDX+=1
done
echo " "
fi
fi
fi
}
while getopts "c:vVC:lodB:a:xu" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
AUDIOQUALITY=$AUDIOQUALITY_LOW
VQSCALE=$VQSCALE_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
PSNR=":psnr"
;;
u ) UNSHARP=",unsharp=l5x5:0.2"
;;
x ) DEMUXER="-demuxer lavf"
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
if [ ! -f "$1" -o ! -r "$1" ]; then
echo "File not exist or not readable: "$1""
exit 1
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=2:min_pquant=2:max_key_interva l=100$PSNR"
PASS=pass
VIDEO_OPTS_ONE_PASS="-ovc lavc -lavcopts vqscale=$VQSCALE:vrc_maxrate=5000:vrc_buf_size=125 0:vqmin=1:threads=$NUMBERTHREADS:vcodec=mpeg4:vmax _b_frames=0:mbd=2:v4mv:trell:cmp=3:subcmp=3:vlelim =-4:vcelim=7:vqcomp=1.0:mpeg_quant:keyint=100$PSNR"
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
BASENAME=$(basename "$1")
INFOFILE="D2 - ${BASENAME%.*}.info"
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
ID_VIDEO_HEIGHT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Can not get video data. Maybe not a valid video file?"
rm -f "$INFOFILE"
exit 1
fi
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $DEMUXER $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
exit
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT "$1"
rm -f "$INFOFILE"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "if ($ADDSCALE<=0) 1 else $ADDSCALE" | bc 2> $DEVNULL)
# Limit Add Scale
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.1) 0.1 else if ($ADDSCALE>10) 10 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
rm -f "$INFOFILE"
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:$UNSHARP
if [ $DEBUG -eq 1 ]; then
echo " "
if [ $TWOPASS -eq 1 ]; then
echo "Encoding type: Two pass"
echo "Video bitrate: "$VBITRATE""
else
echo "Encoding type: One pass"
echo "Video quality: "$VQSCALE""
fi
echo "Audio quality: "$AUDIOQUALITY""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Scale: "$SCALE""
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240$UNSHARP "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo -e "\n\nFile: "$1"\n"
AUDIOFILTER_OPTS=""
FPS=""
BASENAME=$(basename "$1")
NAMENEW="D2 - ${BASENAME%.*}.avi"
PASSLOGFILE=$NAMENEW.log
INFOFILE=$NAMENEW.info
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts vbr=2:mode=0:q=$AUDIOQUALITY -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
rm -f "$INFOFILE"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
ID_VIDEO_FPS=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_FPS | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_FPS ]; then
ID_VIDEO_FPS=25
echo "Souce framerate was NOT FOUND! - video and audio will be asynchronized!"
fi
SET_FPS=$(echo "if ($ID_VIDEO_FPS>=100 || $ID_VIDEO_FPS==0) 1 else 0" | bc 2> $DEVNULL)
if [ $SET_FPS -eq 1 ]; then
FPS="-ofps 25"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=1:turbo -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$DEVNULL" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo -e "Abort!\n"
quality_summary
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=2 -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$NAMENEW" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo -e "Abort!\n"
quality_summary
rm -f "$PASSLOGFILE" "$INFOFILE"
exit 1
fi
rm -f "$PASSLOGFILE" "$INFOFILE"
else
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS_ONE_PASS -vf-add $SCALE -vf-add harddup -o "$NAMENEW" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$INFOFILE"
exit 1
fi
fi
if [ $DEBUG -eq 1 ]; then
# look for count_quant.pl
COUNTQUANT=$(which count_quant.pl 2> $DEVNULL)
if [ -n "$COUNTQUANT" ]; then
# look for latest PSNR file
PSNRFILE=$(ls -t1 psnr_* 2> $DEVNULL | head -1 2> $DEVNULL)
if [ -n "$PSNRFILE" ]; then
echo -e "\nQuality statistics from "$PSNRFILE":\n"
"$COUNTQUANT" < "$PSNRFILE"
AVGQUANT=$?
echo " "
if [ $AVGQUANT -lt 255 ]; then
IDX=${#FILE_LIST[@]}
FILE_LIST[$IDX]="$1"
AVGQUANT_LIST[$IDX]=$AVGQUANT
fi
fi
fi
fi
rm -f "$INFOFILE"
else
echo "File not exist or not readable: "$1""
fi
shift
done
quality_summary
---------------- crop here ------------------
This is a really handy script. I'm thinking of making a gui for it, mostly for the purpose of learning the pyqt framework. any thoughts?
thanks again.
-tim
linuxnutzer
10-24-2008, 02:59
Ok, very good. It means that I have to freeze the "API" :). If there is something missing, please tell me.
A nice feature could be, that it grabs the parameter for the first crop from the mplayer output and shows it in an editable field.
Have fun.
Linuxnutzer
shaggy3zx
11-18-2008, 00:54
Hi, Thanks for making this cool script!
I just wanted to let you know that it did not work for me with Mencoder 2:1.0~rc2-0ubuntu13+medibuntu1; I receive the following message:
Exiting... (error parsing command line)
However its working fine on my rhel5 box with mencoder 1.x :D
linuxnutzer
11-18-2008, 14:57
Hi, Thanks for making this cool script!
I just wanted to let you know that it did not work for me with Mencoder 2:1.0~rc2-0ubuntu13+medibuntu1; I receive the following message:
Exiting... (error parsing command line)
However its working fine on my rhel5 box with mencoder 1.x :D
Maybe it is the mencoder incompatibility that I mentioned in a previous post:
"Some fixes: The last change of the avi muxer can break the encoding. I found out that until july 2007 the option "i_certify_that_my_video_stream_does_not_use_b_fram es" is required. If you have a newer version of mencoder then remove that option from COMMON_MENC_OPTS."
Linuxnutzer
Headholio
12-22-2008, 14:30
I have a habit of saving flash videos into an mp4 format using a website called KeepVid (http://keepvid.com/). Anyways, I want to convert the videos (using Kubuntu) so I can play them on my D2. When I try to convert with your script, I immediately get the error "Can not get video data. Maybe not a valid video file?"
Any ideas?
linuxnutzer
01-03-2009, 13:09
I have a habit of saving flash videos into an mp4 format using a website called KeepVid (http://keepvid.com/). Anyways, I want to convert the videos (using Kubuntu) so I can play them on my D2. When I try to convert with your script, I immediately get the error "Can not get video data. Maybe not a valid video file?"
Any ideas?
Do you have mplayer/mencoder installed? The error message indicates, that mplayer could not detect the video dimensions. If you have mplayer then please post the output of:
mplayer -frames 1 -vo null -ao null -really-quiet -identify VIDEO
(VIDEO is one of your videofiles)
Linuxnutzer
linuxnutzer
04-29-2009, 05:20
Again some small fixes and some new features.
1) Fix Debug output statistics
2) Remove all temporary files
3) The -u (unsharp) option got an argument to adjust the sharpness
4) New -g option to adjust the gamma value of the video if it is to too bright or dark.
Have fun.
count_quant.pl
---------------- crop here ------------------
#!/usr/bin/perl -w
$quant_total = 0;
while (<STDIN>) {
if (/^[^,]+[,][ ]*([0-9]+)/) {
$quants{$1}++;
$quant_total += $1;
}
}
$frames = 0;
foreach $key (sort(keys(%quants))) {
$frames += $quants{$key};
}
if ($frames > 0) {
foreach $key (sort({ $a <=> $b } keys(%quants))) {
printf("video quality = %2d: num frames: %6d -> ratio: %6.2f%%\n", $key, $quants{$key}, $quants{$key} *
100 / $frames);
}
$average_quant = $quant_total/$frames;
printf("Average video quality: %f\n", $average_quant);
if ($average_quant < 3) {
printf("Video quality is excellent\n");
}
elsif ($average_quant < 5) {
printf("Video quality is very good\n");
}
elsif ($average_quant < 6) {
printf("Video quality is good\n");
}
elsif ($average_quant < 7) {
printf("Video quality is ok\n");
}
elsif ($average_quant >= 7) {
printf("Video quality may be not so good\n");
}
exit(int($average_quant + 0.5));
}
exit(255);
---------------- crop here ------------------
video_to_D2
---------------- crop here ------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool], [perl]
# user options
VBITRATE=500
AUDIOQUALITY=7
VBITRATE_LOW=250
AUDIOQUALITY_LOW=9
VQSCALE=4
VQSCALE_LOW=7
TWOPASS=1
BARSIZE=1
# do not modify below
PROGNAME=${0##*/}
CYGWIN=0
DEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
DEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
UNSHARP=""
UNSHARPOPT="0"
GAMMA=""
GAMMAOPT="1"
DEMUXER=""
PSNR=""
#mencoder before version RC2
COMMON_MENC_OPTS="-msglevel all=-1:avsync=5:mencoder=4 -noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames -ffourcc XVID"
#mencoder RC2
#COMMON_MENC_OPTS="-msglevel all=-1:avsync=5:mencoder=5:statusline=5 -noodml -sws 9 -audio-preload 0 -of lavf -lavfopts format=avi -ffourcc XVID"
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o]"
echo " [-u <unsharp value>]"
echo " [-g <gamma value>]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " [-x]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s (two pass)"
echo " video quality: $VQSCALE (one pass)"
echo " audio quality: $AUDIOQUALITY [0..9]"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s (two pass)"
echo " -> video quality: $VQSCALE_LOW (one pass)"
echo " -> audio quality: $AUDIOQUALITY_LOW"
echo "-u: unsharp mask [-1.5 .. 1.5] (>0: soften; <0: sharpen)"
echo "-g: gamma value [0.1 .. 10.0]"
echo "-o: one pass encoding with constant quality"
echo "-x: use lavf demuxer (experimental)"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
quality_summary()
{
if [ $DEBUG -eq 1 ]; then
NUM_ENTRIES=${#FILE_LIST[@]}
if [ $NUM_ENTRIES -gt 0 ]; then
echo -e "\n\nVideo quality summary statistics:\n"
IDX=0
while [ $IDX -lt $NUM_ENTRIES ]
do
QUALITY="(ok)"
if [ ${AVGQUANT_LIST[$IDX]} -gt 6 ]; then
QUALITY="(bad - please check!)"
fi
echo -e "File: ${FILE_LIST[$IDX]}\t\tQuality: ${AVGQUANT_LIST[$IDX]}\t$QUALITY"
IDX=$[IDX+1]
done
echo " "
fi
fi
}
while getopts "c:vVC:lodB:a:xu:g:" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
AUDIOQUALITY=$AUDIOQUALITY_LOW
VQSCALE=$VQSCALE_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
PSNR=":psnr"
;;
u ) UNSHARP=",unsharp=l5x5:"
UNSHARPOPT=$OPTARG
;;
g ) GAMMA=",eq2="
GAMMAOPT=$OPTARG
;;
x ) DEMUXER="-demuxer lavf"
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
if [ ! -f "$1" -o ! -r "$1" ]; then
echo "File not exist or not readable: "$1""
exit 1
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=2:min_pquant=2:max_key_interva l=100$PSNR"
PASS=pass
VIDEO_OPTS_ONE_PASS="-ovc lavc -lavcopts vqscale=$VQSCALE:vrc_maxrate=5000:vrc_buf_size=125 0:vqmin=1:threads=$NUMBERTHREADS:vcodec=mpeg4:vmax _b_frames=0:mbd=2:v4mv:trell:cmp=3:subcmp=3:vlelim =-4:vcelim=7:vqcomp=1.0:mpeg_quant:keyint=100$PSNR"
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
if [ -n "$UNSHARP" ]; then
UNSHARPOPT=$(echo $UNSHARPOPT | bc 2> $DEVNULL)
if [ -z $UNSHARPOPT ]; then
UNSHARPOPT=0
fi
UNSHARPOPT=$(echo "scale=10; if ($UNSHARPOPT < -5) -5 else if ($UNSHARPOPT > 5) 5 else $UNSHARPOPT" | bc 2> $DEVNULL)
UNSHARP="$UNSHARP$UNSHARPOPT"
fi
if [ -n "$GAMMA" ]; then
GAMMAOPT=$(echo $GAMMAOPT | bc 2> $DEVNULL)
if [ -z $GAMMAOPT ]; then
GAMMAOPT=0
fi
GAMMAOPT=$(echo "scale=10; if ($GAMMAOPT < -0.1) 0.1 else if ($GAMMAOPT > 10) 10 else $GAMMAOPT" | bc 2> $DEVNULL)
GAMMA="$GAMMA$GAMMAOPT"
fi
BASENAME=$(basename "$1")
INFOFILE="D2 - ${BASENAME%.*}.info"
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
ID_VIDEO_HEIGHT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Can not get video data. Maybe not a valid video file?"
rm -f "$INFOFILE"
exit 1
fi
if [ $CROPDETECT -eq 1 ]; then
mplayer -ss "$SKIP" $DEMUXER $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
rm -f "$INFOFILE"
exit
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT$GAMMA "$1"
rm -f "$INFOFILE"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "if ($ADDSCALE<=0) 1 else $ADDSCALE" | bc 2> $DEVNULL)
# Limit Add Scale
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.1) 0.1 else if ($ADDSCALE>10) 10 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
rm -f "$INFOFILE"
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:$UNSHARP$GAMMA
if [ $DEBUG -eq 1 ]; then
echo " "
if [ $TWOPASS -eq 1 ]; then
echo "Encoding type: Two pass"
echo "Video bitrate: "$VBITRATE""
else
echo "Encoding type: One pass"
echo "Video quality: "$VQSCALE""
fi
echo "Audio quality: "$AUDIOQUALITY""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Video filter: "$SCALE""
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
mplayer $AUDIOTRACK $DEMUXER -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240$UNSHARP$GAMMA "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo -e "\n\nFile: "$1"\n"
AUDIOFILTER_OPTS=""
FPS=""
BASENAME=$(basename "$1")
NAMENEW="D2 - ${BASENAME%.*}.avi"
PASSLOGFILE=$NAMENEW.log
INFOFILE=$NAMENEW.info
mplayer -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts vbr=2:mode=0:q=$AUDIOQUALITY -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
rm -f "$INFOFILE"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
ID_VIDEO_FPS=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_FPS | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_FPS ]; then
ID_VIDEO_FPS=25
echo "Souce framerate was NOT FOUND! - video and audio will be asynchronized!"
fi
SET_FPS=$(echo "if ($ID_VIDEO_FPS>=100 || $ID_VIDEO_FPS==0) 1 else 0" | bc 2> $DEVNULL)
if [ $SET_FPS -eq 1 ]; then
FPS="-ofps 25"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=1:turbo -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$DEVNULL" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo -e "Abort!\n"
quality_summary
rm -f "$PASSLOGFILE" "$INFOFILE" psnr_*.log
exit 1
fi
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=2 -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$NAMENEW" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo -e "Abort!\n"
quality_summary
rm -f "$PASSLOGFILE" "$INFOFILE" psnr_*.log
exit 1
fi
rm -f "$PASSLOGFILE" "$INFOFILE"
else
nice -19 mencoder "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS_ONE_PASS -vf-add $SCALE -vf-add harddup -o "$NAMENEW" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$INFOFILE" psnr_*.log
exit 1
fi
fi
if [ $DEBUG -eq 1 ]; then
# look for count_quant.pl
COUNTQUANT=$(which count_quant.pl 2> $DEVNULL)
if [ -n "$COUNTQUANT" ]; then
# look for latest PSNR file
PSNRFILE=$(ls -t1 psnr_*.log 2> $DEVNULL | head -1 2> $DEVNULL)
if [ -n "$PSNRFILE" ]; then
echo -e "\nQuality statistics from "$PSNRFILE":\n"
"$COUNTQUANT" < "$PSNRFILE"
AVGQUANT=$?
echo " "
if [ $AVGQUANT -lt 255 ]; then
IDX=${#FILE_LIST[@]}
FILE_LIST[$IDX]="$1"
AVGQUANT_LIST[$IDX]=$AVGQUANT
fi
fi
fi
rm -f psnr_*.log
fi
rm -f "$INFOFILE"
else
echo "File not exist or not readable: "$1""
fi
shift
done
quality_summary
---------------- crop here ------------------
wow thats crasy,
iv written my own script and was proud of it:
#!/bin/bash
if [ "$1" == "" ] ; then
echo "usage: avi2cowonD2 [file.avi??]"
elif [ "$1" == "-help" ] ; then
echo "usage: avi2cowonD2 [file.avi???]"
else
mencoder "$1" -ovc lavc -lavcopts vcodec=mpeg4 -vf scale=320:-2 -oac mp3lame -lameopts vbr=3 -o "$1".d2.avi
fi
i tried it a view times and had no problems.
But your script looks so impressive. i will try it next ubuntu session [thumbsup]
linuxnutzer
09-03-2009, 08:16
This is a really handy script. I'm thinking of making a gui for it, mostly for the purpose of learning the pyqt framework. any thoughts?
thanks again.
-tim
Hi Tim,
is there any news regarding the gui?
Linuxnutzer
Not really - the need to learn pyqt kind of went away.
Also my laptop (Dell Inspiron 1420 N) is having trouble doing any kind of video encoding - it overheats and shuts down. This wretched laptop has conditioned me to avoid encoding videos, because I now associate that task with pain and frustration.
The first time my laptop/notebook shut down due to overheating was during a linux install. I managed to finish it by putting a plastic freeze-block (like you use in a cooler bag/box) under the processor spot and letting a large table-top-fan blow from the side.
After the install I located a service manual and opened the machine up. Inside the CPU and fan section, the air-intake grill and air exit grill were blocked by a ca 1 cm thick 'felt'-pads. It was dust and grime accumulated over a year in a bad environment.
Nowadays whenever dust starts to build up (can be seen by directing a light down the fan hole and looking through the air-intake grill) I pull out the vacum-cleaner! I also put my lips to the vents and BLOW real hard :-O
linuxnutzer
09-06-2009, 07:47
Not really - the need to learn pyqt kind of went away.
Also my laptop (Dell Inspiron 1420 N) is having trouble doing any kind of video encoding - it overheats and shuts down. This wretched laptop has conditioned me to avoid encoding videos, because I now associate that task with pain and frustration.
Yes, video encoding seems to be a hard task for the CPU. During summer, I cannot use my home computer for video encoding. The Athlon XP2700+ tends to overheat and the system freezes sometimes. Therefore, I use my computer at work (Xeon with 4 cores) under Windows and cygwin. It has a lot of fans (even on the RAM module) in it and is very fast.
Linuxnutzer
linuxnutzer
05-18-2011, 16:08
After years of usage without troubles here the latest version that fixes some issues which came up with the latest mplayer/mencoder versions.
1) mplayer did not stop with the -frames 1 option
2) the new default video decoder ffmpeg12 is not robust when decoding corrupt mpeg files from DVB-T -> prefer mpeg12 decoder
Have fun.
count_quant.pl
---------------- crop here ------------------
#!/usr/bin/perl -w
$quant_total = 0;
while (<STDIN>) {
if (/^[^,]+[,][ ]*([0-9]+)/) {
$quants{$1}++;
$quant_total += $1;
}
}
$frames = 0;
foreach $key (sort(keys(%quants))) {
$frames += $quants{$key};
}
if ($frames > 0) {
foreach $key (sort({ $a <=> $b } keys(%quants))) {
printf("video quality = %2d: num frames: %6d -> ratio: %6.2f%%\n", $key, $quants{$key}, $quants{$key} *
100 / $frames);
}
$average_quant = $quant_total/$frames;
printf("Average video quality: %f\n", $average_quant);
if ($average_quant < 3) {
printf("Video quality is excellent\n");
}
elsif ($average_quant < 5) {
printf("Video quality is very good\n");
}
elsif ($average_quant < 6) {
printf("Video quality is good\n");
}
elsif ($average_quant < 7) {
printf("Video quality is ok\n");
}
elsif ($average_quant >= 7) {
printf("Video quality may be not so good\n");
}
exit(int($average_quant + 0.5));
}
exit(255);
---------------- crop here ------------------
video_to_D2
---------------- crop here ------------------
#!/bin/bash
# The following programs are required
# bash, cat, grep, tac, awk, bc, mplayer, mencoder, [exiftool], [perl]
# user options
VBITRATE=500
AUDIOQUALITY=7
VBITRATE_LOW=250
AUDIOQUALITY_LOW=9
VQSCALE=4
VQSCALE_LOW=7
TWOPASS=1
BARSIZE=1
# encoder/player (empty string for default executables)
MPLAYER=""
MENCODER=""
# do not modify below
PROGNAME=${0##*/}
CYGWIN=0
DEVNULL="/dev/null"
OUTPUTDEVNULL="/dev/null"
if [ `uname -o | grep -c 'Cygwin'` -gt 0 ]; then
CYGWIN=1
OUTPUTDEVNULL=nul
fi
NUMBERTHREADS=`cat /proc/cpuinfo 2> $DEVNULL | egrep -c 'processor[[:space:]]*:[[:space:]][0-9]'`
CROP1=""
CROPDETECT=0
VERIFY1CROP=0
VERIFY2CROP=0
SKIP=0
DEBUG=0
AUDIOTRACK=""
UNSHARP=""
UNSHARPOPT="0"
GAMMA=""
GAMMAOPT="1"
DEMUXER=""
PSNR=""
if [ -z "$MPLAYER" ]; then
MPLAYER=$(which mplayer 2> $DEVNULL)
fi
if [ -z "$MENCODER" ]; then
MENCODER=$(which mencoder 2> $DEVNULL)
fi
#mencoder before version RC2
#COMMON_MENC_OPTS="-msglevel all=-1:avsync=5:mencoder=4 -noodml -sws 9 -audio-preload 0 -vc mpeg12, -of lavf -lavfopts format=avi:i_certify_that_my_video_stream_does_not _use_b_frames -ffourcc XVID"
#mencoder RC2
COMMON_MENC_OPTS="-msglevel all=-1:avsync=5:mencoder=5:statusline=5 -noodml -sws 9 -audio-preload 0 -vc mpeg12, -of lavf -lavfopts format=avi -ffourcc XVID"
usage()
{
echo "Usage: $PROGNAME"
echo " [-c <start time>] |"
echo " [-v [-C <first crop parameter>]] |"
echo " [-V [-C <first crop parameter>] [-B <rel. bar size>]] |"
echo " [-C <first crop parameter>] [-B rel. bar size] |"
echo " [-l] [-o]"
echo " [-u <unsharp value>]"
echo " [-g <gamma value>]"
echo " [-a <audio ID>]"
echo " [-d]"
echo " [-x]"
echo " files"
echo " "
echo "Defaults:"
echo " video bitrate: $VBITRATE kBit/s (two pass)"
echo " video quality: $VQSCALE (one pass)"
echo " audio quality: $AUDIOQUALITY [0..9]"
echo " two pass encoding: $TWOPASS"
echo " rel. bar size: $BARSIZE"
echo " "
echo "-c: crop detect"
echo "-v: verify first crop area"
echo "-V: verify second crop area"
echo "-C: first crop area"
echo "-B: relative black bar size [0..1] (1: full bars; 0: no bars)"
echo "-d: debug output"
echo "-a: select audio ID if more than one available (MPEG: first: 128, second: 129 etc.)"
echo " see: mplayer -v <file>"
echo "-l: low quality -> video bitrate: $VBITRATE_LOW kBit/s (two pass)"
echo " -> video quality: $VQSCALE_LOW (one pass)"
echo " -> audio quality: $AUDIOQUALITY_LOW"
echo "-u: unsharp mask [-1.5 .. 1.5] (>0: soften; <0: sharpen)"
echo "-g: gamma value [0.1 .. 10.0]"
echo "-o: one pass encoding with constant quality"
echo "-x: use lavf demuxer (experimental)"
echo " "
echo "Crop/scale instructions:"
echo " 1) Determine first crop:"
echo " $PROGNAME -c <start time> <file>"
echo " -> FIRST_CROP_PARAMETER e.g. 704:448:6:64"
echo " 2) Verify first crop:"
echo " $PROGNAME -v -C FIRST_CROP_PARAMETER <file>"
echo " 3) Verify second crop:"
echo " $PROGNAME -V [-C FIRST_CROP_PARAMETER] [-B <rel. bar size [0..1]>] <file>"
echo " 4) Convert:"
echo " $PROGNAME [-C FIRST_CROP_PARAMETER] [-B rel. bar size] ] <files>"
echo " Example: $PROGNAME -C 704:448:6:64 -B 0.5 *.vob"
}
quality_summary()
{
if [ $DEBUG -eq 1 ]; then
NUM_ENTRIES=${#FILE_LIST[@]}
if [ $NUM_ENTRIES -gt 0 ]; then
echo -e "\n\nVideo quality summary statistics:\n"
IDX=0
while [ $IDX -lt $NUM_ENTRIES ]
do
QUALITY="(ok)"
if [ ${AVGQUANT_LIST[$IDX]} -gt 6 ]; then
QUALITY="(bad - please check!)"
fi
echo -e "File: ${FILE_LIST[$IDX]}\t\tQuality: ${AVGQUANT_LIST[$IDX]}\t$QUALITY"
IDX=$[IDX+1]
done
echo " "
fi
fi
}
while getopts "c:vVC:lodB:a:xu:g:" options; do
case $options in
C ) CROP1=$OPTARG
;;
B ) BARSIZE=$OPTARG
;;
l ) VBITRATE=$VBITRATE_LOW
AUDIOQUALITY=$AUDIOQUALITY_LOW
VQSCALE=$VQSCALE_LOW
;;
o ) TWOPASS=0
;;
c ) CROPDETECT=1
SKIP=$OPTARG
;;
v ) VERIFY1CROP=1
;;
V ) VERIFY2CROP=1
;;
a ) AUDIOTRACK="-aid $OPTARG"
;;
d ) DEBUG=1
PSNR=":psnr"
;;
u ) UNSHARP=",unsharp=l5x5:"
UNSHARPOPT=$OPTARG
;;
g ) GAMMA=",eq2="
GAMMAOPT=$OPTARG
;;
x ) DEMUXER="-demuxer lavf"
;;
* ) usage
exit 1
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 1 ]; then
usage
exit
fi
if [ ! -f "$1" -o ! -r "$1" ]; then
echo "File not exist or not readable: "$1""
exit 1
fi
#XVid
VIDEO_OPTS="-ovc xvid -xvidencopts bitrate=$VBITRATE:threads=$NUMBERTHREADS:trellis:q uant_type=h263:vhq=4:me_quality=6:chroma_opt:max_b frames=0:min_iquant=2:min_pquant=2:max_key_interva l=100$PSNR"
PASS=pass
VIDEO_OPTS_ONE_PASS="-ovc lavc -lavcopts vqscale=$VQSCALE:vrc_maxrate=5000:vrc_buf_size=125 0:vqmin=1:threads=$NUMBERTHREADS:vcodec=mpeg4:vmax _b_frames=0:mbd=2:v4mv:trell:cmp=3:subcmp=3:vlelim =-4:vcelim=7:vqcomp=1.0:mpeg_quant:keyint=100$PSNR"
SKIP=$(echo $SKIP | bc 2> $DEVNULL)
if [ -z $SKIP ]; then
SKIP=0
fi
if [ -n "$UNSHARP" ]; then
UNSHARPOPT=$(echo $UNSHARPOPT | bc 2> $DEVNULL)
if [ -z $UNSHARPOPT ]; then
UNSHARPOPT=0
fi
UNSHARPOPT=$(echo "scale=10; if ($UNSHARPOPT < -5) -5 else if ($UNSHARPOPT > 5) 5 else $UNSHARPOPT" | bc 2> $DEVNULL)
UNSHARP="$UNSHARP$UNSHARPOPT"
fi
if [ -n "$GAMMA" ]; then
GAMMAOPT=$(echo $GAMMAOPT | bc 2> $DEVNULL)
if [ -z $GAMMAOPT ]; then
GAMMAOPT=0
fi
GAMMAOPT=$(echo "scale=10; if ($GAMMAOPT < -0.1) 0.1 else if ($GAMMAOPT > 10) 10 else $GAMMAOPT" | bc 2> $DEVNULL)
GAMMA="$GAMMA$GAMMAOPT"
fi
BASENAME=$(basename "$1")
INFOFILE="D2 - ${BASENAME%.*}.info"
echo q | "$MPLAYER" -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
ID_VIDEO_HEIGHT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_HEIGHT | awk -F"=" '{print $2}')
ID_VIDEO_WIDTH=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_WIDTH | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_HEIGHT -o -z $ID_VIDEO_WIDTH ]; then
echo "Can not get video data. Maybe not a valid video file?"
rm -f "$INFOFILE"
exit 1
fi
if [ $CROPDETECT -eq 1 ]; then
"$MPLAYER" -ss "$SKIP" $DEMUXER $AUDIOTRACK -vf cropdetect=24:2 "$1" 2> $DEVNULL | grep "\[CROP\]"
rm -f "$INFOFILE"
exit
fi
XCROP=$(echo "$CROP1" | awk -F":" '{print $1}' | bc 2> $DEVNULL)
YCROP=$(echo "$CROP1" | awk -F":" '{print $2}' | bc 2> $DEVNULL)
XSHIFT=$(echo "$CROP1" | awk -F":" '{print $3}')
YSHIFT=$(echo "$CROP1" | awk -F":" '{print $4}')
if [ -z $XCROP ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ $XCROP -lt 1 ]; then
XCROP=$ID_VIDEO_WIDTH
fi
if [ -z $YCROP ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $YCROP -lt 1 ]; then
YCROP=$ID_VIDEO_HEIGHT
fi
if [ $VERIFY1CROP -eq 1 ]; then
"$MPLAYER" $AUDIOTRACK $DEMUXER -vf rectangle=$XCROP:$YCROP:$XSHIFT:$YSHIFT$GAMMA "$1"
rm -f "$INFOFILE"
exit
fi
# Calculate YSIZE
ID_VIDEO_ASPECT=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_ASPECT | awk -F"=" '{print $2}')
ADDSCALE=$(echo "scale=10; $ID_VIDEO_HEIGHT*$ID_VIDEO_ASPECT/$ID_VIDEO_WIDTH" | bc 2> $DEVNULL)
if [ -z $ADDSCALE ]; then
ADDSCALE=1
fi
ADDSCALE=$(echo "if ($ADDSCALE<=0) 1 else $ADDSCALE" | bc 2> $DEVNULL)
# Limit Add Scale
ADDSCALE=$(echo "scale=10; if ($ADDSCALE < 0.1) 0.1 else if ($ADDSCALE>10) 10 else $ADDSCALE" | bc 2> $DEVNULL)
ASPECTRATIO=$(echo "scale=10; $XCROP*$ADDSCALE/$YCROP" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
PORTRAITMODE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($ASPECTRATIO<(320/240)) 1-$BARSIZE else $BARSIZE" | bc 2> $DEVNULL)
FULLBAR=$(echo "if ($BARSIZE==1) 1 else 0" | bc 2> $DEVNULL)
BARSIZE=$(echo "scale=10; if ($BARSIZE<0) 0 else if ($BARSIZE>1) 1 else $BARSIZE" | bc 2> $DEVNULL)
if [ $FULLBAR -eq 1 -o $PORTRAITMODE -eq 1 ]; then
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)+0.5; scale=0; a/1" | bc 2> $DEVNULL`
else
YSIZE=`echo "scale=10; a=(((320/$ASPECTRATIO)-240)*$BARSIZE+240)/16+0.5; scale=0; (a/1)*16" | bc 2> $DEVNULL`
fi
rm -f "$INFOFILE"
if [ -z $YSIZE ]; then
echo "Error during auto aspect ratio calculation"
exit 1
fi
SCALE=crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",crop=320:240,expand=320:$UNSHARP$GAMMA
if [ $DEBUG -eq 1 ]; then
echo " "
if [ $TWOPASS -eq 1 ]; then
echo "Encoding type: Two pass"
echo "Video bitrate: "$VBITRATE""
else
echo "Encoding type: One pass"
echo "Video quality: "$VQSCALE""
fi
echo "Audio quality: "$AUDIOQUALITY""
echo "Number threads: "$NUMBERTHREADS""
echo "ID_VIDEO_WIDTH: "$ID_VIDEO_WIDTH""
echo "ID_VIDEO_HEIGHT: "$ID_VIDEO_HEIGHT""
echo "ID_VIDEO_ASPECT: "$ID_VIDEO_ASPECT""
echo "Additional Scale: "$ADDSCALE""
echo "X-crop size: "$XCROP""
echo "Y-crop size: "$YCROP""
echo "Aspect ratio: "$ASPECTRATIO""
echo "YSize: "$YSIZE""
echo "Video filter: "$SCALE""
sleep 3
fi
if [ $VERIFY2CROP -eq 1 ]; then
"$MPLAYER" $AUDIOTRACK $DEMUXER -vf crop=$XCROP:$YCROP:$XSHIFT:$YSHIFT,scale=-2:"$YSIZE",expand=320:240,rectangle=320:240$UNSHARP$GAMMA "$1"
exit
fi
while [ $# -gt 0 ]
do
if [ -f "$1" -a -r "$1" ]; then
echo -e "\n\nFile: "$1"\n"
AUDIOFILTER_OPTS=""
FPS=""
BASENAME=$(basename "$1")
NAMENEW="D2 - ${BASENAME%.*}.avi"
PASSLOGFILE=$NAMENEW.log
INFOFILE=$NAMENEW.info
echo q | "$MPLAYER" -frames 1 -vo null -ao null -really-quiet -identify "$1" 2> $DEVNULL > "$INFOFILE"
#Example how to enhance audio of digi cam videos
#identify canon powershot 710 avi
#if [ `exiftool "$1" | grep -c 'CanonMVI02'` -gt 0 ]; then
# echo "Fix canon avi"
# AUDIOFILTER_OPTS=",sinesuppress=570:0.01,channels=2"
#fi
AUDIO_OPTS="-oac mp3lame -lameopts vbr=2:mode=0:q=$AUDIOQUALITY -af-adv force=1 -srate 44100 -af dummy$AUDIOFILTER_OPTS"
# Do not reencode already encoded mp3 audio
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT=85"` -gt 0 ]; then
AUDIO_OPTS="-oac copy"
fi
# Add Silence if no audio is available
if [ `tac "$INFOFILE" | grep -c "ID_AUDIO_FORMAT"` -eq 0 ]; then
if [ "$CYGWIN" -eq 1 ]; then
echo "File: "$1" has no audio!"
rm -f "$INFOFILE"
exit 1
fi
AUDIO_OPTS="-oac mp3lame -lameopts cbr:preset=32:mode=0 -srate 16000 -audiofile /dev/zero -audio-demuxer 20 -rawaudio format=0x1:rate=16000"
fi
ID_VIDEO_FPS=$(tac "$INFOFILE" | grep -m 1 ID_VIDEO_FPS | awk -F"=" '{print $2}')
if [ -z $ID_VIDEO_FPS ]; then
ID_VIDEO_FPS=25
echo "Souce framerate was NOT FOUND! - video and audio will be asynchronized!"
fi
SET_FPS=$(echo "if ($ID_VIDEO_FPS>=100 || $ID_VIDEO_FPS==0) 1 else 0" | bc 2> $DEVNULL)
if [ $SET_FPS -eq 1 ]; then
FPS="-ofps 25"
fi
if [ $TWOPASS -eq 1 ]; then
nice -19 "$MENCODER" "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=1:turbo -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$OUTPUTDEVNULL" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo -e "Abort!\n"
quality_summary
rm -f "$PASSLOGFILE" "$INFOFILE" psnr_*.log
exit 1
fi
nice -19 "$MENCODER" "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS:$PASS=2 -vf-add $SCALE -vf-add harddup -passlogfile "$PASSLOGFILE" -o "$NAMENEW" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo -e "Abort!\n"
quality_summary
rm -f "$PASSLOGFILE" "$INFOFILE" psnr_*.log
exit 1
fi
rm -f "$PASSLOGFILE" "$INFOFILE"
else
nice -19 "$MENCODER" "$1" $COMMON_MENC_OPTS $DEMUXER $AUDIOTRACK $AUDIO_OPTS $FPS $VIDEO_OPTS_ONE_PASS -vf-add $SCALE -vf-add harddup -o "$NAMENEW" 2> $DEVNULL
if [ $? -ne 0 ]; then
echo "User abort!"
rm -f "$INFOFILE" psnr_*.log
exit 1
fi
fi
if [ $DEBUG -eq 1 ]; then
# look for count_quant.pl
COUNTQUANT=$(which count_quant.pl 2> $DEVNULL)
if [ -n "$COUNTQUANT" ]; then
# look for latest PSNR file
PSNRFILE=$(ls -t1 psnr_*.log 2> $DEVNULL | head -1 2> $DEVNULL)
if [ -n "$PSNRFILE" ]; then
echo -e "\nQuality statistics from "$PSNRFILE":\n"
"$COUNTQUANT" < "$PSNRFILE"
AVGQUANT=$?
echo " "
if [ $AVGQUANT -lt 255 ]; then
IDX=${#FILE_LIST[@]}
FILE_LIST[$IDX]="$1"
AVGQUANT_LIST[$IDX]=$AVGQUANT
fi
fi
fi
rm -f psnr_*.log
fi
rm -f "$INFOFILE"
else
echo "File not exist or not readable: "$1""
fi
shift
done
quality_summary
---------------- crop here ------------------
Thanks for continuing to maintain this script.
vBulletin® v3.8.7, Copyright ©2000-2013, vBulletin Solutions, Inc.