Skip to Content

Видеохостинг: как разместить видео на своём сайте. Часть 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

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 .

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

Забавно, но в корневом модуле 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 подменяется на структуру аттачмента и, вуаля - все работает так как нам надо!
Из недостатков данного решения можно отметить то, что в базе остается неиспользуемое поле аттачментов.

Комментарии

Интересная статья! Но я не

Интересная статья! Но я не до конца понял как же все-таки сделать это!
Можете более подробней разъяснить??

Спасибо. А что конкретно не

Спасибо. А что конкретно не понятно? Кстати, в версии для 6го Drupal есть встроенная поддержка filefield.

Интересно стало, а

Интересно стало, а комментарии которые не нравятся автору здесь удаляют?

Комментарии, являющиеся

Комментарии, являющиеся несодержательным спамом, удаляются.

пока я жив, я буду помнить

пока я жив, я буду помнить ваш ресурс Wink заношу в букмарки….

здравствуйте. два дня бился

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

Я чото одного не могу

Я чото одного не могу сделать: у меня видео отображается просто как список, тоесть я не знаю как его воспроизвести...

Существует ли алгоритм

Существует ли алгоритм оценки, какие пиковые нагрузки (количество одновременных просмотров) выдержит сервер. Или обратное - предполагая нагрузку, прикинуть нужные мощности)

Спасибо за хорошую статью.

Здравствуйте! Я думаю, вам

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

Спасибо за толковую статью.

Спасибо за толковую статью. Все настроил и установил не без ее помощи. Однако столкнулся с таким багом:

После сохранения вижу и плейер и ролик на странице, все проигрывается. Если уйти со страницы и попытаться зайти на нее снова - белый лист.

Не могу понять в чем дело. Подскажите плиз.

Все, разобрался. Такой баг

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

Спасибо, все работает,

Спасибо, все работает, комментарии тоже полезны.

Спасибо большое за статью,

Спасибо большое за статью, пока не ропбовал, но обязательно воспользуюсь.

На Хабре так же есть обзор флеплееров: http://habrahabr.ru/blogs/webdev/28196/

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
Smileys
:):D:bigsmile:;):p:O:|:(:~:((8):steve:J):glasses::party::love:
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <span> <div> <h2> <h3>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby>. Beside the tag style "<foo>" it is also possible to use "[foo]". PHP source code can also be enclosed in <?php ... ?> or <% ... %>.
  • Image links with 'rel="lightbox"' in the <a> tag will appear in a Lightbox when clicked on.
  • Image links from G2 are formatted for use with Lightbox2
  • Textual smileys will be replaced with graphical ones.
  • You may insert videos with [video:URL]

Подробнее о форматировании

Type the characters you see in the picture above; if you can't read them, submit the form and a new image will be generated.

CAPTCHA
Докажи, что ты не киборг!
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.