2016-11-15 2 views
0

Я запускаю службу, где люди могут загружать видео. Из-за больших размеров файлов я хотел бы конвертировать эти видео после загрузки.Конвертировать видео после загрузки

Я хочу, чтобы при загрузке вызывается PHP-скрипт, в котором видео преобразуется (используя FFMPEG). Когда конвертация завершена, пользователь получает уведомление о том, что видео готово к использованию.

Я думаю о отдельном скрипте PHP, который использует путь, отправленный в POST. Затем он вызовет строку FFMPEG в shell_exec(). Но как я могу заставить его работать в фоновом режиме и отправлять уведомление пользователю, когда процесс завершен?

ответ

1

Вы должны реализовать некоторый механик очереди. Например, первый скрипт взаимодействует с пользователем, загружает файл и вставляет новое задание в очередь. Второй скрипт запускается как процесс фонового сервера каждую минуту с помощью планировщика (crontab в Linux, планировщик заданий в Windows). Если очередь не пуста, фоновый скрипт получает старое задание из очереди и запускает ffmpeg. Когда ffmpeg завершит работу, а shell_exec вернет управление, вы должны пометить это задание как «готовое». Самый простой способ реализовать такую ​​очередь - простая таблица БД, или вы можете использовать специально разработанный диспетчер очереди, например. RabbitMQ.

Также неплохо написать третий скрипт, чтобы проверить статус задания и вызвать его из пользовательского интерфейса с помощью AJAX каждые X секунд.

0

Я реализовал систему, подобную тому, что описывает Владислав. Я использую этот task spooler для запуска моих заданий ffmpeg, по 2 за раз (в зависимости от вашего оборудования). Если вы не настроите очередь, вы можете в конечном итоге попытаться перекодировать десятки или сотни клипов одновременно, сбив ваш сервер. Оставьте несколько потоков открытыми для вашего веб-сервиса. Я написал файл PHP (проверено через ajax), который вызывает сценарий оболочки, который дает пользователю обратную связь, где есть очередь и т. Д. Вот бизнес-конец сценария оболочки bash.

STATUS=$(ts | grep $NEWNAME | awk '{print $2}') 
if [ "$STATUS" = "running" ] || [ "$STATUS" = "finished" ]; then 
     CURRID=$(ts | grep $NEWNAME | awk '{print $1}') 
     PID=$(ts -p $CURRID) 
     echo "p$PID" 
     exit 0 
elif [ "$STATUS" = "queued" ]; then 
     RUNNINGID=$(ts | grep running | awk '{print $1}') 
     CURRID=$(ts | grep $NEWNAME | awk '{print $1}') 
     LASTQ=$(ts | grep queued | tail -1 | awk '{print $1}') 
     ALLQ=$(($LASTQ-$RUNNINGID)) 
     LEFT=$(($CURRID-$RUNNINGID)) 
     echo "q$LEFT.$ALLQ" 
     exit 0 
else 
     echo "done" 
fi 
Смежные вопросы