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

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

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

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

Содержание этого поля является приватным и не предназначено к показу.
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.