Делаем свой видеохостинг

FFmpeg-logoРаботаю над одним проектом, в котором предполагается загрузка пользователями видеоконтента на сайт. Фактически получается свой видеохостинг. Понятно, что требуется большой объём дискового пространства и трафик. Заказчик предупреждён и в курсе. Дальше дело техники.

В процессе работы возникло много вопросов, которые пришлось гуглить и искать. Чтобы в следующий раз мучительно не искать решение, пишу эту шпаргалку. Ну и, как всегда, возможно она будет полезна не только мне.

Если кто-нибудь сможет посоветовать что-нибудь по-лучше — буду рад комментариям.

1. Вставка видео в HTML
=========================
Для вставки видео на страницу я решил использовать JWplayer.


Loading the player ...

Мне достаточно хранить в базе данных URL всех видео, URL превьюшек и длительность всех видео.

Думаю не нужно объяснять, зачем мне нужна превьюшка. Но зачем знать длительность, нужно обязательно рассказать, но ниже.

2. Как сделать превьюшку для видео
=========================
Для получения превьюшки использую утилиту ffmpeg, ну и естественно должен быть доступ на её.

Команда выглядит следующим образом

exec('/usr/local/bin/ffmpeg -i '.$videofile.' -an -ss 10 -vframes 1 -y -f mjpeg '.$jpgfile);

Да. Обязательно нужно указать полный путь к ffmpeg.

Небольшая памятка по ключикам ffmpeg.
-an — не обрабатывать аудио
-i infile — входной файл
-ss 10 — начальная позиция в секундах. В данном случае 10 секунд
-vframes — количество обрабатываемых кадров.
-y — опция перезаписывать выходные файлы.
-f mjpeg — выбор формата выходного файла mjpeg.

3. Как преобразовать в FLV
=========================
Тот же самый ffmpeg

exec('/usr/local/bin/ffmpeg -i '.$src_file.' -ar 22050 -y '.$dst_file);

Все ключики я уже описал выше, добавился один:
-ar 22050 — частота дискретизации звука.

4. Как получить длительность видео
=========================
Зачем? Дело в том, что если не указать явно длительность видео, JWplayer будет пытаться вытащить длительность из файла. Фишка в том, что он обратится к файлу не ранее, чем начнётся просмотр видео. А пока мы смотрим превьюшку — будет показана нулевая длительность.

Но даже если мы начинаем просмотр, проблемы не кончаются. В некоторых FLV файлах мета-заголовок испорчен и порой содержит пустую длительность, при том, что видео вполне корректно исполняется. В таких случаях JWplayer будет корректно воспроизводить видео, но будет отображать длительность 0 секунд. Кроме того будет недоступна возможность прокрутки видео вперёд или назад.

Как получить длительность видео? Я не нашёл прямого способа. Я решил задачу совместив её с преобразованием в FLV из предыдущего пункта. Дело в том, что ffmpeg во время преобразования файла вываливает в stderr целую портянку подробного описания процесса. И раз уж мы всё-равно делаем это преобразование, остаётся только его проанализировать:

$out = array();
exec('/usr/local/bin/ffmpeg -i '.$src_file.' -ar 22050 -y '.$dst_file
                              .' 2>&1| grep Duration', $out);

if (count($out)){
	$duration=substr($out[0],12,11);
	$duration= substr($duration,0,2)*3600
                  +substr($duration,3,2)*60
                  +substr($duration,6);
}

Заключение
=============================
У кого какие мысли? Как можно было сделать лучше?

Делаем свой видеохостинг: Один комментарий

  1. Блоголётчик

    Можно обойтись без jsдля плеера — он все равно вставляет html тег object (или его аналог). Можно либо сразу самому вставлять html флеша, либо своим скриптом — дешевле обойтется. Родной скрипт плеера нужен для связи с апи плеера, но это как правило для тонких ценителей.

Комментарии запрещены.