Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 132, ДЕКАБРЬ 2009 г.

Говорит и показывает Web 2.0: создаем собственный YouTube

Сегодня во всемирной паутине видео находится на пике своей популярности, каждый день рождаются новые интернет-телеканалы и видеохостинги, возможности обмена видеоматериалами встраиваются в социальные сети. Это невероятно прибыльная ниша, и оставаться в стороне — непозво лительная роскошь. Из статьи ты узнаешь, как работает видео хостинг и получишь пошаговые инструкции по созданию своего сервиса наподобие ютуба.

Видео на сайте

Есть несколько способов организовать показ видео на своем сайте. Наиболее простой и менее затратный с точки зрения финансов — использование API сторонних видео-сервисов (таких, как youtube.com) для встраивания видео в страницу. В первом случае этот подход выглядит просто как подключение специального плагина к CMS (например, Embedded Media Field для Drupal), который как раз и позволяет проигрывать видео, опубликованное на одном из видео-сервисов. Однако в этой схеме кроется серьезный минус. Для публикации видео на твоем сайте пользователю придется сначала перейти на сайт видео-сервиса, залить видео, скопировать ссылку, передать ее тебе, после чего ты сможешь скормить ее плагину, который встроит видео в сайт.

Минус можно превратить в плюс, если воспользоваться другим плагином, предназначенным для заливки видео на различные сервисы (например, плагин Video Upload для Drupal).

Это позволит тебе и другим пользователям воспользоваться специальной формой для заливки своего видео, а при некоторой доработке и скрещивании с плагином для показа видео — и для автоматического встраивания его в страницу.

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

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

Цены за услуги подобного провайдера хоть и кусаются (в среднем — несколько сотен долларов в месяц), но вполне приемлемы для компаний, не имеющих собственных специалистов или времени для создания полноценного видео-сервиса.

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

Свой Youtube

Итак, ты решил остановиться на создании своей версии YouTube с блэкджеком и клубничкой. Для начала тебе понадобится мощный выделенный сервер с объемным хранилищем данных (нескольких Тб на первое время хватит). Хостинги отметаются сразу, потому как: а) видео-сервис создает существенные нагрузки, и большинство хостеров просто не смогут предоставить тебе достаточных мощностей; б) для организации видео-сервиса на сервер должны быть предустановлены некоторые не совсем стандартные софтины, например mencoder или ffmpeg.

Далее ты должен определиться с тем, в каком формате посетители будут получать контент с твоего ресурса. Ясно, что лучше использовать FLV, но FLV — всего лишь контейнер, внутри которого хранится видео, закодированное выбранным тобой кодеком. В простейшем случае это будет H.263, то есть MPEG-1 или MPEG-2 с битрейтом порядка 100 Кбит/с. Сжатые с помощью H.263 ролики характеризуются малым весом и низким качеством, благодаря чему могут передаваться по низкоскоростным каналам связи, проигрываться на маломощных устройствах, но в то же время они очень убоги в визуальном плане. YouTube и большинство других видеохостингов использует H.263 по умолчанию.

Начиная с девятой версии, флеш-плеер от Adobe поддерживает также и кодек H.264, более известный под именами AVC и MPEG-4 Part 12. H.264 позволяет передавать ролики в весьма высоком качестве, ценой чему будет невозможность его проигрывания на маломощных устройствах (смартфоны, некоторые нетбуки). В то же время вес ролика может оставаться прежним.

Некоторые видеохостинги (тот же YouTube) кодируют заливаемое на его сервера видео одновременно двумя кодеками: H.263 и H.264. Благодаря этому пользователь вправе сам выбрать качество просматриваемого ролика. Но есть и обратная сторона медали: такое «двуличие» создает большую нагрузку на сервер, поскольку теперь требуется два прогона кодировщика (причем кодировщик H.264 съедает гораздо больше процессорных ресурсов и памяти) и больший объем дисковой памяти.

И — третье. Ты должен создать соответствующую инфраструктуру для кодирования роликов и отдачи их посетителям. Эта инфраструктура должна включать в себя движок перекодировки, базу данных, флешплеер, а также всю наружную обертку сайта. Движок для кодирования видео обычно строится поверх знакомых всем юниксоидам универсальных инструментов для обработки видео — ffmpeg, mencoder или коммерческого решения под названием Sothink Video Encoder Engine (www.sothink.com/product/video-encoderengine/linux.htm).
База данных используется для хранения информации о роликах, посетителях, популярности и всем том, что может понадобиться для ведения статистики. Флеш-плеер может быть выбран, исходя из личных предпочтений, хотя обычно выбор падает на JW Player (www.longtailvideo.com/players/jw-flv-player), полностью открытый и бесплатный для некоммерческого использования (но стоящий денег, совсем небольших, надо сказать, в случае применения для создания коммерческих сайтов).

Для объединения всего этого вместе может быть использована почти любая CMS, имеющая специальные плагины, предназначенные для создания системы распространения видео-контента. Такие плагины есть для Drupal, Joomla и многих других. При правильной переработке они легко превратятся в то, что нужно конкретно тебе. Кроме того, существует множество скриптов (в большинстве своем платных), которые можно использовать в качестве фундамента будущего сайта: www.buyscripts.in/youtube_clone.html, www.alstrasoft.com/videoshare.htm, www.clip-share.com.

Как это работает

Для описания всех этапов создания видеохостинга потребовалась бы целая книга, поэтому в этом разделе я дам лишь краткое описание того, как работает простейшая система потокового вещания видео в стиле Web 2.0.

Все начинается с заполнения посетителем специальной формы, значения полей которой передаются скрипту, осуществляющему загрузку видео с машины клиента и помещающему его в некое хранилище на сервере. Имя посетителя, раздел, куда следует поместить ролик, и другие данные записываются в базу данных. Далее происходит вызов скрипта, ответственного за перекодировку видео. Он исполняет примерно такую команду:

# mencoder input.avi -ofps 12 -o video.flv -of lavf -lavfopts
i_certify_that_my_video_stream_does_not_use_b_frames -oac lavc -lavcopts
acodec=mp3:abitrate=32 -srate 22050 -ovc lavc -lavcopts
vcodec=flv:
vbitrate=100:mbd=2:mv0:trell:v4mv:cbp:last_
pred=3:predia=2:dia=2:
vmax_b_frames=0:vb_strategy=1:precmp=2:cmp=2:subcmp=2:
preme=2:qns=2
-vop scale=360:240

Где опции vbitrate=100 и scale=360:240 задают битрейт, равный 100 Кбит/с (оптимальный вариант для соединений в 128 Кб/с) и размер 360:240. Ролик помещается в отдельное хранилище, его метаданные и место размещения заносятся в БД, оригинал удаляется (или остается на месте).

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

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

Пример встраивания видео в HTML-страницу

<!-- Создаем контейнер для объекта -->
<div id="container"><a href="http://get.adobe.com/
flashplayer">Get the Flash Player</a> to see this
player.</div>
<!-- Импортируем javascript -->
<script type="text/javascript" src="./javascript/
swfobject.js"></script>
<script type="text/javascript">
/* player.swf — главный объект для загрузки flv */
var object1 = new SWFObject('./javascript/player.swf','
mediaplayer','400','300','8');
object1.addParam('allowscriptaccess','alway
s');
object1.addParam('allowfullscreen','true');
object1.addVariable('width','360');
object1.addVariable('height','300');
/* Шкурка плейера */
object1.addVariable("skin", "./skin/fashion.swf");
/* Превью */
object1.addVariable('image','./video/
preview.jpg');
/* Источник видео */
object1.addVariable('file','../video/
YupiSugianto.flv');
/* Имя контейнера */
object1.write('container');
</script>

И это, как ни странно, все. Превью ролика, обычно отображаемое при его загрузке, а также на страницах поиска и в списках роликов, генерируется все тем же скриптом-кодировщиком, а его адрес помещается в БД. Это самый примитивный вариант видеохостинга, размещенного на одной машине. Он не способен выдержать высокой нагрузки и легко загибается от заливки на сайт сразу нескольких роликов. Некоторые скрипты и специализированные CMS позволяют запускать перекодировщик во время наименьшей нагрузки или по расписанию cron, чтобы хоть как-то повысить жизнеспособность сервиса, но это спасает лишь на первых порах. Хостинг с высокой посещаемостью использует распределенную систему обработки запросов, отдачи результатов и загрузки файлов для поддержания сервиса на плаву. Организована она примерно так:

1. Выделенная машина или несколько машин выступают в роли фронтендов — серверов, играющих роль «лица» сервиса. Они предназначены только для просмотра HTMLсодержимого сайта (но не самих роликов).

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

3. Для кодирования видео используется другая сеть серверов. Загруженное пользователями видео попадает на один из data-серверов, описанных во втором пункте. После этого запрос на декодирование уходит к наименее загруженному вычислительному серверу (compute node), ответственному за преобразование видео в FLV. Закончив процесс кодинга, он загружает результат обратно на data-сервер, извещает об этом фронтенд, который теперь может показать ролик всем посетителям сайта.

Описанная схема, конечно, намного более сложна и обычно включает в себя сеть так называемых «управляющих серверов», отвечающих за консолидацию работы и связь всех машин сети в единую систему, а также технологии, используемые в GRID и облачных вычислениях. Часто в качестве хранилища данных, как, впрочем, и вычислительных серверов, используются сервисы Amazon, которые уже имеют стойкую, проверенную временем инфраструктуру, позволяющую без лишних танцев с бубном объединить машины в единый кластер.

PHPMOTION — мультимедиа-сервис из коробки

Самые ленивые могут воспользоваться готовыми решениями для организации видеохостинга. Называются они Media Sharing CMS и предлагают уже сформированную и отлаженную инфраструктуру для организации различных мультимедиа-порталов, таких как видеохостинги, сервисы хранения и обработки изображений, а также веб-радиостанции. Наиболее популярное решение в этой области — CMS PHPMotion (www.phpmotion.com).

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

Гибкая панель администрирования позволяет управлять всем этим через web-интерфейс, а система шаблонов — подогнать сайт под любой дизайн. Перед установкой ты можешь ознакомиться с возможностями PHPmotion, перейдя на тестовую площадку http://v3beta.phpmotion.net.

Перед развертыванием PHPmotion нужно позаботиться об установке на сервер следующих компонентов: Зависимости PHPmotion PHP 4.3 или выше для версии 2 и PHP 5 для версии 3 (с поддержкой CLI)

MySQL
Mp3-кодер LAME
Libogg и Libvorbis
Mencoder и Mplayer
FFMpeg-PHP
php-gd версии 2 или выше

В Ubuntu Linux все эти компоненты уже есть в репозитории, поэтому для их установки достаточно выполнить одну команду:

$ sudo apt-get install
mysql-server mysql-client lame libogg0
libvorbis libvorbis0 mplayer mencoder
apache2 php5 php5-gd php5-ffmpeg php5-mysql
php5-cli libapache2-mod-auth-mysql

Кроме дополнительных пакетов, PHPmotion требует особой настройки PHP, конфигурационный файл которого должен включать следующие строки:

$ sudo vi /etc/php5/apache2/php.ini
open_basedir =
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 1500
session.gc_maxlifetime = 14000
safe_mode = off
enable_dl = On

Где upload_max_filesize — это максимальный размер загружаемого файла, post_max_size — максимальный размер POST'а, max_execution_ time — максимальное количество секунд, в течение которых может исполняться скрипт, session.gc_maxlifetime — временной интервал между запусками сборщика мусора. Опция enable_dl активирует функцию dl(), необходимую для загрузки сторонних бинарных модулей PHP. После окончания установки и конфигурирования скачай дистрибутивный пакет PHPmotion (http://downloads.phpmotion.com/V3.0/php5/phpmotion.zip) и распакуй его в каталог /var/www:

$ cd /var
$ sudo unzip /путь/к/phpmotion.zip -x
$ sudo rm -rf www
$ sudo mv phpmotion www
$ sudo chmod -R 755 www/cgi-bin

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

* /phpshiled/
* /classes/config.php
* /addons/customprofile/pimp.class.php
* /addons/customprofile/index.php

Они закодированы с помощью PHP-модуля PHPshield, который есть в дистрибутиве PHPmotion. Скопируй его в каталог /usr/lib/ php5/20060613+lfs:

$ sudo cp www/phpshield/phpshield.5.2.lin /usr/lib/php5/20060613+lfs

И добавь в конец файла /etc/php5/apache2/php.ini строку:

extension=phpshield.5.2.lin

По умолчанию Apache в Ubuntu (и Debian) настроен на поиск каталога cgi-bin в /usr/lib, а значит, конфигурацию придется изменить. Открой файл /etc/apache2/sites-enabled/000-default и замени строки /usr/lib/ cgi-bin на /var/www/cgi-bin.

PHPmotion использует apache-модуль mod_rewrite, поэтому его вызов необходимо добавить в конфиг apache2:

$ sudo a2enmod rewrite
$ sudo /etc/init.d/apache2 restart

Далее открой в браузере страничку www.твой-сайт.com/setup и следуй инструкциям помощника. Он проведет тебя через финальные этапы настройки, включающие настройку доступа через FTP, установку правильных прав доступа на файлы и каталоги PHPmotion, настройку доступа к базе MySQL, ввод пароля и почтового ящика администратора и указание дополнительной информации о сайте. После этого удали каталог /var/www/setup (иначе PHPmotion запретит тебе вход). Это, в общем-то, все. Панель администратора находится по адресу www.твой-сайт.com/siteadmin. С ее помощью можно произвести множество настроек, среди которых — внутренние настройки PHPmotion, настройки движка перекодировки (например, битрейт, размер видео), возможность натянуть шкурки, управлять контентом и многое другое.

Выводы

Web уже перестал быть статичным и постепенно превращается в мощнейшую мультимедийную систему, позволяющую просматривать видео, слушать музыку, играть в игры, проводить видео-конференции. Телевидение и радио уступают место интерактивным интернет-технологиям, с помощью которых любой человек на Земле может организовать собственный телеканал или радиостанцию, сделать их популярными и зарабатывать деньги. Почему бы не воспользоваться такой возможностью? Тем более, как ты смог убедиться, создать свой телеканал не так уж и сложно.

Links

• Некоторые видеопровайдеры: www.ooyala.com, www.brightcove.com, b2b.viddler.com.

• Дополнительные темы для PHPmotion лежат по адресу www.phpmotiontemplates.com.

• Многофункциональный модуль для Drupal, превращающий сайт в видео хостинг: http://drupal.org/.

Содержание
ttfb: 12.378931045532 ms