LINUX.ORG.RU

Конвертация видео на сайте


0

0

Всем доброго времени суток.
Хотел проконсультироваться по небольшому вопросу, связанному с обработкой больших объемов данных.

Имеем сайт, на php.
Хотим написать для него конвертацию видео, из .avi скажем в .flv.

будем использовать ffmpeg:

<?

$ffmpeg = '/usr/bin/ffmpeg -i $filename -ar 22050 -ab 56 -aspect 4:3 -b 550k -r 12 -f flv -s 400x300 -acodec libmp3lame -ac 1 $flashname &';

exec($ffmpeg);

(данные грузим через ajax)


решение в лоб, естественно есть куча минусов:

1. человек должен сидеть и ждать пока отработает ffmpeg, при переходе на другую страницу браузер тупо подвисает ( и жрет память апача, если я не ошибаюсь)
2. название файла может быть '; rm -rf /;

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

В чем вопрос - если кто-то сталкивался, может быть подскажет в правильном ли я направлении иду ?
либо есть какие-то более лучшие способы решения ?
по поводу демонов - что следует почитать погуглить, что бы лучше разобраться в этом вопросе ?


заранее спасибо за ответы


> 2. название файла может быть '; rm -rf /;

o.0 у вас пхп от рута запущен ?

> 1. человек должен сидеть и ждать пока отработает ffmpeg, при переходе на другую страницу браузер тупо подвисает ( и жрет память апача, если я не ошибаюсь)


обращаться к скриптику, который будет создавать на месте будущего файла превьюшку "Файл не доступен", конвертировать его в бекграуде, потом заменять картинку на какой-нить кадр и выкладывать видео из tmp директории туда, где должны смотреть это пользователи. ПРОФИТ ???!!

phasma ★☆
()

я бы воспользовался помощью cron.

1. Заливаем обрабатываемый файл в каталог.

2. Создаем допустим некий файл-флаг, в котором пишем название обрабатываемого файла и флаг обработки (не обработан, в процессе)

3. Крон по некому периоду запускает sh/bash/dash скрипт, который проверяет наличие файлов-флагов и запускает ffmpeg. После конвертации исходный файл удаляем. Флаг тоже киляем. При желании этот скрип можно написать на перле/пыхе - это если понядобится например в базу закинуть название и путь до обработанного файла.

4. Ну в принципе то и все - и апач не подвисает и скилл растет.

OldFornit
()
Ответ на: комментарий от phasma

>o.0 у вас пхп от рута запущен ?
все мы понимаем что не от рута.
но что команда может быть другой тоже не стоит забывать.


>обращаться к скриптику, который будет создавать на месте будущего файла превьюшку "Файл не доступен", конвертировать его в бекграуде, потом заменять картинку на какой-нить кадр и выкладывать видео из tmp директории туда, где должны смотреть это пользователи. ПРОФИТ ???!!


круто. Как запустить процес конвертации в бакграунде на php ?

hose
() автор топика
Ответ на: комментарий от OldFornit

>я бы воспользовался помощью cron.
остается вопрос как часто запускать крон и делать проверку.

смотрел на контакт - вроде у них все это без крона сделано.

hose
() автор топика
Ответ на: комментарий от hose

мысль в порядке бреда - написать свой модуль для апача, который при всасывании видео через POST-форму будет онлайном конвертить поток.
btw, во вконтактах,емнип, четко оговорены форматы видео и размер файла, т.е. переконвертации не происходит, только ресайз, что намного проще и проходит быстрее.

isden ★★★★★
()
Ответ на: комментарий от isden

>мысль в порядке бреда - написать свой модуль для апача, который при всасывании видео через POST-форму будет онлайном конвертить поток.

чем это будет отличаться от того что бы запустить стороннего демона ?
те чем это будет лучше хуже, и вообще где про это все можно почитать, желательно с примерами.


>btw, во вконтактах,емнип, четко оговорены форматы видео и размер файла, т.е. переконвертации не происходит, только ресайз, что намного проще и проходит быстрее.


гм, ну допустим я загружаю клип 640х480 в формате avi
так или иначе они его перекодируют в 320x200 в формат flv

или я ошибаюсь ?

hose
() автор топика
Ответ на: комментарий от hose

> чем это будет отличаться от того что бы запустить стороннего демона ?

более прозрачно для клиента. т.е. пока клиент заливает файл, он сразу конвертируется. а не залил -> ждет хз сколько.

> те чем это будет лучше хуже, и вообще где про это все можно почитать, желательно с примерами.


я же говорю - мысль в порядке бреда ))

> гм, ну допустим я загружаю клип 640х480 в формате avi

> так или иначе они его перекодируют в 320x200 в формат flv


ну как вариант - они _не перекодируют_ его а только отресайзят. а проигрывание указанных форматов осуществляется ихним flash плеером.

isden ★★★★★
()
Ответ на: комментарий от isden

> а проигрывание указанных форматов осуществляется ихним flash плеером.

ну или сервер берет файл в разных форматах а отдает поток флэш-плееру в одном формате(flv тот же).

isden ★★★★★
()
Ответ на: комментарий от isden

ясно, вообщем нужно гуглить

hose
() автор топика

Для этого пишется отдельный демон. Для простоты можно создать в базе табличку jobs вида: ID, filename, percent

При получении файла пхп пишем туда к нему путь. Демон периодически просматривает эту таблицу и если находит там запись с нестартанутым конвертированием то запускает задачу конвертации. Это он делает в новом fork`е. Анализируя вывод ffmpeg`a обновляет время от времени процент.

Пользователь загрузивший файл видит некую страничку где аджаксом вызывается пхп скрипт отдающий текущий прогресс для загруженного файла. Как он достиг 100% пишем что все прошло успешно.

Это было краткое схематичное описание.

roller ★★★
()
Ответ на: комментарий от OldFornit

> При желании этот скрип можно написать на перле/пыхе - это если понядобится например в базу закинуть название и путь до обработанного файла

А на баше, типа, нельзя в базу значение закинуть?

boombick ★★★★★
()

А мы написали перекодировочного демона (на питоне). Так легче формировать очередь ффмпег-процессов. К демону есть два запроса -- add (передается путь к файлу, возвращает id обрабатываемого файла) и get_status (передается id, возвращается статус, если файл успешно обработан, то также возвращается путь к выходному файлу).

provaton ★★★★★
()

> 2. название файла может быть '; rm -rf /;

Не может. Со слэшем в имени ну никак не может. Я пробовал так поломать наш продукт, другие способы есть, правда, и работают, но это гемор шопесец.

shimon ★★★★★
()

LOL вот они какие местные специалсты, как почитаешь ваши блять советы так ощущение что тут все клинические идиоты.

Fray
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.