Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> dvd в avi

Кодирование dvd в avi

Автор: serge.


    Все началось с того, что каталог в котором хранится видео стал занимать неприлично много места. Он был общий для всего нашего отдела и каждый приносил и скидывал что-то интересное и новое. Причем формат файлов был преимущественно DVD. Тогда и пришла мысль пережимать VOB файлы, создавая из них AVI.
   В портах FreeBSD для этих целей существует несколько решений, но мой выбор пал на MPlayer (MEncoder). Понравился он мне тем, что поддерживает огромное (без преувеличения) количество различных форматов, обладает таким же огромных количеством настроек кодирования и умеет работать без иксов.
   Устанавливаем MPlayer.

server# cd /usr/ports/
server# make search name=mplayer
...
Port:   mplayer-0.99.8_5
Path:   /usr/ports/multimedia/mplayer
Info:   High performance media player/encoder supporting many formats
Maint:  riggs@rrr.de
...
server# cd /usr/ports/multimedia/mplayer
server# make install clean

   При установке выбираем следующие опции
       
¦ ¦[ ] DEBUG Include debug symbols in mplayer's binary files ¦ ¦
¦ ¦[X] RTCPU Let mplayer dynamically check for CPU features ¦ ¦
¦ ¦[X] OCFLAGS Use optimized compiler flags ¦ ¦
¦ ¦[X] MENCODER Support encoding of multimedia files ¦ ¦
¦ ¦[ ] IPV6 Include inet6 network support ¦ ¦
¦ ¦[ ] X11 Enable X11 support for mplayer's video output ¦ ¦
¦ ¦[ ] GUI Enable GTK2 graphical user interface with X11 ¦ ¦
¦ ¦[ ] SDL Enable SDL video output ¦ ¦
¦ ¦[X] VIDIX Enable VIDIX video output on supported archs ¦ ¦
¦ ¦[ ] NVIDIA Enable experimental nvidia xvmc driver ¦ ¦
¦ ¦[ ] SKINS Force dependency on mplayer-skins ¦ ¦
¦ ¦[ ] FREETYPE Use freetype for OSD fonts (TrueType!) ¦ ¦
¦ ¦[ ] RTC Add support for kernel real time clock timing ¦ ¦
¦ ¦[ ] ARTS Enable KDE sound system support ¦ ¦
¦ ¦[ ] ESOUND Enable GNOME esound support ¦ ¦
¦ ¦[ ] POLYP Enable polyp sound server support ¦ ¦
¦ ¦[X] LIBUNGIF Enable gif support ¦ ¦
¦ ¦[ ] AALIB Enable aalib support ¦ ¦
¦ ¦[X] LIBCACA Enable libcaca support ¦ ¦
¦ ¦[ ] SVGALIB Enable svgalib support ¦ ¦
¦ ¦[ ] LIBDV Enable libdv support ¦ ¦
¦ ¦[ ] MAD Enable mad MPEG audio engine support ¦ ¦
¦ ¦[X] DTS Enable DTS audio codec support ¦ ¦
¦ ¦[ ] SPEEX Enable speex audio codec support ¦ ¦
¦ ¦[ ] TREMOR Use built-in tremor instead of libvorbis ¦ ¦
¦ ¦[ ] XMMS Enable XMMS plugin support ¦ ¦
¦ ¦[ ] THEORA Enable ogg theora video support ¦ ¦
¦ ¦[X] WIN32 Enable win32 codec set on the IA32 arch ¦ ¦
¦ ¦[ ] X264 Enable x264 (H.264) video codec support ¦ ¦
¦ ¦[ ] XANIM Enable xanim DLL support ¦ ¦
¦ ¦[X] XVID Enable XVID video codec support ¦ ¦
¦ ¦[ ] REALPLAYER Enable real player plugin ¦ ¦
¦ ¦[ ] LIVEMEDIA Enable LIVE555 streaming support ¦ ¦
¦ ¦[ ] FRIBIDI Enable FriBiDi support ¦ ¦
¦ ¦[ ] LIRC Enable lirc support ¦ ¦
¦ ¦[ ] CDPARANOIA Enable cdparanoia support ¦ ¦

   LIBCACA - в общем-то не нужна. Но советую ее поставить, так как позже покажу как ее задействовать для просмотра видео в консоли!
   Установка продлится приличное время и потянет из инета порядка 20-30 Мб различных пакетов.
   Если все завершилось удачно, то проверяем все это в работе. Повторюсь что у меня на сервере иксы отсутствуют, поэтому рассматриваем работу mplayera и mencodera без них. Для этого нам и понадобится возможность вывода видео непосредственно в консоли.
   
server# mplayer -vo caca -quiet film.avi

   Вы должны увидеть изображение построенное из ASCII символов (целых 16! цветов).
   Переходим к кодированию DVD в AVI. Документация по MEncoder'у советует использовать кодеки семейства libavcodec или xvid, так как они обеспечивают максимально возможное качество изображения. Я выбрал кодек mpeg4 - ISO standard MPEG-4 (DivX 5, XviD compatible) из первого семейства. Для настроек кодирования MEncoder имеет море опций, описание которых лучше всего читать в документации. Так же там приведены настройки для кодирования DVD в AVI в 4 режимах качества (очень высокое качество, высокое качество, быстрое, реального времени). Основываясь на них я написал shell скрипт, в котором объединены и автоматизированы все основные этапы кодирования. Комментарии смотрите в самом скрипте.
   
#!/bin/sh 
#-----------------------------------------------------------------------
#/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 -vf cropdetect"
AFILTER="-af volnorm,volume=0:1"
MAIL="serge@serge.int"
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,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

В заключении хотел бы добавить, что с небольшими доработками планирую его поставить в крон для автоматического обхода заданных директорий и при наличии в них VOB файлов пережимать их в AVI. Такой вот своеобразный сервис получится!



размещено: 2006-11-06,
последнее обновление: 2007-12-23,
автор: serge


Роман, 2006-11-07 в 10:05:40

Хорошая статья, как раз хотел на днях пожать свои киношки. Спасибо!

gruz0, 2007-09-13 в 6:18:17

В тему, может дополнит:
http://scripts4nix.nnm.ru/ripaem_dvd_diski

MyMy, 2008-09-16 в 6:51:10

у меня вот такое вываливает:

The selected video_out device is incompatible with this codec.
Try appending the scale filter to your filter list,
e.g. -vf spp,scale instead of -vf spp.
Using SSE optimized IMDCT transform
Using MMX optimized resampler
[AO OSS] audio_setup: Can't open audio device /dev/dsp: No such file or directory
[mpeg1video @ 0x86647d0]removing common factors from framerate
Compiler did not align stack variables. Libavcodec has been miscompiled
and may be very slow or crash. This is not a bug in libavcodec,
but in the compiler. You may try recompiling using gcc >= 4.2.
Do not report crashes to FFmpeg developers.
nice: mencoder: No such file or directory
Ошибка! Битрейт видео не определен. Устанавливаем значение по умолчанию.
nice: mencoder: No such file or directory

Сирцея, 2008-09-29 в 17:56:37

ну в общем не для лузеров)))

m4rkell, 2008-10-24 в 9:48:31

MyMy, memcoder поставь и будет тебе счастье

m4rkell, 2008-10-24 в 10:08:24

А кто подскажет, как пропорции сохранить? а то он мне широкоформатный фильм в 4:3 сделал....

fox, 2009-04-05 в 21:23:15

memcoder у меня нет make config такой опции, что мне делать, а без ней не работает?

sool, 2009-04-07 в 21:07:28

ставь mencoder а то некоторые с ошибками пишут!

ivniq, 2009-12-17 в 15:46:51

Огромное спасибо, практически сразу добился нужного результатав.

nencu, 2010-08-17 в 17:58:00

>>LIBCACA - в общем-то не нужна. Но советую ее поставить, так как позже покажу как ее задействовать для просмотра видео в консоли!
Вообще, для просмотра в консоли можно использовать не только каку, но и нормальные библиотеки. Посмотреть их можно в mplayer -vo help



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0516 секунд
Из них PHP: 35%; SQL: 65%; Число SQL-запросов: 77 шт.
Исходный размер: 33394; Сжатая: 8970