Датa: [30-04-2025]
Автор: 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)>>
|