Скрипт кодирования dvd в avi.
Создано: 04-06-2009 19:49:57 изменено: 21-01-2010 10:50:01  Метки: dvd video bash
Источник:
http://www.lissyara.su/?id=1274
Скрипт кодирования dvd в avi. Кодек DIVX (FMP4),
2 прохода, качество выбирается вручную, размер видео 700 Мб.
Либо, если кодируемый файл небольшой, то битрейт видео ставится равный 1000, а размер как получится, но < 700 Мб.
Аудио дорожка кодируется в mp3 с битрейтом 128 и выравнивается громкость.
По окончании кодирования отсылается уведомление на почту.

#! /bin/bash
#-----------------------------------------------------------------------
#/dvd2divx.sh
#Скрипт кодирования dvd в avi. Кодек DIVX (FMP4),
#2 прохода, качество выбирается вручную, размер видео 700 Мб.
#Либо, если кодируемый файл небольшой, то битрейт видео ставится равный 1000,
#а размер как получится, но < 700 Мб.
#Аудио дорожка кодируется в mp3 с битрейтом 128 и выравнивается громкость.
#По окончании кодирования отсылается уведомление на почту.
#ВНИМАНИЕ!!! Кодирование с качеством идет очень медленно.
#Основные настройки скрипта задаются в ниже идущих переменных.
#------------------------------------------------------------------------

FILESCOUNT=0
OUT_FILE="VideoOut.avi"
VBITRATE=""
CROP=""
PASS1="vpass=1"
PASS2="vpass=2"
OAC="-oac mp3lame -lameopts br=128:vbr=3"
CODER="nice -n 19 mencoder -quiet"
PLAYER="nice -n 19 mplayer -frames 100 -vo null -ao null -vf scale=730:-2,cropdetect"
AFILTER="-af volnorm,volume=0:1"
MAIL="xxxx@xxxx.ru"
DATA="`date`"

#Проверка входных параметров
if [ $# -lt 2 ] ; then
    echo "dvd2divx.sh <каталог с VOB файлами> <качество>"
    echo "Качество кодирования:"
    echo "  vhq - очень высокое;"
    echo "  hq  - высокое;"
    echo "  f   - быстрое;"
    echo "  rt  - реального времени."
    echo "Пример: dvd2divx.sh /decode vhq"
    exit 1
fi

if [ -d "$1" ] ; then
    cd $1
else
    echo "Ошибка! Директория $1 не существует."
    exit 1
fi

FILELIST=`ls $1 | grep VOB`

if [ -z "$FILELIST" ] ; then
    echo "Ошибка! В директории $1 не найдено VOB файлов."
    exit 1
fi

for FILE in $FILELIST
do
    if [ -f "$FILE" ] ; then
        CROPFILE="$FILE"
    else
        echo "Ошибка! $FILE не является файлом."
        exit 1
    fi
done

#Оценка обрезки
${PLAYER} ${CROPFILE} > crop.log
CROP=`tail -n 4 crop.log | grep crop | awk -F= '{print $2}' \
| awk -F\) '{print $1}'`
VFILTER="-vf pullup,softskip,scale=730:-2,crop=${CROP},hqdn3d=2:1:2"
rm -r crop.log

#Размер аудио файла. Битрейт видео.
nice -n 19 cat *.VOB | ${CODER} -ovc frameno ${OAC} ${AFILTER} \
-o frameno.avi -ni - > bitrate.log
VBITRATE=`cat bitrate.log | grep "Recommended video bitrate for 700MB CD" \
| awk '{print $7}'`
rm -rf frameno.avi
rm -rf bitrate.log

#Кодирование видео
if [ -z "$VBITRATE" ] ; then
    echo "Ошибка! Битрейт видео не определен. \
Устанавливаем значение по умолчанию."
    VBITRATE=1000
fi

if [ "$VBITRATE" -gt "2000" ]; then
    echo "Ошибка! Битрейт слишком высокий: $VBITRATE. \
Устанавливаем значение по умолчанию."
    VBITRATE=1000
fi

case "$2" in
    vhq)
        OVC="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$VBITRATE:\
mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:\
vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2:vhq=4:autoaspect"
    ;;
    hq)
        OVC="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$VBITRATE:mbd=2:\
trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:\
subcmp=3:precmp=0:vqcomp=0.6:turbo"
    ;;
    f)
        OVC="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$VBITRATE:mbd=2:\
trell:v4mv:turbo"
    ;;
    rt)
        OVC="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$VBITRATE:mbd=2:turbo"
    ;;
    *)
        echo "Ошибка! Не существующий параметр качества кодирования."
        exit 1
esac

nice -n 19 cat *.VOB | ${CODER} ${OVC}:${PASS1} -oac copy -o /dev/null - && \
nice -n 19 cat *.VOB | ${CODER} ${OVC}:${PASS2} ${VFILTER} ${OAC} \
${AFILTER} -o ${OUT_FILE} -

#Шлем письмо хозяину
echo "" >> messages
echo "Закончено кодирование DVD файла"  >> messages
echo "Директория $1" >> messages
echo "Входящий(e) файл(ы) ${FILELIST}" >> messages
echo "Исходящий файл ${OUT_FILE}" >> messages
echo "Обработка файла начата ${DATA}" >> messages
echo "Обработка закончена `date`" >> messages
cat messages | mail -s "Decode dvd in $1" ${MAIL}
rm -f messages
rm -f divx2pass.log

1645 просмотров комментировать