Видеохостинг: как разместить видео на своём сайте. Часть 2.
Данный материал является продолжением статьи Видеохостинг: как разместить видео на своём сайте. Часть 1.
В этой статье я бы хотел представить вам руководство по созданию собственного видеохостинга на 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
upload_max_filesize=100M
max_execution_time=1000
max_input_time=1000
.htaccess
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 .
Ограничение количества загружаемых файлов
Забавно, но в корневом модуле Upload невозможно ограничить количество файлов для загрузки в аттачменты.
Допустим, мы хотим, чтобы пользователь мог загружать только один видеофайл для каждой ноды - довольно логично, неправда ли? Можно было бы воспользоваться модулем FileField, но вот вопрос - как заставить работать их в одной связке с FlashVideo? Дело в том, что FlashVideo ролик может быть засабмитен только через Upload аттачмент, но не через FileField. Соотвественно необходимо это как-то исправить.
Самым правильным способом, конечно же, было бы переделать модуль FlashVideo и добиться коммита в CVS проекта.
Однако, когда я столкнулся с подобной проблемой я был очень ограничен по времени, так что у меня родилось следующее решение:
1. Устанавливаем модуль FileField.
2. Добавляем в тип ноды video поле типа file (машинное имя - upload_video) и прописываем разрешенные для загрузки типы файлов.
2. Создаем собственный модуль (назовем его fff) и помещаем в него следующий код:
{
//если тип ноды 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 подменяется на структуру аттачмента и, вуаля - все работает так как нам надо!
Из недостатков данного решения можно отметить то, что в базе остается неиспользуемое поле аттачментов.
- 7880 просмотров

Комментарии
Интересная статья! Но я не
Интересная статья! Но я не до конца понял как же все-таки сделать это!
Можете более подробней разъяснить??
Спасибо. А что конкретно не
Спасибо. А что конкретно не понятно? Кстати, в версии для 6го Drupal есть встроенная поддержка filefield.
Интересно стало, а
Интересно стало, а комментарии которые не нравятся автору здесь удаляют?
Комментарии, являющиеся
Комментарии, являющиеся несодержательным спамом, удаляются.
пока я жив, я буду помнить
пока я жив, я буду помнить ваш ресурс
заношу в букмарки….
здравствуйте. два дня бился
здравствуйте. два дня бился с друпалом (до этого о нем и не слышал) безрезультатно. Выложите пожалуйста скрины настроек, особенно FlashVideo...и по возможности путь где следует внести изменения по скрину...думаю это очень упростит установку для новичков в друпал-е. заранее спасибо.
Я чото одного не могу
Я чото одного не могу сделать: у меня видео отображается просто как список, тоесть я не знаю как его воспроизвести...
Отправить комментарий