Форум / Рецепты / скрипт обработки видео на 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
dimm74Ссылка на пост (Смотрели 16816)19.04.14 12:57     Ответить
Ваше имя*
 E-mail* (не публикуется)
 
 
Если пишете о проблеме, то приложите, пожалуйста, ссылку на свой плеер отсюда — Плеер: Файл > Код > Ссылка
Вставка кода — [code][/code] дублировать ответы на e-mail
1
support 19.04.14 - 17:19
Спасибо, перенесли в рецепты
2
dimm74 19.04.14 - 23:12
работа скрипта продемонстрирована не на сайте dtpstory.ru на записях начиная с апреля.
3
dimm74 01.06.14 - 13:48
обнаружил не большой косячок с определением длинны видео. Все таки надо при вязаться к "Duration:"
4
dimm74 22.07.14 - 11:36
При вычислении alltime нужно экранировать секунды, минуты и часы таким образом: 10#$second
Сообщить об ошибке на сайте
 Uppod © 2008–2020
Сообщить об ошибке на сайте
Если ошибка относится к плееру, а не сайту, либо Вы хотите получить ответ на вопрос —
лучше написать на форуме