
Re: Cowon d2+/d2 +linux ubuntu
wine - зло. Оно тебе надо, из своей системы полигон для вирусов делать?
Держи, пользуйся! ^_^
Сорри, форум не даёт выложить. Короче НЯ!
Код:
#! /bin/bash
# set -v
##################################
# D2 video encoder for Linux #
# mencoder, mplayer, awk, XviD #
# lavcodec and bash are requied! #
# Version 0.06 from 28 may 2010 #
# By Arago (Arago@inbox.ru) #
##################################
# TODO: пофиксить баг с возможной пропажей саба и 5 секунд видео в середине файла при двухпоточном кодировании в мультисегментном режиме. Как - хз((
# TODO: пофиксить баг с раскраской в мультифайловом многопоточном режиме
# Инициализация
{
# Задание параметров кодирования, изменить при необходимости.
outputwidth=320
outputheight=240
videobitrate=400
audioobitrate=128
# Задание параметров тестового кусочка по умолчанию, изменить при необходимости.
ss=300
endpos=10
# Задание разричных внутренних параметров
aid=1
all=*
mode="XviD"
# Кодировка сабов по умолчанию (если -subcp enca не сможет определить кодировку автоматически)
subcp=cp1251
# Язык сабов для -subcp enca
enca_sublang="ru"
# Язык сабов для -slang
slang="ru,rus"
# Язык звука
alang="jpn,ja"
# Сдвиг сабов по умолчанию - не двигаем
subdelay=0
# -noautoexpand - для отключения автоматического рендеринга сабов
# -mc 0 - для обхода бага с Too many audio packets in the buffer
params="-alang $alang -noautoexpand -mc 0 -really-quiet "
# Путь для копирования готовых файлов по умолчанию
default_copy_path="/media/D2/VIDEO"
# Параметры скалирования изображения (по горизонтали - $outputwidth, по вертикали - согласно аспекту, округляя до +-16 пикселов)
vf="-vf scale=$outputwidth:-10,harddup"
# Раскраска скрипта (код не мой!)
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[34m'
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
function cecho { echo -ne "$2"
echo "$1"
tput sgr0
}
}
# Парсер командной строки
{
# Деинициализируем (на всякий случай) перепенную command_line - в неё будем складывать опции передаваемые рабочим процессам в пакетном режиме
unset command_line
# Разбор командной строки
until [[ "$1" == "" ]] ; do
case $1 in
-t ) if [[ "$2" == "-ss" ]]; then
if [[ "$3" -gt "0" ]]; then
ss=$3
cecho "" $yellow
shift
shift
else
cecho "После $2 необходимо указать целое положительное число!" $red
fi
fi
if [[ "$2" == "-endpos" ]]; then
if [[ "$3" -gt "0" ]]; then
endpos=$3
cecho "" $yellow
shift
shift
else
cecho "После $2 необходимо указать целое положительное число!" $red
fi
fi
cecho "Тестовый режим, кодируем кусочек в $endpos секунд начиная с $ss секунды" $yellow
chunk1="-ss $ss -endpos $endpos "
test="true"
# Суффикс имени тестового файла
testsuffix="[TEST ($chunk1) -aid $aid]"
# Тест кодируем в однопоточном режиме (на всякий случай)
unithread=":"
command_line="$command_line -t" ;;
-aid ) if [[ "${2:0:1}" != "-" ]]; then
cecho "Указана звуковая дорожка $2" $yellow
aid=$2
command_line="$command_line -aid $2"
fi ;;
-r ) cecho "Используется кодек mpeg2 (RockBox)!" $yellow
mode="mpeg2"
# Похоже что многосегментная многопоточность не работает в этом режиме, нет звука и индекса в готовом файле. Форсируем unithread mode.
cecho "Задан режим Rockbox, форсированно использую однопоточный режим!" $yellow
unithread=":"
command_line="$command_line -r" ;;
-s ) cecho "Используется кодек XviD, оптимизация под смарты Nokia с экраном qvga (CorePlayer)!" $yellow
mode="6120"
command_line="$command_line -s" ;;
-p ) cecho "Задан просмотр после обработки!" $yellow
play="true"
command_line="$command_line -p" ;;
-c ) # Проверка, не является ли следущий параметр ключом, если нет - считать его путём для копирования выходных файлов
if [[ "${2:0:1}" != "-" ]]; then
if [[ -d "$2" && "-w $2" ]]; then
cecho "Копирую перекодированные файлы в каталог $2!" $green
copy_path="$2"
copy_flag="true"
elif [[ -d "$2" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог $2, но $2 недоступен для записи!" $red
elif [[ -f "$2" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог $2, но $2 является файлом!" $red
elif [[ ! -e "$2" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог $2, но $2 не существует!" $red
fi
elif [[ -d "$default_copy_path" && -w "$default_copy_path" ]]; then
cecho "Копирую перекодированные файлы в каталог по умолчанию $default_copy_path!" $green
copy_path="$default_copy_path"
copy_flag="true"
elif [[ -d "$default_copy_path" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог по умолчанию $default_copy_path, но $default_copy_path недоступен для записи!" $red
elif [[ -f "$default_copy_path" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог по умолчанию $default_copy_path, но $default_copy_path является файлом!" $red
elif [[ ! -e "$default_copy_path" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог по умолчанию $default_copy_path, но $default_copy_path не существует!" $red
else
cecho "SHIT HAPPENED!" $blue
exit 1
fi ;;
-d ) cecho "Задан режим отладки!" $red
debug=":"
command_line="$command_line -d" ;;
-mv ) cecho "Задан параметр перещения перекодированных файлов!" $yellow
move_flag="true"
command_line="$command_line -mv" ;;
-u ) cecho "Использую однопоточный режим!" $yellow
unithread=":"
command_line="$command_line -u" ;;
-s ) cecho "Форсирую обработку субтитров!" $yellow
force_subs="true"
command_line="$command_line -s" ;;
-m ) cecho "Форсирую многосегментную многопоточность!" $yellow
segmented_multithread="true"
command_line="$command_line -m" ;;
-v ) cecho "Задан детальный режим!" $yellow
verbose="true"
command_lne="$command_line -v"
# Убираем -really-quiet из параметров mencoder
params=${params//-really-quiet /} ;;
-a ) batch="true"
# Проверка, не является ли следущий параметр ключом, если нет - считать его расширением файлов для пакетной обработки
if [[ "${2:0:1}" != "-" && "$2" != "1" && "$2" != "2" && ! -f "$2" && "$2" != "" ]]; then
all="*.$2"
cecho "Задан пакетный режим. обрабатываю файлы с расширением $2!" $red
else
cecho "Задан пакетный режим. обрабатываю всё подряд!" $red
fi ;;
-subcp ) # Проверка, не является ли следущий параметр ключом, если нет - считать его кодировкой сабов при сбое enca
if [[ "${2:0:1}" != "-" && "$2" != "1" && "$2" != "2" && ! -f "$2" && "$2" != "" ]]; then
cecho "Задана кодировка субтитров $2!" $yellow
subcp=$2
command_line="$command_line -subcp $2"
else
cecho "Ошибка в параметре -subcp - не указана кодировка, использую cp1251!" $red
fi ;;
-subdelay ) # Проверка, не является ли следущий параметр ключом, если нет - считать его сдвигом сабов относительно видео (если сабы отстают от видео - положительное значение, если опережают - отрицательное).
if [[ ! -f "$2" && "$2" != "" ]]; then
cecho "Задана задержка субтитров в $2 секунд(ы)!" $yellow
subdelay=$2
command_line="$command_line -subdelay $2"
subdelay_forced=true
else
cecho "Ошибка в параметре -subdelay - не указана задержка!" $red
fi ;;
-savesubdelay ) # Проверка сохранения задержки в файл
cecho "Заданно сохранение задержки сабов!" $yellow
command_line="$command_line -s"
save_subdelay=true ;;
-ddfc ) # Проверка отключения коррекции грязных FPS
cecho "Коррекция грязных FPS отключена!" $yellow
ddfc_disable=true
command_line="$command_line -ddfc" ;;
-daid ) # Проверка отключения использования -aid
cecho "Использование -aid отключено!" $yellow
aid_disable=true
command_line="$command_line -daid" ;;
-o ) if [[ "${2:0:1}" != "-" ]]; then
if [[ -d "$2" && "-w $2" ]]; then
cecho "Задан выходной каталог $2/" $green
outdir=$2/
export outdir
elif [[ -d "$2" ]]; then
cecho "Задан выходной каталогг $2, но $2 недоступен для записи!" $red
elif [[ -f "$2" ]]; then
cecho "Задан выходной каталог $2, но $2 является файлом!" $red
elif [[ ! -e "$2" ]]; then
cecho "Задан выходной каталог $2, но $2 не существует!" $red
fi; shift
else cecho "Не задан выходной каталог, использую значение по умолчанию!" $red
fi ;;
-h ) echo 'Использование:
'`basename "$0"`' [-t [-ss startseconds] [-endpos lenght]] [1|2] [-r] [-p] [-d] [-u] [-m] [-h] [-v] [-s] [-subcp codepage] [-c [/path/] [-mv]] [-o /path/] (-a [ext])|input-video
где:
-t - тестовый режим (кодировать кусочек в '$endpos' секунд начиная с '$ss' секунды) (test)
-ss - начать тестовый кусочек с позиции startseconds от начала файла (в секундах)
-endpos - длина тестового кусочка (в секундах)
1|2 - номер звуковой дорожкм (по умолчанию 1)
-r - режим Rockbox (формат mpeg2) (rockbox)
-p - воспроизвести после кодирования (удобно совместно с -t, но не используйте в пакетном режиме!) (play)
-d - режим отладки (не запускать кодирование) (debug)
-u - запретить второй поток кодирования для мультисегментного режима (unithread) (безопасно!)
-v - детальный режим (не подавлять вывод mencoder, немного замедляет процесс!) (verbose)
-s - форсировать обработку с субтитрами, даже если файл сабов не найден (применительно для встроенных сабов mkv или если нужна картинка 320x240) (subtitles)
-a - пакетный режим (обрабатывать все файлы в текущем каталоге) (all)
ext - расширение для пакетной обработки, например -a avi (по умолчанию - *) (только последний параметр -a [ext] будет обработан!) (крайне рекомендуется установить если кодируем сериал с одинаковыми по длине сериями)
-m - форсировать многосегментную многопоточность для -a ext (включать желательно если кодируемые файлы сильно отличаются по длине) (multithread) (опасно!)
-subcp codepage - кодировка субтитров если автоопределение не срабатывает, например -subcp UTF8 (по умолчанию - cp1251) (как для mencoder)
-subdelay - установить сдвиг сабов относительно видео (если сабы отстают от видео - положительное значение, если опережают - отрицательное), например -subdelay 1.5
-savesubdelay - сохранить значение сдвига сабов в файл (после этого можно кодировать в автоматическом режиме, значение будет прочитано из файла)
-ddfc - Отключить коррекцию грязных FPS (если входное видео с FPS=119.880 и неправильно кодируется)
-daid - Отключить использования -aid (если нет звука при кодировании vob файлов)
-o /path/ - путь для сохранения выходных файлов и логов кодировщика
input-video - входной видео файл (полный путь, относительый путь или имя файла в текущем каталоге) (только последний указанный файл будет обработан!)
-c [/path/] - автоматическое копирование перекодированного файла в каталог /path/ (copy) (по умолчанию - '$default_copy_path', если невозможно копировать в указанный каталог - параметр игнорируется, если каталог копирования не указан и невозможно копировать в каталог по умолчанию - параметр игнорируется)
-mv - перемещать перекодированные файлы вместо копирования. Использовать имеет смысл только вместе с параметром -c. Если путь для копирования не определён - не делать ничего.
-h - справка (этот текст) (help)'
exit 0 ;;
* ) if [[ -f "$1" ]]; then
cecho "Работаем с файлом $1" $green
file=$1
fi ;;
esac
shift
done
if [[ "$copy_flag" == "true" && "$move_flag" == "true" ]]; then
cecho "Перемещаю перекодированные файлы в каталог $copy_path!" $yellow
move_files="true"
elif [[ "$copy_flag" != "true" && "$move_flag" == "true" ]]; then
cecho "Игнорирую параметр перещения перекодированных файлов, путь для перемещения не определён!" $red
# На всякий случай
unset move_files
fi
}
# Пакетный режим
{
# Проверка на форсированную мультисегментность и пакетный режим с указанием расширения (иначе под раздачу в один поток может попасть саб и видяшка, что приведёт фактически к однопоточному кодированию)
if [[ "$batch" == "true" && "$all" != "*" && "$segmented_multithread" == "" ]]; then
cecho "Использую мультифайловую многопоточность!" $green
for i in $all; do
if [[ "$first" == "" ]]; then
# Если переменная $first не задана - запоминаем в неё имя первого потока и продолжаем обход
first="$i"
continue
else
# А иначе - инициируем запуск двух потоков одновременно в режиме unithread
second="$i"
if [[ "$copy_flag" == "true" ]] ; then
# sleep 5; надо чтобы обойти проблему состояния гонки при многопоточности (создание каталога Recoded например, когда при проверке его ещё не было, а в момент создания он уже есть, что приводит к ошибке создания и сбою, в результате чего второй поток при первом заходе гадит в ~) и при выводе сообщений на экран
($0 "$first" $command_line -u -c "$copy_path") & (sleep 5; $0 "$second" $command_line -u -c "$copy_path")
else
($0 "$first" $command_line -u) & (sleep 5; $0 "$second" $command_line -u)
fi
# И дожидаемся их завершения (если длинна паралельно обрабатываемых кусков разная будет ожидание более длинного перед продолжением).
# А затем чистим внутренние переменные
unset first
unset second
# И уходим на следущий заход
fi
done
# Если переменная $first не пуста - значит файлов было нечётное количество, обрабатываем последний файл (можно и без -u - будет быстрее но посередине может вывалиться кусок)
if [[ "$first" != "" ]]; then
if [[ "$copy_flag" == "true" ]] ; then
$0 "$first" $command_line -u -c "$copy_path"
else
$0 "$first" $command_line -u
fi
fi
exit 0
# Проверка на пакетный режим
elif [[ "$batch" == "true" ]]; then
if [[ "$unithread" == ":" ]]; then
cecho "Многопоточность не используется!" $red
else
cecho "Использую многосегментную многопоточность!" $yellow
fi
for i in $all
do
if [[ "$copy_flag" == "true" ]] ; then
$0 "$first" $command_line -c "$copy_path"
else
$0 "$first" $command_line
fi
done
exit 0
fi
}
# Всякие проверки
{
# Проверка, задан ли файл для обработки
if [[ "$file" == "" ]]; then
cecho "Не задан файл для работы!" $red
exit 1
fi
# Получение пути к файлу, имени файла и его расширения
temp=${file/*\//}
sourcedir=${file::$((${#file}-${#temp}))}
ext=${temp/*./.}
sourcefilename=${temp::$((${#temp}-${#ext}))}
# Если скрипт вызван без пути к файлу - считать что файл находится в текущем каталоге
if [[ "$sourcedir" == "" ]]
then sourcedir="`pwd`/"
fi
# Определяем, куда складывать выходные файлы
if [[ -d "$outdir" && -w "$outdir" ]]
then cecho "Будем складывать выходные файлы в каталог $outdir" $green
elif [[ -d "$sourcedir"Recoded && -w "$sourcedir"Recoded ]]
then cecho "Каталог ${sourcedir}Recoded найден - будем складывать выходные файлы в него" $green
outdir="$sourcedir"Recoded/
elif [[ -d "$sourcedir"Recoded && -d ~ && -w ~ ]]
then cecho "Каталог ${sourcedir}Recoded найден, но недоступен для записи - будем складывать выходные файлы в ~/" $yellow
outdir=~/
elif mkdir ${sourcedir}Recoded&>/dev/null
then cecho "Создан каталог ${sourcedir}Recoded" $green
outdir="$sourcedir"Recoded/
elif [[ -d ~ && -w ~ ]]
then cecho "Создание ${sourcedir}Recoded провалено, будем складывать выходные файлы в ~/" $yellow
outdir=~/
else cecho "Не знаю куда складывать выходные файлы, аварийное завершение" $red
exit 1
fi
# Сокращения для имён файлов
source=$sourcedir$sourcefilename$ext
out=$outdir$sourcefilename$ext$testsuffix
}
# Получение информации об исходном файле
{
# Идентификация файла
IDENTIFY=`mplayer -frames 0 -ao null -vo null -identify "$source" 2>/dev/null`
# Получение длительности входного файла (для двухпоточного режима)
ID_LENGTH=`echo "$IDENTIFY"|awk -F '=' '/ID_LENGTH/ {print $2}'`
# Получение имён внешних файлов субтитров (по одному на строку)
ID_FILE_SUB_FILENAME=`echo "$IDENTIFY"|awk -F '=' '/ID_FILE_SUB_FILENAME/ {print $2}'`
# Получение номеров внутренних дорожек субтитров (по одному на строку)
ID_SUBTITLE_ID=`echo "$IDENTIFY"|awk -F '=' '/ID_SUBTITLE_ID/ {print $2}'`
# Получение языков внутренних дорожек субтитров (по одному на строку)
ID_SID_=`echo "$IDENTIFY"|awk -F '=' '/ID_SID_/ {print $2}'`
# Получение частоты кадров (во избежание грязных хаков типа varable fps с fps=119.880 и всех радостей связанных с этим тиапа ускорения видео и недокодированных файлов)
ID_VIDEO_FPS=`echo "$IDENTIFY"|awk -F '=' '/ID_VIDEO_FPS/ {print $2}'`
}
# Работа с сабами
{
# Проверка на наличие файла для задержки сабов
if [[ -f "$source.subdelay" && ! "$subdelay_forced" == "true" ]]
then subdelay=`cat "$source.subdelay"`
cecho "Найден файл задержки сабов $source.subdelay - используем задержку сабов в $subdelay секунд(ы)!" $yellow
fi
# Сохранение задержки при необходимости
if [[ "$save_subdelay" == "true" ]] ; then
rm "$source.subdelay"
echo $subdelay|tee "$source.subdelay" >/dev/null
fi
# Параметры сабов, при необходимости/желании - настроить
subset="-subfont-text-scale 3 -subfont-blur 8 -subfont-outline 8 -subcp enca:$enca_sublang:$subcp -slang $slang -subdelay $subdelay"
# subset="-subcp enca:$enca_sublang:$subcp -slang $slang -ass -ass-force-style Fontsize=25,PrimaryColour=&H00ffffff,BackColour=&H00000000,OutlineColour=&H00000000,Bold=0,Italic=0,BorderStyle=1,Outline=5"
# PlayResX=512,PlayResY=320,Name=Default,Alignment=2,Shadow=0,MarginL=20,MarginR=20,MarginV=15
# По умолчанию - /dev/null, чтоб менкодер не ругался на тему option 'sub' must have a parameter.
subfile="/dev/null"
# Функиция инициализации субтитров (вызов: initsubs)
function initsubs { subsetup=$subset
# Задаём фильтр expand для добавления чёрной полосы внизу изображения под сабы
# Увеличиваем высоту картинки после expand на 10 лишних пикселов
let expand=$outputheight+10
# Рендерим сабы и обрезаем нижние лишние 10 пикселов (сдвигаем сабы на 10 пикселов вниз)
# vf=$vf,expand=$outputwidth:$outputheight:0:0,crop=320:240:0:0
vf=$vf,expand=$outputwidth:$expand:0:0:1,crop=0:$outputheight:0:0
}
# Сохраняем перменную IFS - щна нам ещё пригодится
ifs=$IFS
# И назначаем разделителем \n
IFS='
'
# Перебираем файлы внешних сабов, последний из них будет использоваться
for subfile in `echo "$ID_FILE_SUB_FILENAME"`; do
cecho "Нашёл файл субтитров $subfile" $green
done
# Вот и пригодилась...
IFS=$ifs
if [[ "$subfile" != "/dev/null" || "$1" == "force" ]]; then initsubs; fi
# Если не нашли сабы - проверяем отказываемся от них, иначе - сообщаем, какой файл сабов будет использоваться
if [[ "$subfile" == "/dev/null" ]]; then
if [[ "$ID_SUBTITLE_ID" != "" ]]; then
cecho "Найдена внутренняя дорожка субтитров, использую её!" $green
initsubs
elif [[ "$force_subs" == "true" ]]; then
cecho "Не нашёл субтитры, форсированно обрабатываю их!" $yellow
initsubs
else cecho "Не нашёл субтитры, продолжаю без них!" $yellow
fi
else cecho "Использую файл субтитров $subfile" $yellow
# Задаём sid=10 чтобы форсировать использование внешнего файла сабов при их наличии
subsetup="$subsetup -sid 10"
fi
# С сабами разобрались.
}
# Режимы кодирования
{
# Функция проверки входного fps на валидность, если не валидный (24/30) - принять равным 24 (?). Вызов - check_dirty_fps
function check_dirty_fps { if [[ "$ID_VIDEO_FPS" == "119.880" ]]; then
fps=24
if [[ "$ddfc_disable" != "true" ]]; then
params="$params -fps $fps"
fi
# А вот тут A/V синхронизация как раз и потребуется, без неё падает
params=${params//-mc 0/}
fi
}
# Функция проверки необходимости использования -aid. Вызов - check_aid
function check_aid { if [[ "$aid_disable" == "true" ]]; then
oac=${oac//-aid $aid /}
fi
}
case $mode in
mpeg2 ) # Режим mpeg2
# Настройки кодека видео. Изменить при необходимости
ovc="-of mpeg -ovc lavc -lavcopts vcodec=mpeg2video:vbitrate=$videobitrate:vmax_b_frames=4:vb_strategy=0:brd_scale=3:turbo:trell:qns=3:vpass="
# Настройки фильтров аудио. Изменить при необходимости
af="-af volnorm,resample=44100:0:0"
# Настройки кодека аудио. Изменить при необходимости
oac="-aid $aid -oac lavc -lavcopts acodec=libmp3lame:abitrate=$audioobitrate"
outext="mpg"
params="$params -ofps 25"
check_dirty_fps
check_aid ;;
XviD ) # Режим XviD
# Настройки кодека видео. Изменить при необходимости
ovc="-ffourcc XVID -ovc xvid -xvidencopts trellis:vhq=4:hq_ac:max_bframes=0:bitrate=$videobitrate:turbo:pass="
# Настройки фильтров аудио. Изменить при необходимости
af="-af volnorm,resample=44100:0:0"
# Настройки кодека аудио. Изменить при необходимости
oac="-aid $aid -oac mp3lame -lameopts mode=0:cbr:br=$audioobitrate"
outext="avi"
check_dirty_fps
check_aid ;;
6120 ) # Режим 6120
# Настройки кодека видео. Изменить при необходимости
ovc="-ffourcc XVID -ovc xvid -xvidencopts trellis:vhq=4:hq_ac:bitrate=$videobitrate:turbo:pass="
# Настройки фильтров аудио. Изменить при необходимости
af="-af volnorm,resample=44100:0:0"
# Настройки кодека аудио. Изменить при необходимости
oac="-aid $aid -oac mp3lame -lameopts mode=0:cbr:br=$audioobitrate"
outext="avi"
check_dirty_fps
check_aid ;;
* ) cecho "SHIT HAPPENED!" $blue
esac
}
# Мультисегментная многопоточность
{
if [[ "$unithread" == ":" ]]; then
# Если задан однопоточный режим - считать серединой конец файла
middlepos=$ID_LENGTH
else
# А иначе - середину
middlepos=`echo $ID_LENGTH| awk '{ print $1 / 2 }'`
fi
# Если тестовый режим не задан - определяем границы участков для потоков:
if [[ "$test" != "true" ]]; then
# Для первого - от начала и до середины.
chunk1="-endpos $middlepos "
# Для второго - от середины и до конца.
chunk2="-ss $middlepos "
fi
}
# Свистелки
{
# Функция для показа клмандной строки кодирования (вызов: show firstpass|secondpass)
function show { # Устанавливаем флаг проверки
show=":"
# Сохраняем флаг debug
olddebug=$debug
echo -ne "$yellow"
# И включаем флаг debug в положение echo
debug="echo"
# Вызываем функции кодирования с флагом debug
echo -----------------------------------------
$1 1 "$chunk1"
echo -----------------------------------------
if [[ "$unithread" != ":" ]]; then
$1 2 "$chunk2"
echo -----------------------------------------
fi
# И восстанавливаем флаг debug обратно
debug=$olddebug
unset olddebug
# А также убираем флаг проверки
unset show
tput sgr0
}
# Функция вывода таймстампа (вызов; timestamp)
function timestamp { echo
echo -ne "$yellow"
date
tput sgr0
echo
}
}
# Собственно кодирование
{
# Функция первого прохода (вызов: firstpass номер_части "границы части" [unithread_flag])
function firstpass { $show $3 cecho "Processing pass 1 of part $1!" $green
$debug $3 mencoder -nosound "$source" $params $subsetup -sub "$subfile" $vf $ovc\1 -passlogfile "$out part$1.log" -o /dev/null $2
$show $3 cecho "Pass 1 of part $1 done!" $green
$show $3 timestamp
}
# Функция второго прохода (вызов: secondpass номер_части "границы части" [unithread_flag])
function secondpass { $show $3 cecho "Processing pass 2 of part $1!" $green
$debug $3 mencoder "$source" $params $subsetup -sub "$subfile" $af $oac $vf $ovc\2 -passlogfile "$out part$1.log" -o "$out part$1.$outext" $2
$show $3 cecho "Pass 2 of part $1 done!" $green
$show $3 timestamp
}
# Показываем команды кодирования частей
cecho "First pass:" $green
show firstpass
cecho "Second pass:" $green
show secondpass
# И начинаем процесс
timestamp
# sleep 2 - во избежание состояния гонки при выводе сообщений
(firstpass 1 "$chunk1"; secondpass 1 "$chunk1") & (sleep 2; firstpass 2 "$chunk2" $unithread; secondpass 2 "$chunk2" $unithread)
# Хорошо бы дождаться завершения обоих частей прежде чем склеивать их...
wait
}
# Постобработка
{
# Если задан флаг debug - дальше нам делать нечего...
if [[ "$debug" == ":" ]]; then
exit 1
fi
# Если не задан однопоточный режим - надо бы по быстрому слепить оба куска и прибраться за собой пока никто не видит...
if [[ "$unithread" != ":" ]]; then
cecho "$file Joining" $green
time mencoder "$out part1.$outext" "$out part2.$outext" -oac copy -ovc copy -o "$out.$outext" $quiet
rm "$out part1.$outext" "$out part2.$outext" "$out part1.log" "$out part2.log"
else
# А иначе - просто переименовать первый кусок в выходной файл и прибраться.
mv "$out part1.$outext" "$out.$outext"
rm "$out part1.log"
fi
# Просмотр после кодирования
if [[ "$play" == "true" ]]; then
mplayer "$out.$outext"
fi
# Проверка на необходимость копирования готовых файлов и отсутствие необходимости перемещения
if [[ "$copy_flag" == "true" && "$move_files" != "true" ]]; then
cecho "Копирую $out.$outext в $copy_path" $green
# И если надо - запускаем копирование в фоновом режиме
cp "$out.$outext" "$copy_path" &
# Проверка на необходимость перемещения готовых файлов
elif [[ "$copy_flag" == "true" && "$move_files" == "true" ]]; then
cecho "Перемещаю $out.$outext в $copy_path" $green
# И если надо - запускаем пермещение в фоновом режиме
mv "$out.$outext" "$copy_path"&
fi
}
wine - зло. Оно тебе надо, из своей системы полигон для вирусов делать?
Держи, пользуйся! ^_^
Сорри, форум не даёт выложить. Короче НЯ!
[spoiler=bash script][code]#! /bin/bash
# set -v
##################################
# D2 video encoder for Linux #
# mencoder, mplayer, awk, XviD #
# lavcodec and bash are requied! #
# Version 0.06 from 28 may 2010 #
# By Arago (Arago@inbox.ru) #
##################################
# TODO: пофиксить баг с возможной пропажей саба и 5 секунд видео в середине файла при двухпоточном кодировании в мультисегментном режиме. Как - хз((
# TODO: пофиксить баг с раскраской в мультифайловом многопоточном режиме
# Инициализация
{
# Задание параметров кодирования, изменить при необходимости.
outputwidth=320
outputheight=240
videobitrate=400
audioobitrate=128
# Задание параметров тестового кусочка по умолчанию, изменить при необходимости.
ss=300
endpos=10
# Задание разричных внутренних параметров
aid=1
all=*
mode="XviD"
# Кодировка сабов по умолчанию (если -subcp enca не сможет определить кодировку автоматически)
subcp=cp1251
# Язык сабов для -subcp enca
enca_sublang="ru"
# Язык сабов для -slang
slang="ru,rus"
# Язык звука
alang="jpn,ja"
# Сдвиг сабов по умолчанию - не двигаем
subdelay=0
# -noautoexpand - для отключения автоматического рендеринга сабов
# -mc 0 - для обхода бага с Too many audio packets in the buffer
params="-alang $alang -noautoexpand -mc 0 -really-quiet "
# Путь для копирования готовых файлов по умолчанию
default_copy_path="/media/D2/VIDEO"
# Параметры скалирования изображения (по горизонтали - $outputwidth, по вертикали - согласно аспекту, округляя до +-16 пикселов)
vf="-vf scale=$outputwidth:-10,harddup"
# Раскраска скрипта (код не мой!)
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[34m'
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
function cecho { echo -ne "$2"
echo "$1"
tput sgr0
}
}
# Парсер командной строки
{
# Деинициализируем (на всякий случай) перепенную command_line - в неё будем складывать опции передаваемые рабочим процессам в пакетном режиме
unset command_line
# Разбор командной строки
until [[ "$1" == "" ]] ; do
case $1 in
-t ) if [[ "$2" == "-ss" ]]; then
if [[ "$3" -gt "0" ]]; then
ss=$3
cecho "" $yellow
shift
shift
else
cecho "После $2 необходимо указать целое положительное число!" $red
fi
fi
if [[ "$2" == "-endpos" ]]; then
if [[ "$3" -gt "0" ]]; then
endpos=$3
cecho "" $yellow
shift
shift
else
cecho "После $2 необходимо указать целое положительное число!" $red
fi
fi
cecho "Тестовый режим, кодируем кусочек в $endpos секунд начиная с $ss секунды" $yellow
chunk1="-ss $ss -endpos $endpos "
test="true"
# Суффикс имени тестового файла
testsuffix="[TEST ($chunk1) -aid $aid]"
# Тест кодируем в однопоточном режиме (на всякий случай)
unithread=":"
command_line="$command_line -t" ;;
-aid ) if [[ "${2:0:1}" != "-" ]]; then
cecho "Указана звуковая дорожка $2" $yellow
aid=$2
command_line="$command_line -aid $2"
fi ;;
-r ) cecho "Используется кодек mpeg2 (RockBox)!" $yellow
mode="mpeg2"
# Похоже что многосегментная многопоточность не работает в этом режиме, нет звука и индекса в готовом файле. Форсируем unithread mode.
cecho "Задан режим Rockbox, форсированно использую однопоточный режим!" $yellow
unithread=":"
command_line="$command_line -r" ;;
-s ) cecho "Используется кодек XviD, оптимизация под смарты Nokia с экраном qvga (CorePlayer)!" $yellow
mode="6120"
command_line="$command_line -s" ;;
-p ) cecho "Задан просмотр после обработки!" $yellow
play="true"
command_line="$command_line -p" ;;
-c ) # Проверка, не является ли следущий параметр ключом, если нет - считать его путём для копирования выходных файлов
if [[ "${2:0:1}" != "-" ]]; then
if [[ -d "$2" && "-w $2" ]]; then
cecho "Копирую перекодированные файлы в каталог $2!" $green
copy_path="$2"
copy_flag="true"
elif [[ -d "$2" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог $2, но $2 недоступен для записи!" $red
elif [[ -f "$2" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог $2, но $2 является файлом!" $red
elif [[ ! -e "$2" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог $2, но $2 не существует!" $red
fi
elif [[ -d "$default_copy_path" && -w "$default_copy_path" ]]; then
cecho "Копирую перекодированные файлы в каталог по умолчанию $default_copy_path!" $green
copy_path="$default_copy_path"
copy_flag="true"
elif [[ -d "$default_copy_path" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог по умолчанию $default_copy_path, но $default_copy_path недоступен для записи!" $red
elif [[ -f "$default_copy_path" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог по умолчанию $default_copy_path, но $default_copy_path является файлом!" $red
elif [[ ! -e "$default_copy_path" ]]; then
cecho "Задан параметр копирования перекодированных файлов в каталог по умолчанию $default_copy_path, но $default_copy_path не существует!" $red
else
cecho "SHIT HAPPENED!" $blue
exit 1
fi ;;
-d ) cecho "Задан режим отладки!" $red
debug=":"
command_line="$command_line -d" ;;
-mv ) cecho "Задан параметр перещения перекодированных файлов!" $yellow
move_flag="true"
command_line="$command_line -mv" ;;
-u ) cecho "Использую однопоточный режим!" $yellow
unithread=":"
command_line="$command_line -u" ;;
-s ) cecho "Форсирую обработку субтитров!" $yellow
force_subs="true"
command_line="$command_line -s" ;;
-m ) cecho "Форсирую многосегментную многопоточность!" $yellow
segmented_multithread="true"
command_line="$command_line -m" ;;
-v ) cecho "Задан детальный режим!" $yellow
verbose="true"
command_lne="$command_line -v"
# Убираем -really-quiet из параметров mencoder
params=${params//-really-quiet /} ;;
-a ) batch="true"
# Проверка, не является ли следущий параметр ключом, если нет - считать его расширением файлов для пакетной обработки
if [[ "${2:0:1}" != "-" && "$2" != "1" && "$2" != "2" && ! -f "$2" && "$2" != "" ]]; then
all="*.$2"
cecho "Задан пакетный режим. обрабатываю файлы с расширением $2!" $red
else
cecho "Задан пакетный режим. обрабатываю всё подряд!" $red
fi ;;
-subcp ) # Проверка, не является ли следущий параметр ключом, если нет - считать его кодировкой сабов при сбое enca
if [[ "${2:0:1}" != "-" && "$2" != "1" && "$2" != "2" && ! -f "$2" && "$2" != "" ]]; then
cecho "Задана кодировка субтитров $2!" $yellow
subcp=$2
command_line="$command_line -subcp $2"
else
cecho "Ошибка в параметре -subcp - не указана кодировка, использую cp1251!" $red
fi ;;
-subdelay ) # Проверка, не является ли следущий параметр ключом, если нет - считать его сдвигом сабов относительно видео (если сабы отстают от видео - положительное значение, если опережают - отрицательное).
if [[ ! -f "$2" && "$2" != "" ]]; then
cecho "Задана задержка субтитров в $2 секунд(ы)!" $yellow
subdelay=$2
command_line="$command_line -subdelay $2"
subdelay_forced=true
else
cecho "Ошибка в параметре -subdelay - не указана задержка!" $red
fi ;;
-savesubdelay ) # Проверка сохранения задержки в файл
cecho "Заданно сохранение задержки сабов!" $yellow
command_line="$command_line -s"
save_subdelay=true ;;
-ddfc ) # Проверка отключения коррекции грязных FPS
cecho "Коррекция грязных FPS отключена!" $yellow
ddfc_disable=true
command_line="$command_line -ddfc" ;;
-daid ) # Проверка отключения использования -aid
cecho "Использование -aid отключено!" $yellow
aid_disable=true
command_line="$command_line -daid" ;;
-o ) if [[ "${2:0:1}" != "-" ]]; then
if [[ -d "$2" && "-w $2" ]]; then
cecho "Задан выходной каталог $2/" $green
outdir=$2/
export outdir
elif [[ -d "$2" ]]; then
cecho "Задан выходной каталогг $2, но $2 недоступен для записи!" $red
elif [[ -f "$2" ]]; then
cecho "Задан выходной каталог $2, но $2 является файлом!" $red
elif [[ ! -e "$2" ]]; then
cecho "Задан выходной каталог $2, но $2 не существует!" $red
fi; shift
else cecho "Не задан выходной каталог, использую значение по умолчанию!" $red
fi ;;
-h ) echo 'Использование:
'`basename "$0"`' [-t [-ss startseconds] [-endpos lenght]] [1|2] [-r] [-p] [-d] [-u] [-m] [-h] [-v] [-s] [-subcp codepage] [-c [/path/] [-mv]] [-o /path/] (-a [ext])|input-video
где:
-t - тестовый режим (кодировать кусочек в '$endpos' секунд начиная с '$ss' секунды) (test)
-ss - начать тестовый кусочек с позиции startseconds от начала файла (в секундах)
-endpos - длина тестового кусочка (в секундах)
1|2 - номер звуковой дорожкм (по умолчанию 1)
-r - режим Rockbox (формат mpeg2) (rockbox)
-p - воспроизвести после кодирования (удобно совместно с -t, но не используйте в пакетном режиме!) (play)
-d - режим отладки (не запускать кодирование) (debug)
-u - запретить второй поток кодирования для мультисегментного режима (unithread) (безопасно!)
-v - детальный режим (не подавлять вывод mencoder, немного замедляет процесс!) (verbose)
-s - форсировать обработку с субтитрами, даже если файл сабов не найден (применительно для встроенных сабов mkv или если нужна картинка 320x240) (subtitles)
-a - пакетный режим (обрабатывать все файлы в текущем каталоге) (all)
ext - расширение для пакетной обработки, например -a avi (по умолчанию - *) (только последний параметр -a [ext] будет обработан!) (крайне рекомендуется установить если кодируем сериал с одинаковыми по длине сериями)
-m - форсировать многосегментную многопоточность для -a ext (включать желательно если кодируемые файлы сильно отличаются по длине) (multithread) (опасно!)
-subcp codepage - кодировка субтитров если автоопределение не срабатывает, например -subcp UTF8 (по умолчанию - cp1251) (как для mencoder)
-subdelay - установить сдвиг сабов относительно видео (если сабы отстают от видео - положительное значение, если опережают - отрицательное), например -subdelay 1.5
-savesubdelay - сохранить значение сдвига сабов в файл (после этого можно кодировать в автоматическом режиме, значение будет прочитано из файла)
-ddfc - Отключить коррекцию грязных FPS (если входное видео с FPS=119.880 и неправильно кодируется)
-daid - Отключить использования -aid (если нет звука при кодировании vob файлов)
-o /path/ - путь для сохранения выходных файлов и логов кодировщика
input-video - входной видео файл (полный путь, относительый путь или имя файла в текущем каталоге) (только последний указанный файл будет обработан!)
-c [/path/] - автоматическое копирование перекодированного файла в каталог /path/ (copy) (по умолчанию - '$default_copy_path', если невозможно копировать в указанный каталог - параметр игнорируется, если каталог копирования не указан и невозможно копировать в каталог по умолчанию - параметр игнорируется)
-mv - перемещать перекодированные файлы вместо копирования. Использовать имеет смысл только вместе с параметром -c. Если путь для копирования не определён - не делать ничего.
-h - справка (этот текст) (help)'
exit 0 ;;
* ) if [[ -f "$1" ]]; then
cecho "Работаем с файлом $1" $green
file=$1
fi ;;
esac
shift
done
if [[ "$copy_flag" == "true" && "$move_flag" == "true" ]]; then
cecho "Перемещаю перекодированные файлы в каталог $copy_path!" $yellow
move_files="true"
elif [[ "$copy_flag" != "true" && "$move_flag" == "true" ]]; then
cecho "Игнорирую параметр перещения перекодированных файлов, путь для перемещения не определён!" $red
# На всякий случай
unset move_files
fi
}
# Пакетный режим
{
# Проверка на форсированную мультисегментность и пакетный режим с указанием расширения (иначе под раздачу в один поток может попасть саб и видяшка, что приведёт фактически к однопоточному кодированию)
if [[ "$batch" == "true" && "$all" != "*" && "$segmented_multithread" == "" ]]; then
cecho "Использую мультифайловую многопоточность!" $green
for i in $all; do
if [[ "$first" == "" ]]; then
# Если переменная $first не задана - запоминаем в неё имя первого потока и продолжаем обход
first="$i"
continue
else
# А иначе - инициируем запуск двух потоков одновременно в режиме unithread
second="$i"
if [[ "$copy_flag" == "true" ]] ; then
# sleep 5; надо чтобы обойти проблему состояния гонки при многопоточности (создание каталога Recoded например, когда при проверке его ещё не было, а в момент создания он уже есть, что приводит к ошибке создания и сбою, в результате чего второй поток при первом заходе гадит в ~) и при выводе сообщений на экран
($0 "$first" $command_line -u -c "$copy_path") & (sleep 5; $0 "$second" $command_line -u -c "$copy_path")
else
($0 "$first" $command_line -u) & (sleep 5; $0 "$second" $command_line -u)
fi
# И дожидаемся их завершения (если длинна паралельно обрабатываемых кусков разная будет ожидание более длинного перед продолжением).
# А затем чистим внутренние переменные
unset first
unset second
# И уходим на следущий заход
fi
done
# Если переменная $first не пуста - значит файлов было нечётное количество, обрабатываем последний файл (можно и без -u - будет быстрее но посередине может вывалиться кусок)
if [[ "$first" != "" ]]; then
if [[ "$copy_flag" == "true" ]] ; then
$0 "$first" $command_line -u -c "$copy_path"
else
$0 "$first" $command_line -u
fi
fi
exit 0
# Проверка на пакетный режим
elif [[ "$batch" == "true" ]]; then
if [[ "$unithread" == ":" ]]; then
cecho "Многопоточность не используется!" $red
else
cecho "Использую многосегментную многопоточность!" $yellow
fi
for i in $all
do
if [[ "$copy_flag" == "true" ]] ; then
$0 "$first" $command_line -c "$copy_path"
else
$0 "$first" $command_line
fi
done
exit 0
fi
}
# Всякие проверки
{
# Проверка, задан ли файл для обработки
if [[ "$file" == "" ]]; then
cecho "Не задан файл для работы!" $red
exit 1
fi
# Получение пути к файлу, имени файла и его расширения
temp=${file/*\//}
sourcedir=${file::$((${#file}-${#temp}))}
ext=${temp/*./.}
sourcefilename=${temp::$((${#temp}-${#ext}))}
# Если скрипт вызван без пути к файлу - считать что файл находится в текущем каталоге
if [[ "$sourcedir" == "" ]]
then sourcedir="`pwd`/"
fi
# Определяем, куда складывать выходные файлы
if [[ -d "$outdir" && -w "$outdir" ]]
then cecho "Будем складывать выходные файлы в каталог $outdir" $green
elif [[ -d "$sourcedir"Recoded && -w "$sourcedir"Recoded ]]
then cecho "Каталог ${sourcedir}Recoded найден - будем складывать выходные файлы в него" $green
outdir="$sourcedir"Recoded/
elif [[ -d "$sourcedir"Recoded && -d ~ && -w ~ ]]
then cecho "Каталог ${sourcedir}Recoded найден, но недоступен для записи - будем складывать выходные файлы в ~/" $yellow
outdir=~/
elif mkdir ${sourcedir}Recoded&>/dev/null
then cecho "Создан каталог ${sourcedir}Recoded" $green
outdir="$sourcedir"Recoded/
elif [[ -d ~ && -w ~ ]]
then cecho "Создание ${sourcedir}Recoded провалено, будем складывать выходные файлы в ~/" $yellow
outdir=~/
else cecho "Не знаю куда складывать выходные файлы, аварийное завершение" $red
exit 1
fi
# Сокращения для имён файлов
source=$sourcedir$sourcefilename$ext
out=$outdir$sourcefilename$ext$testsuffix
}
# Получение информации об исходном файле
{
# Идентификация файла
IDENTIFY=`mplayer -frames 0 -ao null -vo null -identify "$source" 2>/dev/null`
# Получение длительности входного файла (для двухпоточного режима)
ID_LENGTH=`echo "$IDENTIFY"|awk -F '=' '/ID_LENGTH/ {print $2}'`
# Получение имён внешних файлов субтитров (по одному на строку)
ID_FILE_SUB_FILENAME=`echo "$IDENTIFY"|awk -F '=' '/ID_FILE_SUB_FILENAME/ {print $2}'`
# Получение номеров внутренних дорожек субтитров (по одному на строку)
ID_SUBTITLE_ID=`echo "$IDENTIFY"|awk -F '=' '/ID_SUBTITLE_ID/ {print $2}'`
# Получение языков внутренних дорожек субтитров (по одному на строку)
ID_SID_=`echo "$IDENTIFY"|awk -F '=' '/ID_SID_/ {print $2}'`
# Получение частоты кадров (во избежание грязных хаков типа varable fps с fps=119.880 и всех радостей связанных с этим тиапа ускорения видео и недокодированных файлов)
ID_VIDEO_FPS=`echo "$IDENTIFY"|awk -F '=' '/ID_VIDEO_FPS/ {print $2}'`
}
# Работа с сабами
{
# Проверка на наличие файла для задержки сабов
if [[ -f "$source.subdelay" && ! "$subdelay_forced" == "true" ]]
then subdelay=`cat "$source.subdelay"`
cecho "Найден файл задержки сабов $source.subdelay - используем задержку сабов в $subdelay секунд(ы)!" $yellow
fi
# Сохранение задержки при необходимости
if [[ "$save_subdelay" == "true" ]] ; then
rm "$source.subdelay"
echo $subdelay|tee "$source.subdelay" >/dev/null
fi
# Параметры сабов, при необходимости/желании - настроить
subset="-subfont-text-scale 3 -subfont-blur 8 -subfont-outline 8 -subcp enca:$enca_sublang:$subcp -slang $slang -subdelay $subdelay"
# subset="-subcp enca:$enca_sublang:$subcp -slang $slang -ass -ass-force-style Fontsize=25,PrimaryColour=&H00ffffff,BackColour=&H00000000,OutlineColour=&H00000000,Bold=0,Italic=0,BorderStyle=1,Outline=5"
# PlayResX=512,PlayResY=320,Name=Default,Alignment=2,Shadow=0,MarginL=20,MarginR=20,MarginV=15
# По умолчанию - /dev/null, чтоб менкодер не ругался на тему option 'sub' must have a parameter.
subfile="/dev/null"
# Функиция инициализации субтитров (вызов: initsubs)
function initsubs { subsetup=$subset
# Задаём фильтр expand для добавления чёрной полосы внизу изображения под сабы
# Увеличиваем высоту картинки после expand на 10 лишних пикселов
let expand=$outputheight+10
# Рендерим сабы и обрезаем нижние лишние 10 пикселов (сдвигаем сабы на 10 пикселов вниз)
# vf=$vf,expand=$outputwidth:$outputheight:0:0,crop=320:240:0:0
vf=$vf,expand=$outputwidth:$expand:0:0:1,crop=0:$outputheight:0:0
}
# Сохраняем перменную IFS - щна нам ещё пригодится
ifs=$IFS
# И назначаем разделителем \n
IFS='
'
# Перебираем файлы внешних сабов, последний из них будет использоваться
for subfile in `echo "$ID_FILE_SUB_FILENAME"`; do
cecho "Нашёл файл субтитров $subfile" $green
done
# Вот и пригодилась...
IFS=$ifs
if [[ "$subfile" != "/dev/null" || "$1" == "force" ]]; then initsubs; fi
# Если не нашли сабы - проверяем отказываемся от них, иначе - сообщаем, какой файл сабов будет использоваться
if [[ "$subfile" == "/dev/null" ]]; then
if [[ "$ID_SUBTITLE_ID" != "" ]]; then
cecho "Найдена внутренняя дорожка субтитров, использую её!" $green
initsubs
elif [[ "$force_subs" == "true" ]]; then
cecho "Не нашёл субтитры, форсированно обрабатываю их!" $yellow
initsubs
else cecho "Не нашёл субтитры, продолжаю без них!" $yellow
fi
else cecho "Использую файл субтитров $subfile" $yellow
# Задаём sid=10 чтобы форсировать использование внешнего файла сабов при их наличии
subsetup="$subsetup -sid 10"
fi
# С сабами разобрались.
}
# Режимы кодирования
{
# Функция проверки входного fps на валидность, если не валидный (24/30) - принять равным 24 (?). Вызов - check_dirty_fps
function check_dirty_fps { if [[ "$ID_VIDEO_FPS" == "119.880" ]]; then
fps=24
if [[ "$ddfc_disable" != "true" ]]; then
params="$params -fps $fps"
fi
# А вот тут A/V синхронизация как раз и потребуется, без неё падает
params=${params//-mc 0/}
fi
}
# Функция проверки необходимости использования -aid. Вызов - check_aid
function check_aid { if [[ "$aid_disable" == "true" ]]; then
oac=${oac//-aid $aid /}
fi
}
case $mode in
mpeg2 ) # Режим mpeg2
# Настройки кодека видео. Изменить при необходимости
ovc="-of mpeg -ovc lavc -lavcopts vcodec=mpeg2video:vbitrate=$videobitrate:vmax_b_frames=4:vb_strategy=0:brd_scale=3:turbo:trell:qns=3:vpass="
# Настройки фильтров аудио. Изменить при необходимости
af="-af volnorm,resample=44100:0:0"
# Настройки кодека аудио. Изменить при необходимости
oac="-aid $aid -oac lavc -lavcopts acodec=libmp3lame:abitrate=$audioobitrate"
outext="mpg"
params="$params -ofps 25"
check_dirty_fps
check_aid ;;
XviD ) # Режим XviD
# Настройки кодека видео. Изменить при необходимости
ovc="-ffourcc XVID -ovc xvid -xvidencopts trellis:vhq=4:hq_ac:max_bframes=0:bitrate=$videobitrate:turbo:pass="
# Настройки фильтров аудио. Изменить при необходимости
af="-af volnorm,resample=44100:0:0"
# Настройки кодека аудио. Изменить при необходимости
oac="-aid $aid -oac mp3lame -lameopts mode=0:cbr:br=$audioobitrate"
outext="avi"
check_dirty_fps
check_aid ;;
6120 ) # Режим 6120
# Настройки кодека видео. Изменить при необходимости
ovc="-ffourcc XVID -ovc xvid -xvidencopts trellis:vhq=4:hq_ac:bitrate=$videobitrate:turbo:pass="
# Настройки фильтров аудио. Изменить при необходимости
af="-af volnorm,resample=44100:0:0"
# Настройки кодека аудио. Изменить при необходимости
oac="-aid $aid -oac mp3lame -lameopts mode=0:cbr:br=$audioobitrate"
outext="avi"
check_dirty_fps
check_aid ;;
* ) cecho "SHIT HAPPENED!" $blue
esac
}
# Мультисегментная многопоточность
{
if [[ "$unithread" == ":" ]]; then
# Если задан однопоточный режим - считать серединой конец файла
middlepos=$ID_LENGTH
else
# А иначе - середину
middlepos=`echo $ID_LENGTH| awk '{ print $1 / 2 }'`
fi
# Если тестовый режим не задан - определяем границы участков для потоков:
if [[ "$test" != "true" ]]; then
# Для первого - от начала и до середины.
chunk1="-endpos $middlepos "
# Для второго - от середины и до конца.
chunk2="-ss $middlepos "
fi
}
# Свистелки
{
# Функция для показа клмандной строки кодирования (вызов: show firstpass|secondpass)
function show { # Устанавливаем флаг проверки
show=":"
# Сохраняем флаг debug
olddebug=$debug
echo -ne "$yellow"
# И включаем флаг debug в положение echo
debug="echo"
# Вызываем функции кодирования с флагом debug
echo -----------------------------------------
$1 1 "$chunk1"
echo -----------------------------------------
if [[ "$unithread" != ":" ]]; then
$1 2 "$chunk2"
echo -----------------------------------------
fi
# И восстанавливаем флаг debug обратно
debug=$olddebug
unset olddebug
# А также убираем флаг проверки
unset show
tput sgr0
}
# Функция вывода таймстампа (вызов; timestamp)
function timestamp { echo
echo -ne "$yellow"
date
tput sgr0
echo
}
}
# Собственно кодирование
{
# Функция первого прохода (вызов: firstpass номер_части "границы части" [unithread_flag])
function firstpass { $show $3 cecho "Processing pass 1 of part $1!" $green
$debug $3 mencoder -nosound "$source" $params $subsetup -sub "$subfile" $vf $ovc\1 -passlogfile "$out part$1.log" -o /dev/null $2
$show $3 cecho "Pass 1 of part $1 done!" $green
$show $3 timestamp
}
# Функция второго прохода (вызов: secondpass номер_части "границы части" [unithread_flag])
function secondpass { $show $3 cecho "Processing pass 2 of part $1!" $green
$debug $3 mencoder "$source" $params $subsetup -sub "$subfile" $af $oac $vf $ovc\2 -passlogfile "$out part$1.log" -o "$out part$1.$outext" $2
$show $3 cecho "Pass 2 of part $1 done!" $green
$show $3 timestamp
}
# Показываем команды кодирования частей
cecho "First pass:" $green
show firstpass
cecho "Second pass:" $green
show secondpass
# И начинаем процесс
timestamp
# sleep 2 - во избежание состояния гонки при выводе сообщений
(firstpass 1 "$chunk1"; secondpass 1 "$chunk1") & (sleep 2; firstpass 2 "$chunk2" $unithread; secondpass 2 "$chunk2" $unithread)
# Хорошо бы дождаться завершения обоих частей прежде чем склеивать их...
wait
}
# Постобработка
{
# Если задан флаг debug - дальше нам делать нечего...
if [[ "$debug" == ":" ]]; then
exit 1
fi
# Если не задан однопоточный режим - надо бы по быстрому слепить оба куска и прибраться за собой пока никто не видит...
if [[ "$unithread" != ":" ]]; then
cecho "$file Joining" $green
time mencoder "$out part1.$outext" "$out part2.$outext" -oac copy -ovc copy -o "$out.$outext" $quiet
rm "$out part1.$outext" "$out part2.$outext" "$out part1.log" "$out part2.log"
else
# А иначе - просто переименовать первый кусок в выходной файл и прибраться.
mv "$out part1.$outext" "$out.$outext"
rm "$out part1.log"
fi
# Просмотр после кодирования
if [[ "$play" == "true" ]]; then
mplayer "$out.$outext"
fi
# Проверка на необходимость копирования готовых файлов и отсутствие необходимости перемещения
if [[ "$copy_flag" == "true" && "$move_files" != "true" ]]; then
cecho "Копирую $out.$outext в $copy_path" $green
# И если надо - запускаем копирование в фоновом режиме
cp "$out.$outext" "$copy_path" &
# Проверка на необходимость перемещения готовых файлов
elif [[ "$copy_flag" == "true" && "$move_files" == "true" ]]; then
cecho "Перемещаю $out.$outext в $copy_path" $green
# И если надо - запускаем пермещение в фоновом режиме
mv "$out.$outext" "$copy_path"&
fi
}[/code][/spoiler]
_________________
Сеть не должна пересекаться с настоящим миром... Эксперименты Лэйн, уровень 02, 20.10