Как обрабатывать очереди кодирования видео во время нескольких загрузок видео?


Я работаю над разработкой сайта потоковой передачи видео, на котором пользователи могут загружать видео на сайт (несколько видео одновременно с помощью плагина uploadify jquery).

Теперь я столкнулся с вопросом о кодировании видео в FLV для их потоковой передачи в Интернете.

Когда должен происходить процесс кодирования видео? Должно ли это произойти сразу после завершения загрузки (т.Е. перенаправить пользователя на страницу успешной загрузки, а затем начать кодирование в фоновом режиме с помощью exec команда для ffmpeg?) Однако, используя этот подход, как мне определить, успешно ли завершилось кодирование? Что делать, если пользователи загружают поврежденное видео, а ffmpeg не может его закодировать? Как мне справиться с этим в PHP?

Как мне поставить в очередь кодирование видео, так как несколько пользователей могут загружать видео одновременно? Имеет ли FFMpeg свою собственную очередь кодирования?

Я также читал о параметрах gearman и очереди сообщений, таких как redis и AMQP, в другой связанной теме SO. Являются ли они одним из потенциальные решения?

Я был бы очень признателен, если бы кто-нибудь мог дать ответы на мои вопросы.

Author: Emii Khaos, 2011-06-18

4 answers

Вам следует использовать программное обеспечение под названием gearman. Это сервер заданий, и вы можете вызывать функции с помощью PHP. Вы можете перевести процесс в фоновый режим, и он автоматически обрабатывает очереди. Многие процессы также могут выполняться параллельно.

Я использовал его, и он очень прост в установке и эксплуатации.

Для вашего варианта использования,

Wrap the ffmpeg process in a php file with exec.
Save the uploaded file to db and give it an id. 
Call the encode function after a user uploads file.
As soon as the encode function starts, 
update the db to reflect that the file was "picked".
First run the ffmpeg info on the file to see if it is fine.
Then encode the file and after it is done, update db flag to "done".

После завершения процесса вы можете вызвать другую функцию, Чтобы отправить электронное письмо, твит и т. Д. Пользователю, которому соответствует кодировка полный.

 2
Author: Mridul Kashatria, 2011-06-18 18:30:44

Поскольку кодирование может занять некоторое время, вам может потребоваться добавить входные файлы в папку и добавить запись в базу данных. Затем у вас есть скрипт, который запускается либо постоянно, либо каждые x минут, преобразующий ожидающие видео из базы данных в формат FLV.

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

 2
Author: Manhim, 2011-06-18 18:23:46

Вы можете использовать задание cron на сервере или использовать что-то вроде beanstalkd (или gearman, как упоминалось в других ответах на этот вопрос).

 2
Author: Gaz, 2011-06-19 08:00:58

FFMPEG - это просто утилита командной строки. В нем нет очереди, и вам нужно будет создать свою собственную систему очередей, чтобы выполнять работу асинхронно.

Для очередей PHP у меня был хороший опыт работы с сервером beanstalkd с использованием PHP-клиента pheanstalk. Затем ваш скрипт загрузки должен вставить элементы в очередь для кодирования и вернуть пользователю ответ, в котором говорится, что видео будет обработано в ближайшее время. Ваши работники должны извлекать элементы из очереди и запускать на них FFMpeg. Вы можете прочитать код состояния FFMpeg, чтобы определить, было ли кодирование успешно завершено.

 1
Author: sagi, 2011-06-18 18:26:45