Pull to refresh

Демон конвертации видео в FLV

Reading time 3 min
Views 3.6K
Решил поделиться недавно написанным кодом демона для видеохостинга.
Принцип демона прост. Демон смотрит в папку, куда загружаются видеофалы, и при появлении там новых, копирует в другую папку, запускает в фоне процесс конвертации, создает превьюшку, и копирует полученное видео в папку пользователя.

Скрипт написан на bash, поэтому в режиме демона его надо запускать командой nohup ну или screen. Недостатком является отсутствие контроля нагрузки. Если загрузка файлов активная, то реальна перегрузка сервера. У нас пока этот вопрос не критичен, но тем кому такое решение не подойдет, проще всего использовать команду flock для создания очереди процессов.

Самые важные параметры работы демона, можно указать через командную строку. Получить список команд вы можете, запустив скрипт с параметром -h.

Обратите внимание на параметр -u. С его помощью можно указать местоположение папок пользователей, куда будет копироваться конвертированное видео. Структура папок задана жестко, и что бы её изменить, придется править скрипт. Но по умолчанию структура директорий такова: <USER_ID>/video
То есть, в папочку video будут складываться конвертированные в формат FLV ролики.

И еще такой момент. С помощью параметров -s и -t можно указать директорию источник и промежуточную директорию для конвертации, соответственно. Важно знать, что файл в директорию, указанную в параметре -s (по умолчанию /var/videoinput), должен загружаться с именем <USER_ID>_<FILE_ID>.<avi|mpg|3gp|...>, где <USER_ID> это ID пользователя (то есть название его папки), а <FILE_ID> — ID файла, например ID записи в БД.
Превью будет скопирована туда же куда и файл видео, с таким же именем, но расширением png. Превью берется с 16-й секунды. В принципе, по хорошему, надо определять длину ролика (он то может быть и короче 16 сек), но это оставляю вам в качестве самостоятельной работы ;)

Из кода ясно, но все таки опишу необходимый софт для работы скрипта:
mencoder — собственно конвертация
mplayer — для вырезания превью
convert — ImageMagik утилита для ресайза превьюшки
flvtool2 — для записи мета-информации в FLV

#!/bin/bash

# folder_monitor.sh
# This is a daemon shell script for monitoring video input directory.
#

#определяем значения параметров по умолчанию
SRC_DIR=/var/videoinput
TRG_DIR=/var/videooutput
PARAMS='-ovc lavc -lavcopts vcodec=flv:keyint=50:vbitrate=300:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=480:360 -of lavf -oac mp3lame -lameopts abr:br=64 -srate 22050'
OUTPUT_FORMAT='flv'
USER_FOLDER="/usr/local/jboss/server/default/resources/files/user_folders"
THUMBNAIL_WIDTH=175
THUMBNAIL_HEIGHT=110

# получаем параметры
while getopts ":s:t:hp:u:H:W:" optname
do
case $optname in
"u")
USER_FOLDER="$OPTARG"
;;
"p")
PARAMS="$OPTARG"
;;
"s")
SRC_DIR="$OPTARG"
;;
"W")
THUMBNAIL_WIDTH="$OPTARG"
;;
"H")
THUMBNAIL_HEIGHT="$OPTARG"
;;
"t")
TRG_DIR="$OPTARG"
;;
"h")
echo "-h - help"
echo "-W - width of thumbnail"
echo "-H - height of thumbnail"
echo "-p - command line params for mencoder"
echo "-u - path to user folders"
echo "-s - source dir"
echo "-t - target dir"
exit 0;
;;
*)
echo "Unknown parameter or option error with option - $OPTARG"
exit 1;
;;
esac
done

while :
do
echo "Looking dir ${SRC_DIR}...\n"
#получаем входящие файлы видео
FILES=$(find $SRC_DIR -type f -exec basename '{}' \;)

#проходим по ним
for FILE in $FILES
do
#парсим имя файла, получая имя папки и конечного файла
USER_ID=$(echo $FILE | sed 's/[^0-9]/ /g' | awk '{print $1}')
VIDEO_ID=$(echo $FILE | sed 's/[^0-9]/ /g' | awk '{print $2}')

#запускаем в фоне команды
(echo "Converting $FILE..."
#забрали файл в промежуточную папку
mv ${SRC_DIR}/${FILE} ${TRG_DIR}/${FILE}
#вырезали превью
mplayer -ss 16 -frames 1 -vo png -nosound ${TRG_DIR}/${FILE}
THUMBNAIL="${USER_FOLDER}/${USER_ID}/video/${VIDEO_ID}.png"
#переместили превью
mv 00000001.png $THUMBNAIL
#уменьшили до нужного размера
convert $THUMBNAIL -resize ${THUMBNAIL_WIDTH} -gravity center -crop ${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}+0+0 -quality 75 $THUMBNAIL
#кодируем видео
mencoder ${TRG_DIR}/${FILE} -o "${TRG_DIR}/${FILE}.${OUTPUT_FORMAT}" ${PARAMS}
#записали метаинформацию для плеера
flvtool2 -UP "${TRG_DIR}/${FILE}.${OUTPUT_FORMAT}"
#удаляем исходный файл
rm ${TRG_DIR}/${FILE}
#и копируем сконвертированный файл в папку пользователя
mv "${TRG_DIR}/${FILE}.${OUTPUT_FORMAT}" "${USER_FOLDER}/${USER_ID}/video/${VIDEO_ID}.${OUTPUT_FORMAT}"
) &
done

sleep 10s
done


С Наступающим Новым Годом!

UPD. Продолжение статьи
Tags:
Hubs:
+38
Comments 31
Comments Comments 31

Articles