Код отслеживания Google Analytics.

Jun 14, 2008

Video converter для Cowon D2

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



#!/bin/bash


#from http://cowond2.god.su/index.php?name=Pages&op=page&pid=7
#Воспроизведение видео

#Плеер способен воспроизводить следующие форматы видео:

# AVI : MPEG4 до 2 Мбит/с, 320x240, 30 к/с, MP3 (аудио)
# WMV : WMV9 до 768 Кбит/с, 320x240, 30 к/с, WMA (аудио)

# Плеер НЕ поддерживает B-frames при воспроизведении видео. Это стоит учитывать при перекодировании видео сторонними программами (отключать, то бишь). На деле это приводит к тому, что полуторачасовой фильм в разрешении 320х240 занимает около 400-450 МБ, что много. Если вы перекодировали видео-файл для воспроизведения на D2, а плеер при попытке воспроизведения показывает черный экран, то вероятнее всего при
перекодировании не были отключены B-frames.

# Плеер без проблем читает большие файлы, запинок при проигрывании не происходит. Ограничения на размер видео файла нет (проверялось пока максимум 1 ГБ)
# Замечены случаи рассинхронизации видео и аудио потоков. Замечено, что это порой зависит от версии прошивки. Если вы наблюдаете постоянною рассинхронизацию потоков, от файла к файлу, то можно при перекодировании на ПК намеренно поставить запаздывание/опережение звука на величину лага
при просмотре на плеере. JetAudio этого не умеет. Умеют VirualDub, ffmpeg. Еще можно порекомендовать iRiverter, хороший перекодировщик видео под D2, пусть и от конкурентов...

# Битрейт видео ставить больше 500 кб/с смысла особого нет, вполне достаточно 300-400 кб/с. Если вам не жалко места, то можете и больше сделать, но особо в качестве не выйграете.
# При выводе видео на телевизор, используйте формат NTSC, в формате PAL изображение будет смещено либо просто выглядеть некорректно.
# Через шнурок TV-out можно выводить только видео, фотки посмотреть не удастся

DEFAULT_SUFFIX="_D2.avi"

DEFAULT_VIDEOBITRATE="256"

function printHelp() {
programName=`basename $0`
cat << EndOfHelpText
Usage: ${programName} [options] <input file name> [output file name]
Options:
-h:                   this message
-m <mplayer options>: one parameter which will be passed to mplayer. WARNING! It should be 1 parameter! 
For example: "-ss 04:00 -endpos 01:00" can be used for coding only 5th minute.
$>${programName} -m "-ss 04:00 -endpos 01:00" fileName
-v <video bitrate>:   use video bitrate instead default value (${DEFAULT_VIDEOBITRATE})              
-n:                   print string for encoding and exit
-f:                   overwrite output file

if output file name is ommited then script try to use input file name and suffix ${DEFAULT_SUFFIX}
EndOfHelpText
}

if [ $# -eq "0" ]; then 
printHelp
exit 1
fi


videoBitrate="${DEFAULT_VIDEOBITRATE}"

while getopts ":m:nv:f" option; do
case $option in
m ) mplayerOptions="${OPTARG}";;
n ) onlyCommand="true";;
f ) forceOverwrite="true" ;;
v ) videoBitrate="${OPTARG}";;
* ) printHelp
exit 1 ;;
esac
done

# Переход к очередному параметру командной строки.
shift $(($OPTIND - 1))

inputFile="$1"
shift
outputFile="$1"
if [ "${outputFile}" = "" ]; then
outputFile=`echo "${inputFile}" | sed "s|^\(.*\)\.[^.]*$|\1|g"`
outputFile="${outputFile}${DEFAULT_SUFFIX}"

fi
if [ "${onlyCommand}" != "true" ]; then
if [ -e "${outputFile}" -a "${forceOverwrite}" != "true" ]; then
echo "the ${outputFile} already exists"

exit 1
fi
fi

#<------------------------------------------------ Audio ------------------------------------------------>
#audio кодируется с помощью библиотеки lame в mp3

audioCodec="-oac mp3lame"


#preset=medium - VBR(переменный битрейт) кодирование, хорошее качество, битпоток в диапазоне 150-180 кбит/с
audioOptions="-lameopts preset=medium"


#о preset см man mencoder и http://www.ixbt.com/multimedia/lame-presets.shtml
#
#примеру из http://em.typodemon.com/wordpress/?p=136
#mencoder -o "${outputFile}" -ovc lavc -vf scale=320:240 -oac lavc -lavcopts vmax_b_frames=0:acodec=mp3:abitrate=128:vbitrate=256 "${inputFile}"

#соответствует
#audioOpts="-lameopts cbr:br=128" #CBR(постоянный битрейт) 128
#лучше будет
#audioOpts="-lameopts preset=128" #ABR(средний битрейт)
#подробнее о lame и [VAC]BR см: http://www.allok.ru/?id=15#encoding_modes


#volnorm - фильтр нормализации звука
audioFilters="-af volnorm"

audio="${audioCodec} ${audioFilters} ${audioOptions}"


#<------------------------------------------------ Video ------------------------------------------------>
#video кодируется с помощью библиотеки libavcodec (ffmpeg)

videoCodec="-ovc lavc"


#hqdn3d - Этот фильтр нацелен на уменьшение шума изображения, выдавая сглаженную картинку и делая неподвижные изображения действительно неподвижными (что должно улучшить сжимаемость.)
#dsize - определяет величину экрана(320x240) и заставляет считать эти размеры так же и размерами видео(2), сохраняя при это его(видео) пропорции

#scale - изменяет размеры в соответствии с рекомендациями dsize
videoFilters="-vf hqdn3d,dsize=320:240:2,scale=0:0"


#Так же существует:
#pp - postprocess filters (см man mencoder). Наиболее общий фильтр, который при этом встречается - pp=ac/autolevels:fullyrange Однако мне кажется, что для Cowon D2 он не слишком важен, тогда как время обработки и объем файла растут. Этот фильтр рекомендуется ставить первым (http://www.mplayerhq.hu/DOCS/HTML-single/ru/MPlayer.html#menc-feat-dvd-mpeg4-filtering). Его расшифровка:

# ac - высококачественная комбинация pp фильтров (ha:a:128:7,va:a,dr:a). Т.е. ha и va - фильтры тщательного горизонтального и вертикального deblocking'а(http://en.wikipedia.org/wiki/Deblocking_filter_(video) и http://www.mplayerhq.hu/DOCS/HTML-single/ru/MPlayer.html#menc-feat-x264-encoding-options-misc-preferences), dr - фильтр удаления ореола на границе цветов.
# autolevels - автоматическая коррекция яркости / контрастности (fullyrange: Растягивает яркостную компоненту до (0-255))
#videoFilters="-vf pp=ac/autolevels:fullyrange,hqdn3d,dsize=320:240:2,scale=0:0"

#
#vcodec=mpeg4 - Видео будет представлено в формате mpeg4
#vmax_b_frames=0 - B-кадры(B-frames) не будут кодироваться (что такое B-кадры можно посмотреть здесь http://articles.security-bridge.com/articles/10/12198/)
#vbitrate= - Указывает битпоток


#mbd=2 - Алгоритм принятия решения о макроблоке (режим высокого качества), Указывает кодировать каждый макроблок всеми режимами и выбирать лучший. Это работает медленно, но дает лучшее качество и меньший файл.
#trell - Квантование поиском по решетке. Параметр мне не ясен, но утверждается, что нет оснований его исключать (http://www.mplayerhq.hu/DOCS/HTML-single/ru/MPlayer.html#menc-feat-telecine-footnotes)

#v4mv - Допускает 4 вектора движения на макроблок (немного лучшее качество). При использовании с mbd>0 работает лучше.
videoOptions="-lavcopts vcodec=mpeg4:vmax_b_frames=0:vbitrate=${videoBitrate}:mbd=2:trell:v4mv"


#Так же существует:
#qpel - (man mencoder: Использовать четвертьпиксельную (quarter pel) компенсацию движения (несовместимо с ilme). ПОДСКАЗКА: Похоже, что опция имеет смысл только для кодирования с высоким битпотоком.). Однако сколь высок должен быть битпоток мне не понятно.
#turbo - эта опция используется только при двухпроходном кодировании для первого прохода. Позволяет отключать некоторые процессоёмкие преобразования

video="${videoCodec} ${videoFilters} ${videoOptions}"

command="mencoder ${mplayerOptions} -o \"${outputFile}\" ${video} ${audio} \"${inputFile}\""

echo -e "the following command will be executed:\n${command}"
if [ "${onlyCommand}" != "true" ]; then
[ -e "${outputFile}" -a "${forceOverwrite}" = "true" ] && rm -v "${outputFile}"

if [ -e "${outputFile}" ]; then
echo "the ${outputFile} cannot be removed"
exit 1
fi
mencoder ${mplayerOptions} -o "${outputFile}" ${video} ${audio} "${inputFile}"
fi

4 comments:

temochka said...

Спасибо! Отличный скрипт :)

Beggy said...

Не за что, я рад что он кому-то пригодился :)

Anonymous said...

спасибо большое

Beggy said...

Всегда пожалуйста :)