← Форум / Рецепты / скрипт обработки видео на BASH
Вполне уже рабочий скрипт на bash с использованием mysql.
Периодически cron-ом его запускаю, мониторю наличие новых поступлений и в конце записываю в базу сделанные изменения.
В результате получаю:
-конвертированный mp4-файл
-полноразмерную превьюшку
-мини превьюшку
-gif-ку из равномерно вырезанных кадров
-набор миниатюр кадров
-txt-файл с описанием миниатюр.
#!/bin/sh
#начальные настройки
userdb="**********"
passdb="**********"
hostdb="*********"
namedb="********"
log_file="/var/log/vi_edit.log"
vi_path="/home/sites/dtpstory/www/"
#vi_path="./"
#filename="1.MOV"
file_format="mp4"
#Проверяю наличие новых файлов для обработки
sql="SELECT id FROM dtp_content WHERE catid=11"
res='mysql -u $userdb --password=$passdb --database=$namedb --skip-column-names --batch --execute="$sql"'
if [[ -z $res ]]
then
echo 'Нет файлов для обработки' >> $log_file
else
for y in $res; do
sql="SELECT dtp_video_file FROM dtp_cck_store_form_add_video WHERE id='$y'"
i='mysql -u $userdb --password=$passdb --database=$namedb --skip-column-names --batch --execute="$sql"'
filename=$i
echo $filename
new_file=${filename%.*}'_di.'$file_format
out_file=$vi_path${filename%.*}'_di.'$file_format
full_path=$vi_path$filename
file_dir=${full_path%/*}
tmp_file=$vi_path$filename"_tmp."$file_format
domen_di="http://dtpstory.ru/"
#Сколько ядер у процессора
processor_cores='grep -c '^processor' /proc/cpuinfo'
resolution="640x480"
vbitrate="512k"
abitrate="96k"
options="-f $file_format -s $resolution -b:v $vbitrate -vcodec libx264 -threads $processor_cores -g 30 -r 30"
#конвертирую файл в нужный формат
ffmpeg -y -i "$vi_path$filename" -an -pass 1 -threads 2 $options "$tmp_file"
ffmpeg -y -i "$vi_path$filename" -acodec libfaac -ar 44100 -ab $abitrate -pass 2 -threads 2 $options "$tmp_file"
qt-faststart "$tmp_file" "$out_file"
#Определение длинны видео
info=$( ffmpeg -i "$out_file" 2>&1 | egrep -o "[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9]" )
hour=$( echo $info | grep -o "^[0-9][0-9]:" )
minute=$( echo $info | grep -o ":[0-9][0-9]:" )
second=$( echo $info | grep -o "[0-9][0-9]." )
hour=$( echo "${hour%':'}" )
minute=$( echo "${minute#':'}" )
minute=$( echo "${minute%':'}" )
second=$( echo "${second%'.'}" )
: $((alltime=$hour*3600+$minute*60+$second))
#определяю с какой секунды брать скриншот
if [ "$alltime" -le "10" ]
then
scr_time='00:00:01'
step_time=2
let step=$step_time
else
scr_time='00:00:09'
step_time=5
let step=($step_time-1)
fi
let limit_time=($alltime/$step_time)
#делаем превью
mplayer -ss $scr_time -frames 1 -nosound -vo jpeg:outdir=$file_dir/tmp $out_file
mv $file_dir'/tmp/00000001.jpg' $out_file'.jpg'
#делаем анимированную мини превьюшку
mplayer -sstep $step -frames $limit_time -vo jpeg:outdir=$file_dir'/tmp' -nosound $out_file
convert -resize 133x100 -delay 100 $file_dir'/tmp/*.jpg' $out_file'.gif'
#делаем мини превью
convert $out_file'.jpg' -resize 133x100 -quality 70 $out_file'_mini.jpg'
#делаем схему миниатюр
montage $file_dir'/tmp/*.jpg' -tile 5x5 -geometry 133x100 $out_file'_sc.jpg'
#переменная с миниатюрами для плеера в текстовый файл
shot_kol=$(awk 'BEGIN{print int(('$limit_time'/'25')+'0.999999')}')
a=0
c=0
while [ $a -lt $shot_kol ]; do
unset ff
ttt=$[$a+1]
if [ "$shot_kol" -eq "$ttt" ]
then lim=$limit_time
else lim=$[25*(1+(1*$a))]
fi
while [ "$c" -le "$lim" ]; do
b=$[$step_time*($c)]
ff=$ff'echo -n "$b,"'
c=$[$c+1]
done
points[$a]=${ff%,}
#костыль если только один файл
if [ "$shot_kol" -eq "1" ]
then
url_sc=$domen_di$new_file'_sc.jpg'
else
url_sc=$domen_di$new_file'_sc-'$a'.jpg'
fi
mini_shot_var=$mini_shot_var'{"url":"'$url_sc'","points":"'${points[$a]}'"}''echo -n ","'
a=$[$a+1]
done
mini_shot='{"thumbs":['${mini_shot_var%,}']}'
echo $mini_shot > $out_file'.txt'
#записываю в базу инфу о проделанных изменениях
sql="UPDATE dtp_cck_store_form_add_video SET dtp_video_file='$new_file', dtp_file='$filename' WHERE id='$y'"
echo $sql | mysql -u$userdb -p$passdb $namedb
sql="UPDATE dtp_content SET catid=12 WHERE id='$y'"
echo $sql | mysql -u$userdb -p$passdb $namedb
#подчищаю
rm -rf $file_dir'/tmp'
rm $tmp_file
echo 'длинна ролика' $alltime 'сек.'
echo 'шаг для кадрирования' $step_time 'сек.'
echo 'кол-во шагов' $limit_time 'раз'
done
fi
#EOF
Периодически cron-ом его запускаю, мониторю наличие новых поступлений и в конце записываю в базу сделанные изменения.
В результате получаю:
-конвертированный mp4-файл
-полноразмерную превьюшку
-мини превьюшку
-gif-ку из равномерно вырезанных кадров
-набор миниатюр кадров
-txt-файл с описанием миниатюр.
#!/bin/sh
#начальные настройки
userdb="**********"
passdb="**********"
hostdb="*********"
namedb="********"
log_file="/var/log/vi_edit.log"
vi_path="/home/sites/dtpstory/www/"
#vi_path="./"
#filename="1.MOV"
file_format="mp4"
#Проверяю наличие новых файлов для обработки
sql="SELECT id FROM dtp_content WHERE catid=11"
res='mysql -u $userdb --password=$passdb --database=$namedb --skip-column-names --batch --execute="$sql"'
if [[ -z $res ]]
then
echo 'Нет файлов для обработки' >> $log_file
else
for y in $res; do
sql="SELECT dtp_video_file FROM dtp_cck_store_form_add_video WHERE id='$y'"
i='mysql -u $userdb --password=$passdb --database=$namedb --skip-column-names --batch --execute="$sql"'
filename=$i
echo $filename
new_file=${filename%.*}'_di.'$file_format
out_file=$vi_path${filename%.*}'_di.'$file_format
full_path=$vi_path$filename
file_dir=${full_path%/*}
tmp_file=$vi_path$filename"_tmp."$file_format
domen_di="http://dtpstory.ru/"
#Сколько ядер у процессора
processor_cores='grep -c '^processor' /proc/cpuinfo'
resolution="640x480"
vbitrate="512k"
abitrate="96k"
options="-f $file_format -s $resolution -b:v $vbitrate -vcodec libx264 -threads $processor_cores -g 30 -r 30"
#конвертирую файл в нужный формат
ffmpeg -y -i "$vi_path$filename" -an -pass 1 -threads 2 $options "$tmp_file"
ffmpeg -y -i "$vi_path$filename" -acodec libfaac -ar 44100 -ab $abitrate -pass 2 -threads 2 $options "$tmp_file"
qt-faststart "$tmp_file" "$out_file"
#Определение длинны видео
info=$( ffmpeg -i "$out_file" 2>&1 | egrep -o "[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9]" )
hour=$( echo $info | grep -o "^[0-9][0-9]:" )
minute=$( echo $info | grep -o ":[0-9][0-9]:" )
second=$( echo $info | grep -o "[0-9][0-9]." )
hour=$( echo "${hour%':'}" )
minute=$( echo "${minute#':'}" )
minute=$( echo "${minute%':'}" )
second=$( echo "${second%'.'}" )
: $((alltime=$hour*3600+$minute*60+$second))
#определяю с какой секунды брать скриншот
if [ "$alltime" -le "10" ]
then
scr_time='00:00:01'
step_time=2
let step=$step_time
else
scr_time='00:00:09'
step_time=5
let step=($step_time-1)
fi
let limit_time=($alltime/$step_time)
#делаем превью
mplayer -ss $scr_time -frames 1 -nosound -vo jpeg:outdir=$file_dir/tmp $out_file
mv $file_dir'/tmp/00000001.jpg' $out_file'.jpg'
#делаем анимированную мини превьюшку
mplayer -sstep $step -frames $limit_time -vo jpeg:outdir=$file_dir'/tmp' -nosound $out_file
convert -resize 133x100 -delay 100 $file_dir'/tmp/*.jpg' $out_file'.gif'
#делаем мини превью
convert $out_file'.jpg' -resize 133x100 -quality 70 $out_file'_mini.jpg'
#делаем схему миниатюр
montage $file_dir'/tmp/*.jpg' -tile 5x5 -geometry 133x100 $out_file'_sc.jpg'
#переменная с миниатюрами для плеера в текстовый файл
shot_kol=$(awk 'BEGIN{print int(('$limit_time'/'25')+'0.999999')}')
a=0
c=0
while [ $a -lt $shot_kol ]; do
unset ff
ttt=$[$a+1]
if [ "$shot_kol" -eq "$ttt" ]
then lim=$limit_time
else lim=$[25*(1+(1*$a))]
fi
while [ "$c" -le "$lim" ]; do
b=$[$step_time*($c)]
ff=$ff'echo -n "$b,"'
c=$[$c+1]
done
points[$a]=${ff%,}
#костыль если только один файл
if [ "$shot_kol" -eq "1" ]
then
url_sc=$domen_di$new_file'_sc.jpg'
else
url_sc=$domen_di$new_file'_sc-'$a'.jpg'
fi
mini_shot_var=$mini_shot_var'{"url":"'$url_sc'","points":"'${points[$a]}'"}''echo -n ","'
a=$[$a+1]
done
mini_shot='{"thumbs":['${mini_shot_var%,}']}'
echo $mini_shot > $out_file'.txt'
#записываю в базу инфу о проделанных изменениях
sql="UPDATE dtp_cck_store_form_add_video SET dtp_video_file='$new_file', dtp_file='$filename' WHERE id='$y'"
echo $sql | mysql -u$userdb -p$passdb $namedb
sql="UPDATE dtp_content SET catid=12 WHERE id='$y'"
echo $sql | mysql -u$userdb -p$passdb $namedb
#подчищаю
rm -rf $file_dir'/tmp'
rm $tmp_file
echo 'длинна ролика' $alltime 'сек.'
echo 'шаг для кадрирования' $step_time 'сек.'
echo 'кол-во шагов' $limit_time 'раз'
done
fi
#EOF
dimm74 | Ссылка на пост (Смотрели 16816) | 19.04.14 12:57 Ответить |
1 | Спасибо, перенесли в рецепты (ответить) |
2 | работа скрипта продемонстрирована не на сайте dtpstory.ru на записях начиная с апреля. (ответить) |
3 | обнаружил не большой косячок с определением длинны видео. Все таки надо при вязаться к "Duration:" (ответить) |
4 | При вычислении alltime нужно экранировать секунды, минуты и часы таким образом: 10#$second (ответить) |
Оставить комментарий