Видеохостинг: как разместить видео на своём сайте

root

Administrator
Команда форума
Схема №1: Минимальное участие

Проще всего взвалить заботу по загрузке видеороликов на сторонние сервисы, такие как YouTube, Blip.TV или Revver. Денег платить не надо, пространство на вашем хостинге не задействовано, транслирование контента пользователю вашего сайта происходит через распределенную сеть серверов, принадлежащих видеохостингу, а это значит, что:
1) Ваш исходящий трафик не расходуется.
2) Видеоролики имеют высокую степень доступности пользователям из любой точки мира.
Но такие ресурсы могут иметь ряд ограничений или запретов, особенно касающихся использования данного сервиса коммерческими сайтами - так что внимательно читайте пользовательские соглашения, прежде чем реализовывать данную схему.
Выглядит она следующим образом: пользователь загружает ролик на стороннем сервисе и копирует ссылку на него, после чего сохраняет ее на вашем сайте, где она преобразуется при просмотре в соответствующее видео.
Для проигрывания роликов могу посоветовать модуль Embedded Media Field, который в данный момент поддерживает воспроизведение видеороликов с почти двух десятков видеохостингов и агрегаторов.
Из минусов данной схемы можно отметить то, что пользователю для загрузки видео придется покинуть ваш сайт, он не сможет выбрать качество конвертации, внешний вид плеера будет статичен или ограничен несколькими вариантами, тоже самое можно сказать про его функциональность. Также опционально поверх ролика может быть наложено лого сервиса, до или после отображена реклама и т.д.
В общем, вариант из разряда "дешево и сердито", крайне скудный в плане конфигурирования.

Схема №2: Удобное размещение

В этом случае пользователи загружает видео на сторонний сервис непосредственно с вашего сайта, при этом ролики обычно размещаются под единственным аккаунтом. Место на хостинге может использоваться для временного сохранения видео до момента последующего трансфера на выбранный сервис, или не использоваться вовсе.
В качестве примера - модуль Video Upload для YouTube.
Стоит отметить, что многие сервисы бесплатно предоставляют API под подобные задачи или даже полноценные сайты-заготовки, например в рамках партнерских программ.
При этом АPI обычно пишется для многих языков программирования, и почти всегда присутствует Javascript API, благодаря чему такую схему можно очень просто воплотить в жизнь. Исходя из личного опыта, могу сказать, что PHP API, предоставляемое [http://rutube.ru/ Rutube], с минимальными усилиями по переделке интегрируется с Drupal.

Схема №3: Профессиональные видео-провайдеры

А теперь пришло время рассмотреть компании, специализирующиеся на создании любых мыслимых сервисов, так или иначе связанных с видео и интернетом. Такие компании называются видео провайдерами (video provider), и используют собственные сети доставки контента (CDN - content delivery network). Для работы с ними необходимо создать аккаунт, стоимость которого зависит от используемого спектра услуг, объемов загружаемого и транслируемого видео, желаемой функциональности, уровня технической поддержки, объемов работ по внедрению или переходу на данную платформу, необходимому API и пр. Зачастую вместо конкретных цен на сайте видео провайдера можно обнаружить предложение написать письмо или позвонить - в этом случае готовьтесь, что цены на услуги будут начинаться с нескольких сотен долларов в месяц.
Итак, что же можно получить за порой немаленькую сумму денег?
1) Изменение внешнего вида флеш плеера под ваш дизайн и функционал, создание виджетов.
2) Декодирование в любой нужный вам формат, в том числе и <на лету>.
3) Предоставление необходимых инструментов для массовой загрузки видеороликов, отчетности и аналитики.
4) Создание собственного интернет-телеканала.
5) Редактирование видеороликов онлайн, микширование.
6) Загрузка контента пользователей, удобное управление их аккаунтами и правами.
7) Внедрение рекламы, участие в рекламных сетях.
И это далеко не полный список, который варьируется от провайдера к провайдеру, среди которых: brightcove, viddler, ooyala, thePlatform, Onstream media, magnify.net, iPlayerHD, fliqz, Kaltura (модуль для Drupal - http://drupal.org/project/kaltura/).

Схема №4: Видеохостинг своими руками

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

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

Введение

Первое, о чем стоит задуматься, создавая собственный видеохостинг - это о том, где же будут храниться видеоролики. В случае, если вы решите размещать их у себя на хостинге, стоит озаботиться подбором подходящего выделенного сервера. Альтернативным вариантом является размещение контента на сторонних серверах, например в рамках Amazon Simple Storage Service (Amazon s3) - такая возможность также присутствует в FlashVideo.

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

ffmpeg
Для работы модуля необходима программа ffmpeg, которая позволяет конвертировать видео из одного формата в другой. Соответственно, ваш хостер должен предоставлять такую возможность.
К слову, поддержка ffmpeg - далеко не редкость, так что с этим не должно возникнуть проблем. Как установить ffmpeg на локальной windows-машине, использующей Denwer, можно в частности прочитать тут.

Настраиваем параметры php

Далее, для корректной работы модуля вам необходимо поменять настройки ряда php параметров:
  • upload_max_filesize - задает максимальный размер загружаемого файла;
  • post_max_size - определяет максимальный размер POST`а, который должен быть больше либо равен upload_max_filesize;
  • max_execution_time - устанавливает максимальное количество секунд, которое может исполнятся скрипт. Данный параметр должен обеспечивать достаточное количество времени для конвертации больших файлов.
  • max_input_time - максимальное количество секунд, в течении которых скрипт может считывать входящие данные. Слишком маленькое выставленное время приведет к тайм-ауту больших по весу загрузок.
Автор модуля рекомендует выставить следующие значения (либо в php.ini, либо в корневом .htaccess файле):

php.ini

post_max_size=100M
upload_max_filesize=100M
max_execution_time=1000
max_input_time=1000

.htaccess

php_value post_max_size 100M
php_value upload_max_filesize 100M
php_value max_execution_time 1000
php_value max_input_time 1000

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

Конфигурируем FlashVideo и ставим плеер

Теперь необходимо включить модуль ядра Upload, а также установить CCK и FlashVideo.
Далее создадим новый тип ноды, который будет содержать в себе видеоролик с описанием, и назовем тип материала, скажем, video. Добавим текстовое многострочное поле, которое будет использоваться в качестве описания.
Зайдя на страницу конфигурирования FlashVideo можно увидеть, что он предоставляет настройки как для всех типов нод, так и для каждого материала в отдельности.
Рассмотрим наиболее важные:
1. Disable the [video] tag - запрещает использование тега [video]. По умолчанию, пользователь должен прописать данный тег в теле нода, чтобы отобразить видео.
Список параметров для тега можно посмотреть тут.
2. Convert videos immediately - разрешает модулю попытаться сконвертировать видео сразу же после его загрузки, не дожидаясь завершения работы крона. Поставим галочку для нашего примера.
3. Flash Player Name - содержит в себе имя флеш плеера. Он должен находится в той же директории, что и сконвертированные видеоролики.
4. ffmpeg Path - содержит в себе путь до исполняемого файла ffmpeg. Будьте внимательны, значение по умолчанию /usr/bin/ffmpeg в ОС Windows будет указывать на /usr/bin/ffmpeg.exe .
5. Delete Original Video - удаляет исходное видео после удачной конвертации. Очень советую включить для экономии места.
6. Output Directory - директория для хранения перекодированных видео и картинок превью. По умолчанию, такая же как и для файлов.
7. Maximum Conversions per Cron - максимальное количество видеороликов, которое модуль будет пытаться конвертировать за один прогон крона.
8. Log Conversion Data - сохраняет записи о процессе перекодировки и создания превьюшек в таблицу ffmpeg_data. Очень полезная опция для дебага, так что тоже отмечаем.

Для воспроизведения видеороликов вам потребуется флэш плеер, например протестированные в работе с FlashVideo плееры Dash Media Player или JW Player.
Прочитать краткий обзор ряда плееров можно тут. Для примера воспользуем JW Player.
В случае, если на вашем сайте включен public режим доступа к файлам, будет достаточно поместить файлы плеера в Output Directory.
Если же включен private режим, то вам будет необходимо создать запись до файла плеера в таблице files либо вручную, либо, например, загрузив файлы плеера при сохранении какой-либо ноды (если директория
для файлов совпадает с Output Directory). Не забудьте поменять Flash Player Name на правильный.

Проверка работы

Итак, пришло время создать ноду типа video. Загрузите видеоролик и разместите в описании тег [video]
Если после ее сохранения, вы видите, как в выбранном плеере воспроизводится ваш ролик, позвольте поздравить вас с победой!
Если же нет, то проверьте таблицу ffmpeg_data - если там есть записи, попытайтесь вручную запустить ffmpeg с указанными параметрами и посмотрите сообщения об ошибках. Также, если вы не включали конвертацию сразу же после загрузки и у вас не настроен или еще не запускался крон, стоит запустить его вручную.
Если записей об ошибках нет, но не видно плеера, то стоит проверить все ли его файлы вы скопировали в Output Directory, есть ли запись в БД в случае private метода загрузки файла и правильно ли указано имя плеера в Flash Player Name.

Статья автора модуля про FlashVideo (содержит раздел о проблемах) - http://www.travistidwell.com/flashvideo.
 

root

Administrator
Команда форума
Ограничение количества загружаемых файлов

Забавно, но в корневом модуле Upload невозможно ограничить количество файлов для загрузки в аттачменты.
Допустим, мы хотим, чтобы пользователь мог загружать только один видеофайл для каждой ноды - довольно логично, неправда ли? Можно было бы воспользоваться модулем FileField, но вот вопрос - как заставить работать их в одной связке с FlashVideo? Дело в том, что FlashVideo ролик может быть засабмитен только через Upload аттачмент, но не через FileField. Соотвественно необходимо это как-то исправить.
Самым правильным способом, конечно же, было бы переделать модуль FlashVideo и добиться коммита в CVS проекта.
Однако, когда я столкнулся с подобной проблемой я был очень ограничен по времени, так что у меня родилось следующее решение:
1. Устанавливаем модуль FileField.
2. Добавляем в тип ноды video поле типа file (машинное имя - upload_video) и прописываем разрешенные для загрузки типы файлов.
2. Создаем собственный модуль (назовем его fff) и помещаем в него следующий код:

function fff_form_alter($form_id, &$form)
{
//если тип ноды video
if ($form_id == 'video_node_form')
{
//убираем аттачменты
unset($form['attachments']);
//меняем функцию сабмита формы
unset($form['#submit']['node_form_submit']);
$form['#submit']['fff_redirect_submit'] = array();
$form["#submit"]['fff_redirect_submit']["#title"]='Save';
}

}

//конвертируем объект в массив
function object_2_array($data)
{
if(is_array($data) || is_object($data))
{
$result = array();
foreach ($data as $key => $value)
{
$result[$key] = object_2_array($value);
}
return $result;
}
return $data;
}

function fff_redirect_submit($form_id, $form_values)
{
//смотрим если есть старые файлы и помечаем
//их для удаления
if (count($form_values['field_upload_video']) == 2)
{
$node = new stdClass();
$node->vid = $form_values['vid'];
$files = upload_load($node);
$form_values['files'] = array();
foreach ($files as $file)
{
$file = object_2_array($file);
$file['remove'] = 1;
unset($file['vid']);
$form_values['files'][$file['fid']] = $file;
}
}
//сабмитим ноду дефолтным методом
$node_url = node_form_submit($form_id, $form_values);
//переходим на страницу сабмиченной ноды
return $node_url;
}

//ловим хук сабмита FlashVideo
function fff_flashvideo_submit(&$node, $params)
{
// определяем новый файл для конвертации
if (count($node->field_upload_video)== 2)
{
$upfield = $node->field_upload_video[1];
fff_convert_files(&$node, $upfield);
}
else if (count($node->field_upload_video)== 1 && !upload_load($node))
{
$upfield = $node->field_upload_video[0];
fff_convert_files(&$node, $upfield);
}
}

//переделываем структуру FileField в аттачмент
function fff_convert_files(&$node, $upfield)
{
$node->files['upload_0'] = array(
'description' => $upfield['description'],
'remove' => 0,
'list' => 1,
'filename' => $upfield['filename'],
'filepath' => $upfield['filepath'],
'filemime' => $upfield['filemime'],
'filesize' => $upfield['filesize'],
'fid' => 'upload_0'
);
$node->upload ='Upload';
$node->attach ='Attach';
$aturl='attach-url';
$node->$aturl = 'http://'.$_SERVER['HTTP_HOST'].'/upload/js';
$node->field_upload_video ='';
unset($node->field_upload_video);
}

function fff_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL)
{
if ($node->type == 'video')
{
switch ($op)
{
//обрабатываем edit
case 'prepare':
if (!$node->files)
{
break;
}
$videofile;
foreach($node->files as $file)
{
if($file->filemime == 'flv-application/octet-stream')
{
$videofile = $file;
}
}
if (!$videofile)
{
break;
}
//переделываем структуру аттачмента в FileField
$node->field_upload_video = array (0 => array(
'fid' => $videofile->fid,
'description' => $videofile->description,
'list' => 1,
'nid' => $videofile->nid,
'filename' => $videofile->filename,
'filepath' => $videofile->filepath,
'filemime' => $videofile->filemime,
'filesize' => $videofile->filesize
));

break;
}
}
}

В результате структура FileField подменяется на структуру аттачмента и, вуаля - все работает так как нам надо!
Из недостатков данного решения можно отметить то, что в базе остается неиспользуемое поле аттачментов.
 
Вверх