?

Log in

No account? Create an account

Развитие личности, лайфхак, личный опыт, проекты и околоайтишные размышления - http://malkin.com.ua

Previous Entry Share Next Entry
Видеохостинг своими руками
Я
malkinstanislav

Originally published at Развитие личности, лайфхак, личный опыт, проекты и околоайтишные размышления. Персональный блог Станислава Малкина. You can comment here or there.

Как и обещал, немного расскажу о том, как создать свой видеохостинг «с нуля».

Все, что я дальше напишу — мой личный опыт и возможно не является доскональным решением вопроса и есть другие, более оптимальные (возможно даже в комментариях отметятся люди, которые знают как сделать лучше — буду благодарен).

Медиа-контент сегодня довольно популярен, несмотря на то, что на рынке пруд-пруди видеохостингов, есть место для небольших видеохостингов, которые могут вполне себе неплохо жить и иметь свою аудиторию.

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

Основная сложность, как на меня, это закачка, обработка и отдача видео.

Закачка видео

Основная задача и проблема, как на меня тут следующая: загрузка видео (как впрочем и его отдача) не должна тормозить работу веб-морды проекта. Следовательно, понадобиться две машины — одна будет содержать морду проекта, вторая будет отвечать за загрузку видео и его отдачу.

Одну машину называем host.ru, вторую upload.host.ru и используем технологию (звучит пафостно, но это не технология совсем, так, умное название) CDS — Cross Domain Scripting (больше об этом можно узнать в гугле). Это позволит нам с помощью javascript, отправлять запрос на upload.host.ru, а он, в свою очередь, благодаря CDS будет иметь возможность вызывать куски JavaScript-кода на host.ru, таким образом мы сможем мониторить процесс закачки, не используя для этого flash.

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

Таким образом все счастливы — пользователь видит информацию о прогрессе загрузки видео, веб-морда при этому работает в обычном режиме и не получает нагрузки, вторая машинка успешно загружает себе видео от пользователя напрямую.

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

Обработка видео

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

Машинка, которая называется upload.host.ru имела на борту у себя операционную систему Debian. На ней с помощью apt’a было установлено FFMpeg и Mencoder в качестве конвертеров для обработки видео.

Видео после того, как заливалось пользователем, складывалось в отдельную папку, откуда забиралось скриптом, который раз в минуту проверял список необработанных видео (у обработанных видео добавлялся префикс .processed в названии) и забирал на обработку.

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

Основная проблема с обработкой видео состояла в том, чтобы подобрать правильные ключи к конвертеру, которые будут обеспечивать максимально «правильную обработку» и перекодировку видео. Под наиболее правильной я понимаю такую, которая не будет увеличивать размер видео в результате перекодировки, будет уменьшать разрешение видео, если оно слишком большое и будет правильно его конвертировать. Т.к. я до этого вообще никакого понимания о видео и его особенностях и форматах толком не имел, для меня это стало основной головной болью, т.к. часто получалось, что либо видео не обрабатывалось, либо увеличивалось в размере, либо глючило (видео не совпадало с аудио), либо тормозило при проигрывании (разрешение при декодировке не было изменено, поэтому так происходило).

Во многих туториалах советую указывать битрейт видео при декодировании. Однако нельзя указывать тупо битрейт, не зная текущий битрейт видео. Например пользователь заливает видео с YouTube, которое имеет битрейт 68К. Тогда нужно сначала определить битрейт видео и только потом принять решение, в какой битрейт его кодировать. Я выбрал такую стратегию при кодировке видео:

  • Если битрейт видео больше 1024К, то видео кодируем в два битрейта — 128К и 1024К (для обладателей разных каналов по скорости интернет)
  • Если битрейт больше 128K, но меньше 1024K, то кодируем только в 128К
  • Если битрейт ниже 128К, то битрейт не меняем и используем ключи к ffmpeg такие «-sameq -vcodec copy». Где первый ключ говорит, что при кодировании нужно сохранить тоже качество видео, что и у исходного файла, а второй говорит, что нужно скопировать кодек для кодирования из исходника.

Определить текущий битрейт видео можно довольно просто (не забудьте только поставить mplayer в системе), запустив следующую команду в консоли:

mplayer $wrkfile -identify -vo null -nocache -nolirc -nojoystick
-channels 6 -loop 1 -frames 1 | grep ID_VIDEO_BITRATE

Бывают случаи, когда mplayer не определяет битрейт видео, либо ставит его равным 0, тогда для определения битрейта можно воспользоваться утилитой ffprobe (установить можно через apt-get install ffprobe). Команда следующая:

ffprobe -show_files $wrkfile | grep bit_rate

$wrkfile — полный путь к видеофайлу, информацию о котором мы хотим получить.

Аналогичными командами можно получить и разрешение текущего видео:

mplayer $wrkfile -identify -vo null -nocache -nolirc -nojoystick
-channels 6 -loop 1 -frames 1 | grep ID_VIDEO_WIDTH

mplayer $wrkfile -identify -vo null -nocache -nolirc -nojoystick
-channels 6 -loop 1 -frames 1 | grep ID_VIDEO_HEIGHT

по которым можно принять решение, нужно ли менять разрешение видео. Я для себя решил, что видео буду конвертировать с разрешением 640 на 480, если закачанное видео больше этого разрешения.

После получения исходных данных о видео — можно его кодировать, указав правильные ключи для тех вещей, которые мы меняем. Вы можете о ключах узнать в руководстве к конвертерам, либо я более подробно опишу процесс конвертации в последующих заметках на эту тему, если будет нужно (или если попросят раскрыть тему полнее).

Все, теперь остается сгенерировать превьюшку-картинку для видео. Для этого можно использовать следующую команду из консоли:

ffmpeg -ss $seconds -i $outfile -vcodec mjpeg -vframes 1 -an
-f rawvideo -s $thumb_size preview.jpg

Данная команда сгенерирует картинку в формате jpeg для указанной секунды ($seconds) обработанного видео ($outfile) указанного размера ($thumb_size — в формате 160×120). Таким образом можно сделать несколько картинок-превьюшек для видео и сделать что-то по типу «карусели» при наведении пользователем мыши на изображение, показав ему, о чем видео с помощью картинок.

На этом обработка видео завершена, данные можно записывать в базу с флагом, что видео обработалось.

Отдача видео

С этим вопросом я тоже не стыкался до этого в целом. Решено было отдавать видео пользователям посредством Nginx, как веб-сервера. Он позволяет ограничить скорость потока отдачи (мы поставили отдачу в 2М, как лимит), кроме того более оптимально работает, чем апач для этих целей. Более подробно о Nginx можно узнать опять же, в гугле.

Настроив домашнюю директорию, куда складируются обработанные видео, теперь можно отдавать видеофайлы в наш выбранный флеш-плеер.

Отдельным вопросом стоит вопрос псевдо-стриминга, технологии (если ее так можно назвать), которая позволяет пользователю смотреть видео с любого момента, не дожидаясь загрузки файла до этого фрагмента. Например сразу перескочить в конец файла и посмотреть его, не загружая целиком. Очень удобно.

Для решения этой задачи, опять же, использовался Nginx, т.к. он уже содержит готовый модуль для этих целей — http://sysoev.ru/nginx/docs/http/ngx_http_flv_module.html (при условии, что мы отдаем конент в формате flv. Но можно отдавать и в mp4, плагин для псевдостриминга для mp4 для nginx тоже есть — http://wiki.nginx.org/NginxMP4StreamingLite (вполне возможно есть и другие решения)

————————————————————————————

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

Если есть вопросы — пишите, постараюсь ответить, если буду знать ответ и будет время.

P.S. Про HTML5 и Theora можете не спрашивать, активно слежу за развитием в данной области, надеюсь, что скоро вообще не нужно будет использовать сторонние флеш-плееры и видео будет нужно конвертировать только в .ogv. Но пока, на сегодняшний день, технология еще сыровата, есть много проблем с ней, поэтому надеюсь, что скоро все поменяется в лучшую сторону, т.к. предпосылки к этому есть — Firefox уже поддерживает возможность проигрывание видео в HTML5, есть возможность переключения в полноэкранный режим и т.д. Но еще много чего нету. Жду.