#!/bin/bash # скрипт для декодирования медиа-файлов как самостоятельно так и составе dlna-сервера # # формат вызова: # transcoder ВХОДНОЙ_ФАЙЛ ВЫХОДНОЙ_ФАЙЛ # # авт. Никишин С.В. 27.12.2010 г. # в ред. от 31.01.2011, 02.10.2011 INPUT="$1"; # входной файл OUTPUT="$2"; # выходной файл SCRIPT_NAME=${0##*/}; # имя скрипта ROOT_DIR=/mediatomb TMP_DIR=/tmp FILE_NAME=$(basename "$INPUT"); EXT=${INPUT##*.} VIERA_ASPECT="16/9"; # соотношение сторон телевизора VIERA TV_VIERA_CROP="9/16" #TV_VIERA_CROP="7/8" THREADS="3"; # количество потоков по умолчанию NAME_FUNCTION=transcode_$EXT TRANSCODER_OPTIONS="" LOG_DIR="" LOG_FILE="" # # Блок общих функций # function create_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" # то считаем что это mediatomb HOME="/var/lib/$USER" #HOME=/var/lib/$USER fi LOG_FILE="$LOG_DIR/$SCRIPT_NAME:$USER.log" if [ -a "$INPUT" ]; then status_file_input="существует" else status_file_input="не найден" fi # создание файла для записи лога скрипта cat - >"$LOG_FILE" <> "$LOG_FILE" # out_str=$(echo -e "\t\t\t\t\t: $STRING2\r$STRING1") # echo "$out_str" >> "$LOG_FILE" cat - >>"$LOG_FILE" <" if ! [ $(ps -u mediatomb | grep $NAMEPRG | wc -l) -eq 0 ]; then echof ${FUNCNAME} " программа <$NAMEPRG> найдена, удаляю" #killall -9 $NAMEPRG sudo -u root killall -9 $NAMEPRG; # пользователь должен иметь права на выполнение комнады в SUDO sleep 2 check_runprg $NAMEPRG #echo " check run $NAMEPRG after command killall: $(ps -u mediatomb | grep $NAMEPRG)" >> "$LOG_FILE" #exit else echof ${FUNCNAME} " программа <$NAMEPRG> среди выполняемых не найдена" 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 echof "transcode_vlc()" "выполняется" 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 # передаваемые параметры local profile=$1; # профиль трансокдирования совпадающий с раширением файла local name_transcoder="mencoder"; # имя программы-транскодера local transcoder="/usr/bin/$name_transcoder"; # оно же с путём if ! test -x ${transcoder}; then echof ${FUNCNAME} "программа декодер <$transcoder> не найдена. Работа скрипта прерывается" exit 1 else echof ${FUNCNAME} "программа декодер <$transcoder> найдена. Подготовка транскодирования" fi LOG_TRANSCODER="$LOG_DIR/$name_transcoder:$USER.log" check_runprg $name_transcoder create_mencoder_conf $profile $transcoder $TRANSCODER_OPTIONS "$INPUT" >"$LOG_TRANSCODER" } function create_mencoder_conf() { # функция создания конфигурации запуска MENCODER # передаваемые параметры local profile=$1; # профиль трансокдирования совпадающий с раширением файла # установка переменных-опций ПО УМОЛЧАНИЮ local aid="-aid 4352"; # выбор (русского) аудио канала local alang="-alang ru"; # выбор языка ru-русский local channels="-channels 2"; # количество каналов аудио на выходе, 2 - стерео local ofps="-ofps 24"; # установка частоты кадров для выходного файла local output="-o $OUTPUT"; # выводить результат в указанный файл. local msglevel="-msglevel all=5"; # установка подробности вывода отладочной информации (статусные сообщения) local lavcresample="-af lavcresample=48000,volnorm,extrastereo"; # установка цепочки аудио фильтров local srate="-srate 48000"; # установка используемой выходной частоты сэмплов (частоты дискретизации) local oac="-oac lavc"; # кодировать аудио libavcodec кодеком local ovc="-ovc lavc"; # кодировать видео libavcodec кодеком local of="-of mpeg"; # кодировать в указанный формат local mpegopts="-mpegopts format=dvd:tsaf"; # выбор типа MPEG потоков # подробное описание опций смотри http://gw-home/sysadmin/index.php/Mencoder.conf # local options_default="$aid $alang $channels $ofps $msglevel $output $lavcresample $srate $oac $ovc $of $mpegopts" echof ${FUNCNAME} "выбор опций транскодирования для профиля <$profile>" case $profile in # создание профилей декодирования по кодовому слову (расширению файла) mkv) TRANSCODER_OPTIONS="$aid $alang $channels $ofps $msglevel $output $lavcresample $srate $oac $ovc $of $mpegopts \ -vf expand=:::::$VIERA_ASPECT,spp=6,harddup \ -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=384:autoaspect=yes:threads=8 \ " ;; #-vf expand=:::::$VIERA_ASPECT,spp=6,harddup,scale=768:-3 \ m2ts) TRANSCODER_OPTIONS="$aid $alang $channels $ofps $msglevel $output $lavcresample $srate $oac $ovc $of $mpegopts \ -vf expand=:::::$VIERA_ASPECT,spp=6,harddup,crop=1643:924:: \ -lavdopts skiploopfilter=nonref:skipframe=default:threads=8 \ -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=448:autoaspect=yes:threads=8 \ " ;; # Внимание! при более "плотных" опциях появлются лаги #-vf expand=:::::$VIERA_ASPECT,spp=6,harddup,crop=1365:768::,scale=768:-3 \ wmv) TRANSCODER_OPTIONS="$aid $alang $channels $ofps $msglevel $output $srate $oac $ovc $of $mpegopts \ -vf expand=:::::4/3,scale,spp=6,harddup \ -af lavcresample=48000,hrtf,volnorm \ -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 " ;; flv) TRANSCODER_OPTIONS="$aid $alang $channels $ofps $msglevel $output $srate $oac $ovc $of $mpegopts \ -vf expand=:::::$VIERA_ASPECT,scale,spp=6,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=8 \ " ;; mp4) TRANSCODER_OPTIONS="$aid $alang $channels $ofps $msglevel $output $srate $oac $ovc $of $mpegopts \ -vf expand=:::::$VIERA_ASPECT,scale,spp=6,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 \ " ;; 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 $alang $channels $ofps $msglevel $output $srate $oac $ovc $of $mpegopts \ -vf expand=:::::$VIERA_ASPECT,scale,spp=6,harddup \ -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=10000:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=192:autoaspect=yes:threads=3 \ " ;; m4v) TRANSCODER_OPTIONS="$aid $alang $channels $ofps $msglevel $output $srate $oac $ovc $of $mpegopts \ -vf expand=:::::$VIERA_ASPECT,scale,spp=6,harddup \ -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=10000:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=192:autoaspect=yes:threads=3 \ " ;; ts) # опции при кодировании из интернет в поток mencoder не работают ! TRANSCODER_OPTIONS="$aid $alang $channels $ofps $msglevel $output $srate $oac $ovc $of $mpegopts \ -vf expand=:::::$VIERA_ASPECT,scale,spp=6,harddup \ -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=256:autoaspect=yes:threads=3 \ " ;; asf) TRANSCODER_OPTIONS="\ -aid 4352 \ -alang ru \ -channels 2 \ -cache 10240 \ -cache-min 5 \ -vf expand=:::::$VIERA_ASPECT,scale,spp=6,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 \ " ;; avi) TRANSCODER_OPTIONS="$aid $alang $channels $ofps $msglevel $output $lavcresample $srate $oac $ovc $of $mpegopts \ -vf expand=:::::$VIERA_ASPECT,spp=6,harddup \ -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:keyint=15:vstrict=0:acodec=ac3:abitrate=384:autoaspect=yes:threads=8 \ " ;; *) #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" <> "$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 - профиль трансокдирования совпадающий с раширением файла echof ${FUNCNAME} "выполняется" 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 - профиль трансокдирования совпадающий с раширением файла echof ${FUNCNAME} "выполняется : функции передан параметр <$1>" 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 \ " ;; avi) TRANSCODER_OPTIONS="\ -threads 3 \ -aspect 16:9 \ -vf "scale=1920:-1" \ -i "$INPUT" \ -r 25 \ -target dvd \ -loglevel debug \ " ;; *) echo " Неверное обращение к функции - отсутствует или неправильный параметр <$1>. Присвоены параметры по умолчанию." >> "$LOG_FILE" TRANSCODER_OPTIONS="\ -threads 3 \ -aspect 16:9 \ -vf "scale=1920:-1" \ -i "$INPUT" \ -r 25 \ -target dvd \ -loglevel debug \ -y \ " #-vf "cropdetect=16:9" # -loglevel verbose # -max_delay 500000 # -f avi -y "$OUTPUT" ;; esac } function transcode_null() { # функция "нулевого" (отсуствия) декодирования файлов echof ${FUNCNAME} "выполняется : копирование с <$INPUT> на <$OUTPUT>" cp "$INPUT" "$OUTPUT" } # # Блок функций выбора кодировщиков для зарегистрированных расширений # transcode_vob() { # функция декодирования файлов vob transcode_mencoder mkv #transcode_mencoder m2ts #transcode_ffmpeg } transcode_mkv() { # функция декодирования файлов mkv transcode_mencoder mkv #transcode_mencoder m2ts #transcode_ffmpeg } transcode_m2ts() { # функция декодирования файлов m2ts transcode_mencoder m2ts # transcode_ffmpeg } transcode_wmv() { # функция декодирования файлов wmv transcode_mencoder wmv #transcode_ffmpeg #transcode_vlc } transcode_flv() { #transcode_mencoder flv #transcode_mencoder m2ts transcode_ffmpeg mkv } transcode_mp4() { transcode_mencoder mp4 #transcode_ffmpeg } transcode_avi() { #transcode_ffmpeg avi transcode_mencoder avi #transcode_null #transcode_vlc } transcode_ts() { # транскодирование видео-потока интернет-телевидения #INPUT="http://youlike.video37.ru:2103/video/$FILE_NAME"; INPUT=$(cat "$INPUT"); echof ${NAME_FUNCTION} "чтение видео потока из $INPUT" # 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) 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) 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 для их "просмотра" 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() { # транскодирование файлов изображений для их "просмотра" 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() { # захват и показ видео с экрана 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 echof "${NAME_FUNCTION}" "функция транскодирования для расширения <$NAME_FUNCTION> найдена, запускаю" ${NAME_FUNCTION} # то запускаем её else echof "$SCRIPT_NAME" "функция транскодирования для расширения <$NAME_FUNCTION> не зарегистрирована, использую транскодер VLC." transcode_vlc # иначе запускаем транскодер по умолчанию fi echof "$SCRIPT_NAME" "скрипт успешно завершён" 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_avi; ;; 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