Датa: [25-04-2024]
Автор: Svilen Savov (svilendotorg)
Подържа се от: Svilen Savov (svilendotorg)

Изключително се радвам, че мога да допринеса с нещо за развитието на този сайт и българското open-source общество, макар и толкова малко и незначително :)

Ще споделя с вас първият си по-сериозен bash скрипт.

Идеята за създаването му ми дойде, тъй-като ползвам джобен компютър - PocketPC HTC Trinity с малък екран и слаб процесор (320х240, 400MHz Samsung), на който е невъзможно да се гледат видео файлове със стандартна резолюция и висок битрейт. За целта беше необходимо да прекомпресирам всеки видео файл ползвайки лаптопа си под Windows. Това е трудоемък процес, ползващ много ресурси и време, дори и чрез ползването на batch списъци. Също така, мога да компресирам клиповете, правени от фотоапарата ми Canon - стават огромни при снимане на видео с висок фреймрейт. През това време ресурсите на личният ми Debian сървър си стояха на 80% свободни и така реших да ги впрегна в компресиране на видео файлове.

Скрипта използва mencoder, който е част от пакета на mplayer, както и debian пакета msttcorefonts заради шрифтовете му за субтитри. Може да конвертирате цяла папка с различни видове видео файлове, указани в $EXT. Скрипта вгражда субтитри автоматично, стига да носят същото име като видео файла. Нямам много време за обяснения в момента, просто пуснете скрипта без параметри и ще си принтне лек хелп, достатъчен за ползване :)
Открит съм за идеи как да го разширя с полезни неща, или да оптимизирам кода по някакъв начин :)


[code]

#!/bin/bash

# Description: Compress a single video file or all video files in a folder using mencoder
# Author: Svilen Savov (svilen@svilen.org)
# Date: 25.10.2007, revision 1.0

# FILETYPES TO CONVERT
EXT="avi AVI mpeg MPEG mpg MPG asf ASF flv FLV wmv WMV mov MOV qt QT vob VOB"

check_and_encode () {
   if [ -n "`echo $EXT| grep ${1##*.}`" ]; then
       if [ "$OPTIONS" = "false" ]; then
               input_options
       fi
       echo "
       #########################################################################
       $1 --->
       "`echo $1 | sed 's;\(.*\)\..*;\1;'`.ENCODED.$FILEADD.avi"

                       Video bitrate: $VIDEO_BITRATE kbps
                       Horizontal resolution: $H_SCALE
                       Audio bitrate: $AUDIO_BITRATE kbps
                       Audio mode: $AUDIO_MODE
                        0  -  stereo
                        1  -  joint-stereo
                        2  -  dualchannel
                        3  -  mono
       #########################################################################
       "
       nice -n +5 mencoder \
           -vf scale=$H_SCALE:-2 -sws 9 \
           -oac mp3lame -lameopts mode=$AUDIO_MODE:cbr:br=$AUDIO_BITRATE -srate 44100 \
           -ovc xvid -xvidencopts vhq=4:max_bframes=0:bitrate=$VIDEO_BITRATE \
           -autosub -subfont-text-scale 4.0 -subwidth 90 -subcp cp1251 \
           -font /usr/share/fonts/truetype/msttcorefonts/arial.ttf \
       "$1" -o "`echo $1 | sed 's;\(.*\)\..*;\1;'`.ENCODED.$FILEADD.avi"
       if [ -n "$DIRECTORY" ]; then
               mkdir -p "$DIRECTORY" && mv "$1" "$DIRECTORY"
               if [ -f "`echo $1 | sed 's;\(.*\)\..*;\1;'`.ENCODED.$FILEADD.avi" ]; then
                       mv "`echo $1 | sed 's;\(.*\)\..*;\1;'`.ENCODED.$FILEADD.avi" "$DIRECTORY"
               fi
       fi
       beep
   fi
}

input_options () {
echo "Enter video bitrate in Kbps (Examples: 192, 224, 256...)"
read VIDEO_BITRATE
echo "Enter video horizontal resolution in pixells (Examples: 320, 640, 800...)"
read H_SCALE
echo "Enter audio bitrate in Kbps (Examples: 64, 86, 92, 128...)"
read AUDIO_BITRATE
echo "Enter audio mode"
echo "AUDIO MODE"
echo "0  -  stereo"
echo "1  -  joint-stereo"
echo "2  -  dualchannel"
echo "3  -  mono"
read AUDIO_MODE
OPTIONS=ready
}
if [ "$1" = "-pc" ] || [ "$2" = "-pc" ] || [ "$3" = "-pc" ]; then
   VIDEO_BITRATE=900
   H_SCALE=640
   AUDIO_BITRATE=128
   AUDIO_MODE=0
   FILEADD=PC.XviD
elif [ "$1" = "-pc_mono" ] || [ "$2" = "-pc_mono" ] || [ "$3" = "-pc_mono" ]; then
   VIDEO_BITRATE=900
   H_SCALE=640
   AUDIO_BITRATE=96
   AUDIO_MODE=3
   FILEADD=PC.XviD.MONO
elif [ "$1" = "-ppc_high" ] || [ "$2" = "-ppc" ] || [ "$3" = "-ppc" ]; then
   VIDEO_BITRATE=256
   H_SCALE=320
   AUDIO_BITRATE=96
   AUDIO_MODE=1
   FILEADD=PPC.XviD.HQ
else
       OPTIONS=false
fi
if [ "$1" = "-m" ] || [ "$2" = "-m" ] || [ "$3" = "-m" ]; then
       DIRECTORY=encoded
fi
if [ "$1" = "-a" ] || [ "$2" = "-a" ] || [ "$3" = "-a" ]; then
       for FILE in *; do
       check_and_encode $FILE
       done
       beep -f 1000 -r 2 -n -r 5 -l 10 --new
       exit 0
elif [ -f "$1" ] || [ -f "$2" ] || [ -f "$3" ]; then
       check_and_encode $1
       exit 0
else
       echo "
Usage: '$0 <filename>' or '$0 -a' to compress all files in the current folder
Additional encoding parameters:
       -pc (Video bitrate: 900 kbps, Horizontal scale: 640, Audio bitrate: 128 kbps, Audio mode: stereo)
       -pc_mono (Video bitrate: 900 kbps, Horizontal scale: 640, Audio bitrate: 96 kbps, Audio mode: mono)
       -ppc (Video bitrate: 256 kbps, Horizontal scale: 320, Audio bitrate: 96 kbps, Audio mode: joint-stereo)

Examples:
1.      '$0 -a -ppc' to compress all files in the current directory using settings for -ppc
2.      '$0 Movie.avi -pc' to compress the file Movie.avi using settings for -pc
3.      '$0 Movie.avi' to compress the file Movie.avi using custom defined settings
       "
       exit 0
fi
beep -f 1000 -r 2 -n -r 5 -l 10 --new
[/code]

Промени: Версия 1.0: стартова версия

сваляне: http://svilen.org/
официална страница: http://svilen.org/

Лиценз: GPL

<<iconf( вер. 0.1) | cpufreq( вер. 1)>>