#!/bin/bash
# скрипт для декодирования видео-файлов как самостоятельно так и составе в dlna-сервера
#
# формат вызова:
# # transcoder ВХОДНОЙ_ФАЙЛ ВЫХОДНОЙ_ФАЙЛ
#
# авт. Никишин С.В. 27.12.2010 г.
# в ред. от 31.01.2011
INPUT="$1"
OUTPUT="$2"
MYNAME=${0##*/}
ROOT_DIR=/mediatomb
TMP_DIR=/tmp
FILE_NAME=$(basename "$INPUT")
EXT=${INPUT##*.}
VIERA_ASPECT="16/9"
TV_VIERA_CROP="9/16"
#TV_VIERA_CROP="7/8"
THREADS="4"
NAME_FUNCTION=transcode_$EXT
TRANSCODER_OPTIONS=""
LOG_DIR=""
LOG_FILE=""
function create_log_file() { # создание папки для логов и лог-файла скрипта
#echo "Script = $MYNAME; current user = $USER; input file = $INPUT; output file = $OUTPUT. Starting... " > "$LOG_FILE"
# создание папки для хранения логов
LOG_DIR=$TMP_DIR/$FILE_NAME
if [ ! -d "$LOG_DIR" ]; then
mkdir "$LOG_DIR"
chmod 777 "$LOG_DIR"
else
rm -f "$LOG_DIR"/*
fi
if [ "$USER" = "" ]; then # если пользователя нет
# if [ ! -d $HOME ]; then # если пользователя нет
USER="mediatomb"
HOME="/var/lib/$USER"
#HOME=/var/lib/$USER
fi
LOG_FILE="$LOG_DIR/$MYNAME:$USER.log"
if [ -a "$INPUT" ]; then
status_file_input="exist"
else
status_file_input="not found"
fi
# создание файла для записи лога скрипта
cat - >"$LOG_FILE" <<EOF
script name : $MYNAME
full name input file : $INPUT
file status : $status_file_input
base name input file : ${FILE_NAME}
extention input file : ${INPUT##*.}
full name output file : $OUTPUT
name current user : $USER
home directory : $HOME
log files : $LOG_FILE
EOF
}
function check_runprg() { # проверка работы программы в текущем профиле
# передаваемые параметры
# $1 - имя проверяемой программы
echo "check_runprg() starting" >> "$LOG_FILE"
NAMEPRG=$1
echo " found running program <$NAMEPRG>" >> "$LOG_FILE"
if ! [ $(ps -u mediatomb | grep $NAMEPRG | wc -l) -eq 0 ]; then
echo " program found : killing..." >> "$LOG_FILE"
killall -9 $NAMEPRG
sleep 2
check_runprg $NAMEPRG
#echo " check run $NAMEPRG after command killall: $(ps -u mediatomb | grep $NAMEPRG)" >> "$LOG_FILE"
#exit
else
echo " program not found" >> "$LOG_FILE"
fi
}
function download_file() {
echo "Function = download_file; file name = ${FILE_NAME}. Starting..." >> "$LOG_FILE"
SOURCE_DIR=$ROOT_DIR/trailers.apple.com/thumbnail
SOURCE_FILE=$SOURCE_DIR/$FILE_NAME
WGET_LOG=$LOG_DIR/wget-$FILE_NAME.log
WGET_LIST=$SOURCE_DIR/trailers.list
cd $SOURCE_DIR
#killall -9 wget
if [ -a "$SOURCE_FILE" ]; then
#echo "File $SOURCE_FILE found. Continue downloads..." >> "$LOG_FILE"
#wget -b -c -U QuickTime/7.6.2 "$INPUT" -O $SOURCE_FILE >> "$LOG_FILE"
#wget -b -U QuickTime/7.6.2 "$INPUT" -O $SOURCE_FILE -o "$WGET_LOG" -c
#else
#echo "File $SOURCE_FILE not found. New downloads..." >> "$LOG_FILE"
#wget -b -U QuickTime/7.6.2 "$INPUT" -O $SOURCE_FILE >> "$LOG_FILE"
#wget -b -U QuickTime/7.6.2 "$INPUT" >> "$LOG_FILE"
rm $SOURCE_FILE
fi
echo "$INPUT" >> "$WGET_LIST"
# ! wget -U QuickTime/7.6.2 "$INPUT" -i ./thumbnail/trailers.list -c
# wget -b -U QuickTime/7.6.2 "$INPUT" -O $SOURCE_FILE -o "$WGET_LOG" >> "$LOG_FILE"
# echo "$WGETRC" >> "$LOG_FILE"
## cat $WGETRC >> "$LOG_FILE"
# echo "$INPUT $SOURCE_FILE" >> "$LOG_FILE"
wget "$INPUT" -O $SOURCE_FILE >> "$LOG_FILE"
INPUT=$SOURCE_FILE
# echo "sleep" >> "$LOG_FILE"
# sleep 30
# check_runprg wget
}
function WH_fixed { # установка фиксированных разрешений выходного сигнала
case "$EXT" in
flv) w=800; h=600; ;;
mp4) w=800; h=600; ;;
mtvg) w=800; h=600; ;;
m2ts) w=1920; h=1050; ;;
*) w=720; h=576; ;; # параметры для файлов с неизвестным расширением
esac
echo "Funtion = WH_fixed. Extention = $EXT. W = $w. H = $h" >> "$LOG_FILE"
#wn=$(( $h * 1920 / 1050 ))
}
function WH_avinfo { # установка разрешений выходного сигнала на основе программы aviinfo
if [ -x /usr/bin/avinfo ]; then
SCALE_INPUT=$(avinfo "$INPUT" | grep video) # получение информации об видео-файле
else
WH_fixed
fi
if [ "$SCALE_INPUT" == "" ]; then # если информации от файла не получено
WH_fixed
else # если "файл сообщил" размеры картинки, то их и устанавливаем
echo "ready format from avinfo" >> $LOG_FILE
w=$(echo $SCALE_INPUT | awk -F "x" '{print $1}' | awk -F ":" '{print $2}' | awk -F " " '{if(NF<2) print $1; else print $2}')
h=$(echo $SCALE_INPUT | awk -F "x" '{print $2}' | awk -F " " '{print $1}')
fi
}
function WH_mediainfo { # установка разрешений выходного сигнала на основе программы mediainfo
if [ -x /usr/bin/mediainfo ]; then
echo "ready format from mediainfo" >> $LOG_FILE
w=$(mediainfo "$INPUT" | grep "Width" | awk -F " " '{print $3}')
h=$(mediainfo "$INPUT" | grep "Height" | awk -F " " '{print $3}')
else
WH_avinfo
fi
}
#
# Блок функций транскодеров
#
function transcode_vlc { # функция декодирования фалов программой VLC
echo "Function = transcode_vlc; file input = $INPUT. Starting..." >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
#LOG_VLC=$LOG_DIR/transcode_vlc.log
#touch $LOG_VLC
#chmod 777 $LOG_VLC
#arguments="#transcode{venc=ffmpeg,vcodec=mp2v,vb=4096,fps=25,aenc=ffmpeg,acodec=mpga,ab=192,samplerate=44100,channels=2}:standard{access=file,mux=ps,dst=$OUTPUT}"
killall -9 vlc
sleep 3
/usr/bin/vlc -I dummy "$INPUT" --logfile="$LOG_FILE" --log-verbose=3 --file-logging\
--sout "#transcode{venc=ffmpeg,vcodec=mp2v,vb=4096,fps=25,aenc=ffmpeg,acodec=mpga,ab=192,samplerate=44100,channels=2,threads=3}:standard{access=file,mux=ps,dst=$OUTPUT} vlc:quit"
# --sout "#transcode{venc=ffmpeg,vcodec=mp2v,vb=4096,fps=25,aenc=ffmpeg,acodec=mpga,ab=192,samplerate=44100,channels=2,threads=1}:standard{access=file,mux=ps,dst=$OUTPUT} vlc:quit"
#vlc -I dummy "$INPUT" --logfile=/tmp/vlc.log --log-verbose=3 --file-logging --sout "#transcode{venc=ffmpeg,vcodec=mp2v,vb=2048,fps=25,aenc=ffmpeg,acodec=mpga,ab=48,samplerate=44100,channels=2}:standard{access=file,mux=ps,dst=$OUTPUT} vlc:quit"
#vlc -I dummy "$INPUT" --sout-standard-dst=$OUTPUT
#vlc $INPUT\
# --intf dummy\
# --sout-transcode-venc ffmpeg\
# --sout-transcode-vcodec mp2v\
# --sout-transcode-vb 4096\
# --sout-transcode-fps 25\
# --swscale-mode 2
# --sout-transcode-aenc ffmpeg\
# --sout-transcode-acodec mpga\
# --sout-transcode-ab 192\
# --sout-transcode-channels 2\
# --sout-transcode-samplerate 44100\
# --sout-standard-access file\
# --sout-standard-mux ps\
# --sout-standard-dst $OUTPUT\
# --daemon\
# --logfile /tmp/vlc.log\
# --log-verbose 1\
# --file-logging\
# vlc://quit
# --dummy-quiet
# --dummy-save-es\
# --sout-transcode-alang ru\
# exec 6>&1
# exec > $OUTPUT
# vlc $INPUT
# exec 1>&6 6>&-
}
function transcode_mencoder() { # функция декодирования программой MENCODER
# передаваемые параметры
# $1 - профиль трансокдирования совпадающий с раширением файла
echo "transcode_mencoder() starting" >> "$LOG_FILE"
TRANSCODER="mencoder"
LOG_TRANSCODER="$LOG_DIR/$TRANSCODER:$USER.log"
check_runprg $TRANSCODER
create_mencoder_conf $1
/usr/bin/mencoder $TRANSCODER_OPTIONS "$INPUT" >"$LOG_TRANSCODER"
}
function create_mencoder_conf() { # функция создания конфигурации запуска MENCODER
echo "create_mencoder_conf() starting" >> "$LOG_FILE"
echo " параметр функции : <$1>" >> "$LOG_FILE"
case $1 in # создание профилей декодирования по кодовому слову (расширению файла)
mkv)
TRANSCODER_OPTIONS="\
-aid 4352 \
-alang ru \
-channels 2 \
-vf expand=:::::$VIERA_ASPECT,scale,spp=7,harddup \
-af lavcresample=48000,volnorm,extrastereo \
-srate 48000 \
-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=25000:vbitrate=15000:keyint=15:vstrict=0:acodec=ac3:abitrate=384:autoaspect=yes:threads=3 \
-oac lavc \
-ovc lavc \
-of mpeg \
-mpegopts format=dvd:tsaf \
-ofps 24 \
-o $OUTPUT \
-msglevel all=5 \
" ;;
wmv)
TRANSCODER_OPTIONS="\
-vf expand=:::::4/3,scale,spp=6,harddup \
-af lavcresample=48000,hrtf,volnorm \
-srate 48000 \
-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=192:autoaspect=yes:threads=3 \
-demuxer lavf \
-lavfdopts probesize=128
-oac lavc \
-ovc lavc \
-of mpeg \
-mpegopts format=dvd:tsaf \
-aid 4352 \
-alang ru \
-ofps 24 \
-o $OUTPUT \
-msglevel all=5 \
" ;;
flv)
TRANSCODER_OPTIONS="\
-aid 4352 \
-alang ru \
-channels 2 \
-vf expand=:::::$VIERA_ASPECT,scale,spp=7,harddup \
-af lavcresample=48000,volnorm -srate 48000 \
-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=256:autoaspect=yes:threads=3 \
-oac lavc \
-ovc lavc \
-of mpeg \
-mpegopts format=dvd:tsaf \
-ofps 24 \
-o $OUTPUT \
-msglevel all=5 \
" ;;
mp4)
TRANSCODER_OPTIONS="\
-oac lavc \
-ovc lavc \
-of mpeg \
-mpegopts format=dvd:tsaf \
-aid 4352 \
-alang ru \
-vf expand=:::::$VIERA_ASPECT,scale,spp=7,harddup \
-af lavcresample=48000,volnorm -srate 48000 \
-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=256:autoaspect=yes:threads=3 \
-ofps 24 \
-o $OUTPUT \
-msglevel all=5 \
" ;;
slide)
TRANSCODER_OPTIONS="\
-mf w=1600:h=1200:fps=1/3:type=jpg \
-ovc lavc \
-lavcopts vcodec=mjpeg \
-o $OUTPUT \
-msglevel all=5 \
" ;;
#-oac copy \
#-lavcopts vcodec=mjpeg::mbd=2:trell \
#-sws 10 \
mov)
TRANSCODER_OPTIONS="\
-aid 4352 \
-alang ru \
-channels 2 \
-vf expand=:::::$VIERA_ASPECT,scale,spp=7,harddup \
-af lavcresample=48000,volnorm,extrastereo \
-srate 48000 \
-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=10000:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=192:autoaspect=yes:threads=3 \
-oac lavc \
-ovc lavc \
-of mpeg \
-mpegopts format=dvd:tsaf \
-ofps 24 \
-o $OUTPUT \
-msglevel all=5 \
" ;;
m4v)
TRANSCODER_OPTIONS="\
-aid 4352 \
-alang ru \
-channels 2 \
-vf expand=:::::$VIERA_ASPECT,scale,spp=7,harddup \
-af lavcresample=48000,volnorm,extrastereo \
-srate 48000 \
-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=10000:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=192:autoaspect=yes:threads=3 \
-oac lavc \
-ovc lavc \
-of mpeg \
-mpegopts format=dvd:tsaf \
-ofps 24 \
-o $OUTPUT \
-msglevel all=5 \
" ;;
ts)
# опции при кодировании из интернет в поток mencoder не работают !
TRANSCODER_OPTIONS="\
-aid 4352 \
-alang ru \
-channels 2 \
-vf expand=:::::$VIERA_ASPECT,scale,spp=7,harddup \
-af lavcresample=48000,volnorm,extrastereo \
-srate 48000 \
-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=256:autoaspect=yes:threads=3 \
-oac lavc \
-ovc lavc \
-of mpeg \
-mpegopts format=dvd:tsaf \
-ofps 25 \
-o $OUTPUT \
-msglevel all=5 \
" ;;
asf)
TRANSCODER_OPTIONS="\
-aid 4352 \
-alang ru \
-channels 2 \
-cache 10240 \
-cache-min 5 \
-vf expand=:::::$VIERA_ASPECT,scale,spp=7,harddup \
-af lavcresample=48000,volnorm,extrastereo \
-srate 48000 \
-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=25000:vbitrate=15000:keyint=15:vstrict=0:acodec=ac3:abitrate=256:autoaspect=yes:threads=3 \
-oac lavc \
-ovc lavc \
-of mpeg \
-mpegopts format=dvd:tsaf \
-ofps 25 \
-o $OUTPUT \
-msglevel all=5 \
" ;;
*)
#NAME_FILE_CONFIG="$HOME/.mplayer/mencoder.conf"
NAME_FILE_CONFIG="$MYHOME/.mplayer/mencoder.conf"
HOME=/var/lib/mediatomb
echo " NAME_FILE_CONFIG = $NAME_FILE_CONFIG" >> "$LOG_FILE"
echo " HOME = $HOME" >> "$LOG_FILE"
# для получения информации о параметрах файла конфигурации mencoder.conf смотри статью http://itkare.ru/Mencoder.conf
HEAD_MENCODER_CONF="файл конфигурации Mencoder для файла $INPUT"
cat - >"$NAME_FILE_CONFIG" <<EOF
# $HEAD_MENCODER_CONF
vf=expand=:::::$VIERA_ASPECT,scale,spp=5,harddup
af=lavcresample=48000,volnorm
srate=48000
lavcopts=vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=96:autoaspect=yes:threads=3
oac=lavc=yes
ovc=lavc=yes
of=mpeg=yes
mpegopts=format=dvd:tsaf=yes
aid=4352
alang=ru
ofps=24
o=$OUTPUT
msglevel=all=5
EOF
echo " Неверное обращение к функции - отсутствует параметр $1. Присвоены параметры по умолчанию." >> "$LOG_FILE"
mencoder_VIDEO_FILTERS="-vf expand=:::::$VIERA_ASPECT,scale,spp=6,harddup"
mencoder_AUDIO_FILTERS="-af lavcresample=48000,volnorm -srate 48000"
mencoder_LAVC_OPTIONS="-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=224:autoaspect=yes:threads=$THREADS"
#exit 1
;;
esac
}
function transcode_ffmpeg() { # функция декодирования программой FFMPEG
# передаваемые параметры
# $1 - профиль трансокдирования совпадающий с раширением файла
echo "transcode_ffmpeg() starting" >> "$LOG_FILE"
TRANSCODER="ffmpeg"
LOG_TRANSCODER="$LOG_DIR/$TRANSCODER:$USER.log"
check_runprg $TRANSCODER
create_ffmpeg_conf $1
/usr/bin/ffmpeg $TRANSCODER_OPTIONS "$OUTPUT" 2> "$LOG_TRANSCODER"
#/usr/bin/ffmpeg -threads 3 -aspect 16:9 -vf "scale=1920:-1" -i "$INPUT" $arguments -r 25 -target dvd $DEBUG_LEVEL "$OUTPUT" 2> "$LOG_TRANSCODER"
#ffmpeg -i "$INPUT" -max_delay 500000 -f avi -y "$OUTPUT"
}
function create_ffmpeg_conf() { # функция создания конфигурации запуска FFMPEG
# передаваемые параметры
# $1 - профиль трансокдирования совпадающий с раширением файла
echo "create_ffmpeg_conf() starting" >> "$LOG_FILE"
echo " параметр функции : <$1>" >> "$LOG_FILE"
case $1 in # создание профилей декодирования по кодовому слову (расширению файла)
mkv)
TRANSCODER_OPTIONS="\
-threads 3 \
-aspect 16:9 \
-vf "scale=1920:-1" \
-i "$INPUT" \
-r 25 \
-target dvd \
-loglevel debug \
" ;;
ts)
TRANSCODER_OPTIONS="\
-threads 3 \
-i "$INPUT" \
-vf "crop=in_w:$TV_VIERA_CROP*in_h,scale=1920:-1" \
-muxpreload 5 \
-muxdelay 10 \
-r 25 \
-target dvd \
-ac 2 \
-loglevel debug \
-y \
" ;;
#-aspect 16:9 \
#-vf "scale=1920:-1; cropdetect" \
#-vf "cropdetect=16:9" \
#crop=2/3*in_w:2/3*in_h" \
*)
echo " Неверное обращение к функции - отсутствует или неправильный параметр <$1>. Присвоены параметры по умолчанию." >> "$LOG_FILE"
TRANSCODER_OPTIONS="\
-threads 3 \
-aspect 16:9 \
-vf "scale=1920:-1" \
-i "$INPUT" \
-r 25 \
-target dvd \
-loglevel debug \
-y \
"
# -loglevel verbose
# -max_delay 500000
# -f avi -y "$OUTPUT"
;;
esac
}
function transcode_null() { # функция отсуствия декодирования файлов
echo "Function = transcode_null; file input = $INPUT; file output = $OUTPUT. Starting..." >> "$LOG_FILE"
cp "$INPUT" "$OUTPUT"
}
#
# Блок функций выбора кодировщиков для зарегистрированных расширений
#
transcode_mkv() { # функция декодирования файлов mkv
echo "transcode_mkv() starting" >> "$LOG_FILE"
transcode_mencoder mkv
# transcode_ffmpeg
}
transcode_wmv() { # функция декодирования файлов wmv
echo "Function = transcode_wmv. Extention = ${INPUT##*.}. Starting..." >> "$LOG_FILE"
transcode_mencoder wmv
#transcode_ffmpeg
#transcode_vlc
}
transcode_flv() {
echo "Function = transcode_flv; extention = ${INPUT##*.}. Starting..." >> "$LOG_FILE"
transcode_mencoder flv
#arguments=""
#transcode_ffmpeg
}
transcode_mp4() {
echo "Function = transcode_mp4; extention = ${INPUT##*.}. Starting..." >> "$LOG_FILE"
transcode_mencoder mp4
#transcode_ffmpeg
}
transcode_avi() {
echo "Function = transcode_avi; extention = ${INPUT##*.}. Starting... " >> "$LOG_FILE"
arguments=""
#transcode_ffmpeg
#transcode_null
transcode_vlc
#VIDEO_FILTERS="-vf expand=:::::16/9,scale,spp=6,harddup"
#AUDIO_FILTERS="-af lavcresample=48000,volnorm -srate 48000"
#LAVC_OPTIONS="-lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=224:autoaspect=yes:threads=4"
#arguments="-oac lavc -ovc lavc -of mpeg -mpegopts format=dvd:tsaf -aid 4352 -alang ru $VIDEO_FILTERS $AUDIO_FILTERS $LAVC_OPTIONS -ofps 25 -o $OUTPUT"
#transcode_mencoder
}
transcode_ts() { # транскодирование видео-потока интернет-телевидения
echo "transcode_ts()" >> "$LOG_FILE"
#INPUT="http://youlike.video37.ru:2103/video/$FILE_NAME";
INPUT=$(cat "$INPUT");
echo " read video stream (replace input file name) from $INPUT" >> "$LOG_FILE"
# transcode_mencoder ts
transcode_ffmpeg ts
# TRANSCODER="ffmpeg"
# LOG_TRANSCODER="$LOG_DIR/$TRANSCODER:$USER.log"
# check_runprg $TRANSCODER
# /usr/bin/ffmpeg -i "$INPUT" -threads 3 -target dvd -r 25 -y "$OUTPUT" 2> "$LOG_TRANSCODER"
#wget "$INPUT" -o "$WGET_LOG" -O - | ffmpeg -i pipe:0 -r 25 -target dvd "$OUTPUT" 2> "$LOG_TRANSCODER"
#wget "$INPUT" -o $WGET_LOG -O - | ffmpeg -i - -f avi -y "$OUTPUT"
}
transcode_mov() { # транскодирование видео файлов mov
# с поддержкой воспроизведения их из интернет (с trailers.apple.com)
echo "transcode_mov() starting" >> "$LOG_FILE"
if [ $(echo "$INPUT" | awk -F ":" '{print $1}') = "http" ]; then # если входящий файл находится в интернет
TRANSCODER="mencoder"
LOG_TRANSCODER="$LOG_DIR/$TRANSCODER:$USER.log"
check_runprg $TRANSCODER; # удаление зависших версий $TRANSCODER
create_mencoder_conf mov
DOWNLOADER="wget"
WGET_LOG=$LOG_DIR/$DOWNLOADER:$USER.log
check_runprg $DOWNLOADER; # удаление зависших версий $DOWNLOADER
sleep 1
# загружаем поток из интернет в STDOUT и создаём канал для его декодирования
$DOWNLOADER -U QuickTime/7.6.2 "$INPUT" -o $WGET_LOG -O - | $TRANSCODER $TRANSCODER_OPTIONS - >"$LOG_TRANSCODER"
else
transcode_mencoder mov
#$TRANSCODER $arguments "$INPUT" > "$LOG_TRANSCODER"
fi
}
transcode_m4v() { # транскодирование видео файлов m4v
# с поддержкой воспроизведения их из интернет (с trailers.apple.com)
echo "transcode_m4v() starting" >> "$LOG_FILE"
if [ $(echo "$INPUT" | awk -F ":" '{print $1}') = "http" ]; then # если входящий файл находится в интернет
TRANSCODER="mencoder"
LOG_TRANSCODER="$LOG_DIR/$TRANSCODER:$USER.log"
check_runprg $TRANSCODER; # удаление зависших версий $TRANSCODER
create_mencoder_conf m4v
DOWNLOADER="wget"
WGET_LOG=$LOG_DIR/$DOWNLOADER:$USER.log
check_runprg $DOWNLOADER; # удаление зависших версий $DOWNLOADER
sleep 1
# загружаем поток из интернет в STDOUT и создаём канал для его декодирования
$DOWNLOADER -U QuickTime/7.6.2 "$INPUT" -o $WGET_LOG -O - | $TRANSCODER $TRANSCODER_OPTIONS - >"$LOG_TRANSCODER"
else
transcode_mencoder m4v
fi
}
transcode_asf() {
echo "transcode_asf() starting..." >> "$LOG_FILE"
transcode_mencoder asf
#transcode_ffmpeg
}
transcode_wav() {
local input="$1"
local output="$2"
ffmpeg -i "$input" -f wav -y "$output"
}
transcode_dvd() {
local input="$1"
local output="$2"
ffmpeg -i "$input" -target dvd -y "$output"
}
transcode_matroska() { # Function to transcode matroska files to dvd compatible format
local input="$1"
local output="$2"
local alang="$3"
local slang="$4"
# Default to english if languages are not set
[ "$alang" ] || alang="eng"
[ "$slang" ] || slang="eng"
# Use mencoder if available, else fall back to using ffmpeg.
# Transcoding using ffmpeg will not include subtitles.
if which mencoder >/dev/null 2>&1; then
mencoder "$input" -oac lavc -ovc lavc -of mpeg -mc 0 -noskip \
-lavcopts vcodec=mpeg2video:vbitrate=6000:acodec=ac3:abitrate=448 \
-vf harddup -alang "$alang" \
-slang "$slang" -font 'Bitstream Vera Sans' \
-o "$output"
else
ffmpeg -alang "$alang" -slang "$slang" -i "$input" -target dvd \
-y "$output"
fi
}
transcode_mp3() { # транскодирование аудио файлов mp3
echo "Function = transcode_mp3; extention = ${INPUT##*.}. Starting..." >> "$LOG_FILE"
TRANSCODER="mencoder"
echo "file input = $INPUT, file input = $OUTPUT" >> "$LOG_FILE"
check_runprg $TRANSCODER
LOG_TRANSCODER="$LOG_DIR/$TRANSCODER:$USER.log"
DEBUG_LEVEL="-msglevel all=5"
PATCH_MP3=$(dirname "$INPUT" | sed "s/ /\\\ /g")
NAME_MP3=$(basename "$INPUT")
arguments="-mf w=1600:h=1200:fps=1/3:type=jpg -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o $OUTPUT $DEBUG_LEVEL"
/usr/bin/mencoder "mf://$PATCH_MP3/*jpg" $arguments -audiofile "$INPUT"
}
transcode_slide() {
echo "Function = transcode_slide; extention = ${INPUT##*.}. Starting..." >> "$LOG_FILE"
DIR_SLIDE=$(dirname "$INPUT" | sed "s/ /\\\ /g" | sed "s/)/\\\)/g" | sed "s/(/\\\(/g")
NAME_FILE=$(basename "$INPUT")
NAME_MP3=$(cat "$INPUT")
#INPUT="mf://$DIR_SLIDE/*[jJ][pP][gG]"
INPUT="mf://*.JPG"
#INPUT="mf://@$INPUT"
cd $LOG_DIR
echo "$DIR_SLIDE"
sleep 3
cd "$DIR_SLIDE"
ls *.[jJ][pP][gG] > $LOG_DIR/spisok
#ls "$DIR_SLIDE/*.[jJ][pP][gG]" > $LOG_DIR/spisok
#cat $LOG_DIR/spisok
#sleep 3
for file in $LOG_DIR/spisok; do
convert "$file" -resize "1600x1200" - | convert -background "#000000" - -extent "1600x1200" "$(basename '$file').JPG"
#convert $f -geometry 640x480> -quality 90% thumbs/${f%%JPG}
done
# transcode_mencoder slide
#transcode_ffmpeg
}
transcode_scr() {
echo "transcode_scr() starting" >> "$LOG_FILE"
TRANSCODER="ffmpeg"
#ffmpeg -f x11grab -r 25 -s wxga -i :0.0 $OUTPUT
LOG_TRANSCODER="$LOG_DIR/$TRANSCODER:$USER.log"
#echo "" >> "$LOG_FILE"
#LOG_FFMPEG=$LOG_DIR/transcode_ffmpeg.log
#touch $LOG_FFMPEG
#chmod 777 $LOG_FFMPEG
#killall -9 ffmpeg
#sleep 2
#/usr/bin/ffmpeg -f x11grab -i :0.0 -r 25 -s wxga -target dvd -loglevel debug "$OUTPUT" 2> "$LOG_TRANSCODER"
ffmpeg -f x11grab -i localhost:0.0 -r 25 -s wxga -loglevel debug "$OUTPUT" 2> "$LOG_TRANSCODER"
#ffmpeg -i "$INPUT" -max_delay 500000 -f avi -y "$OUTPUT"
}
#
# Старт скрипта
#
create_log_file
if type $NAME_FUNCTION >/dev/null 2>&1; then # если функция (расширение) в скрипте зарегистрировано
#echo exist
${NAME_FUNCTION} # запускаем именно её
else
#echo no
transcode_vlc # иначе запускаем транскодер по умолчанию
fi
echo "script $MYNAME exit. " >> "$LOG_FILE"
exit 0
case "$EXT" in
flv) transcode_flv; ;;
mkv) transcode_mkv; ;;
wmv) transcode_wmv; ;;
avi) transcode_avi; ;;
mp3) transcode_mp3; ;;
slide) transcode_slide; ;;
mp4) transcode_mp4; ;;
avit) transcode_mkv; ;;
ts) transcode_ts; ;;
scr) transcode_scr; ;;
m2ts) transcode_mkv; ;;
mov) transcode_mov; ;;
m4v) transcode_m4v; ;;
asf) transcode_asf; ;;
#*) transcode_null; ;;
*) transcode_vlc; ;;
esac
exit 0
# пример разбора параметров кмонадной строки
USAGE="
This script is used by MediaTomb for transcoding support. It can also serve as
a script to transcode various files in a format suitable for streaming directly.
Synopsis:
transcoder [TRANSCODE FUNCTION OPTION] [GENERIC OPTIONS]
Generic Options:
-h, --help Display this help message.
-i, --input Input file that is meant to be transcoded.
-o, --output Output file that will be read back by MediaTomb.
--audio-lang Specify ISO 639 language code to use for audio.
--subtitle-lang Specify ISO 639 language code to use for subtitles.
Transcode Function Options (one is required):
--video-common Perform generic video transcoding.
--audio-common Perform generic audio transcoding.
--transcode-matroska Used in transcoding matroska files.
"
while [ "$#" -gt "0" ]
do
case "$1" in
-i|--input)
INPUT="$2"
shift; shift;
;;
-o|--output)
OUTPUT="$2"
shift; shift;
;;
--video-common)
USE_VIDEO_COMMON=1
shift
;;
--audio-common)
USE_AUDIO_COMMON=1
shift
;;
--transcode-matroska)
USE_TRANSCODE_MATROSKA=1
shift
;;
--audio-lang)
ALANG="$2"
shift; shift;
;;
--subtitle-lang)
SLANG="$2"
shift; shift;
;;
-h|--help|*)
echo "${USAGE}"
exit 1
;;
esac
done
# Perform specified function
if [ $USE_VIDEO_COMMON ]; then
video_common "$INPUT" "$OUTPUT"
elif [ $USE_AUDIO_COMMON ]; then
audio_common "$INPUT" "$OUTPUT"
elif [ $USE_TRANSCODE_MATROSKA ]; then
transcode_matroska "$INPUT" "$OUTPUT" "$ALANG" "$SLANG"
else
# Must specify one transcoding function
echo "${USAGE}"
exit 1
fi