8,1
рейтинг
30 июля 2013 в 20:36

Дизайн → Создание полноценного видеохостинга своими руками (nginx+php5-fpm+ffmpeg+cumulusclips) из песочницы

Добрый день, хабровчане!

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

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

В основу лег освободившийся сервер! Не очень мощный, но довольно таки подходящий.

Intel® Xeon® CPU L5520 @ 2.27GHz
количество ядер 16
оперативной памяти 16372 Мб


Немного забегу вперед, при декодировании видео процессорная нагрузка достигает 500% (примерно 6 ядер);

Начнем с самого начала, из ОС я выбрал Ubuntu Server 13.04 x64 ввиду того, что больше времени провожу с ней и собственно разбираюсь я в ней лучше чем в других семействах Linux.

В качестве WEB сервера я выбрал связку nginx+php5-fpm, потому что nginx довольно успешно справляется с нагрузками, а так же отдачей видео.

nginx по умолчанию ставится без потокового модуля, поэтому ставим из сорцов

Необходимые зависимости для сборки пакетов:

apt-get install build-essential checkinstall subversion unzip yamdi imagemagick php5-curl libssl-dev zlib1g-dev libpcre3-dev rpl php5-fpm git


Скачиваем исходники:

cd /tmp
wget http://nginx.org/download/nginx-1.5.2.zip
unzip nginx-1.5.2.zip -d nginx/
rm -f nginx-1.5.2.zip
cd nginx


Скачиваем необходимые модули для стриминга:

mkdir modules
git clone https://github.com/masterzen/nginx-upload-progress-module.git modules/nginx-upload-progress-module
wget http://www.kernel-video-sharing.com/files/nginx_mod_h264_streaming-2.3.2.zip
unzip nginx_mod_h264_streaming-2.3.2.zip -d modules/
rm -f nginx_mod_h264_streaming-2.3.2.zip
git clone https://github.com/arut/nginx-rtmp-module.git modules/nginx-rtmp-module


Для удобства создаем установочный скрипт:

touch nginx.sh
nano nginx.sh

с содержимым
./configure \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--with-debug \
--with-http_stub_status_module \
--with-http_secure_link_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_mp4_module \
--with-http_flv_module \
--with-http_ssl_module \
--with-http_dav_module \
--with-md5=/usr/lib \
--add-module=modules/nginx-upload-progress-module \
--add-module=modules/nginx-rtmp-module \
--add-module=modules/nginx_mod_h264_streaming-2.3.2  

make -j16 (16 - количество ядер. ускоряет сборку пакета. Можно узнать командой "grep -c processor /proc/cpuinfo")

checkinstall


Возможно в процессе компиляции могут возникнуть ошибки. Поэтому делаем так:

В файле auto/cc/gcc комментируем строчку:

#CFLAGS="$CFLAGS -Werror"


Запускаем:
sh nginx.sh


После установки создаем необходимые симлинки и директории (если не создались):

ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
mkdir -p /var/lib/nginx/body
mkdir /var/lib/nginx/proxy
mkdir /var/lib/nginx/fastcgi
chown -R root /var/lib/nginx/
wget http://nginx-init-ubuntu.googlecode.com/files/nginx-init-ubuntu_v2.0.0-RC2.tar.bz2
tar -jxvf nginx-init-ubuntu_v2.0.0-RC2.tar.bz2 -C /etc/init.d/
chmod 715 /etc/init.d/nginx
/usr/sbin/update-rc.d -f nginx defaults
rm -f nginx-init-ubuntu_v2.0.0-RC2.tar.bz2
rpl 'DAEMON=/usr/local/sbin/nginx' 'DAEMON=/usr/local/nginx/sbin/nginx' /etc/init.d/nginx
rpl 'NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"' 'NGINX_CONF_FILE="/etc/nginx/nginx.conf"' /etc/init.d/nginx


На этом установка nginx и php5-fpm завершена.
К настройке вернемся позже.

Следующим на очереди стоит ffmpeg. Установка apt-get не желательна, проект уже депрекейтет и многое отказывается работать. В поисках адекватной и более свежей инструкции я провел почти 2 ночи. Не скрою, нашел доповольно таки хороший пак для установки.

Как ни странно проект называется www.ffmpeginstaller.com и даже при наличии всех инсталяторов в открытом доступе предлагает свои услуги за 50 баксов.

А делается все довольно просто.
Скачиваем пакет:

cd  /tmp
wget http://mirror.ffmpeginstaller.com/old/scripts/ffmpeg7/ffmpeginstaller.7.4.tar.gz
tar -xzf ffmpeginstaller.7.4.tar.gz ffmpeg
cd ffmpeg


После первой установки я понял… не хватает кодека. Отмотаем <<< Ставим кодек до установки:

apt-get install libvpx


Открываем ffmpeg.sh и добавляем кодек "--enable-libvpx" в установку:

nano ffmpeg.sh
./configure --prefix=$INSTALL_DDIR --enable-shared --enable-nonfree \
                --enable-gpl --enable-pthreads  --enable-libopencore-amrnb  --enable-decoder=liba52 \
                --enable-libopencore-amrwb  --enable-libfaac  --enable-libmp3lame \
                --enable-libtheora --enable-libvorbis  --enable-libx264  --enable-libxvid --enable-libvpx \
                --extra-cflags=-I/usr/local/cpffmpeg/include/ --extra-ldflags=-L/usr/local/cpffmpeg/lib \
                --enable-version3 --extra-version=syslint


На этом подготовка завершена. Можно устанавливать: sh start.sh

Установка займет минут 15-20 в зависимостти от возможностей железа. Можно пойти попить чаю (или кофе).

После установки выполняем:

hash x264 ffmpeg ffplay


Вырезку смотреть в P.S.

Все. Поздравляю, мы это сделали!

Теперь нам нужна CMS для управления этими инструментами

Вариантов было немного, а точнее всего 2 (а под мои нужды подходила только одна — cumulusclips).
Код исходников понятен, без лишней нервотрепки разобрался с составляющей. Вот только пришлось проект переписывать с mysql на mysqli. Весь код CMS структурирован и темлпейты лежат отдельно и гибко настраиваются. За основу выбрал шаблон псевдо Ютуба.

Пришлось полностью перекрутить проигрыватель, т.к. jwplayer был неспособен переключать видеопотоки. Немного полазив по github нашел незамысловатый плеер под простым названием jQplayer.
Данный плеер способен легко переключать потоки. Правда есть один минус. Проигрывание файла начинается с начала. И это не оказалось проблемой — видеофайлы легко режутся nginx из коробки.

Теперь нам нужно настроить web хостинг для нашего проекта.
Прилагаю небольшой скрипт для автоматизации данного процесса. В комплекте с CMS лежал .htaccess — а nginx его понимать отказывается, поэтому я его переписал под нужды данного web сервера.
Пример моего конфига
#!/bin/bash
echo -n "Введите имя создаваемого хоста: " 
read host 
echo -n "Введите имя пользователя nginx: " 
read users 
sap=/etc/nginx/sites-available/$host.conf 
mkdir -p /var/hosting/
touch $sap 
chmod 777 $sap 
directives="upstream backend-${host} {server unix:/var/run/php5-${host}.sock;} 
server {
    listen 80;
    server_name ${host} www.${host};
    root /var/hosting/${host}/www;
    access_log /var/log/nginx/${host}-access.log;
    error_log /var/log/nginx/${host}-error.log;
    index index.php;
    rewrite_log on;
    if ($host = '${host}' ) {
        rewrite ^/(.*)$ http://www.${host}/$1 permanent;
    }    
    location /im {
        rewrite ^/im/(.*)$ /cc-core/controllers/thumbs.php?$1 last;
    }
    location /videos {
        rewrite ^/videos/([0-9]+)/(.*)$ /cc-core/controllers/play.php?vid=$1 last;
        rewrite ^/videos/page/([0-9]+)/$ /cc-core/controllers/videos.php?page=$1 last;
        rewrite ^/videos/(most-recent|most-viewed|most-discussed|most-rated)/$ /cc-core/controllers/videos.php?load=$1 last;
        rewrite ^/videos/(most-recent|most-viewed|most-discussed|most-rated)/page/([0-9]+)/$ /cc-core/controllers/videos.php?load=$1&page=$2 last;
        rewrite ^/videos/([a-zA-Z0-9\-]+)/$ /cc-core/controllers/videos.php?category=$1 last;
        rewrite ^/videos/([a-zA-Z-]+)/page/([0-9]+)/$ /cc-core/controllers/videos.php?category=$1&page=$2 last;
        rewrite ^/videos/([0-9]+)/comments/$ /cc-core/controllers/comments.php?vid=$1 last;
        rewrite ^/videos/([0-9]+)/comments/page/([0-9]+)/$ /cc-core/controllers/comments.php?vid=$1&page=$2 last;
        rewrite ^/videos/$ /cc-core/controllers/videos.php last;
    }    
    location /private {
        rewrite ^/private/get/$ /cc-core/controllers/play.php?get_private=true last;
        rewrite ^/private/videos/([a-zA-Z0-9]+)/$ /cc-core/controllers/play.php?private=$1 last;
        rewrite ^/private/comments/([a-zA-Z0-9]+)/$ /cc-core/controllers/comments.php?private=$1 last;
        rewrite ^/private/comments/([a-zA-Z0-9]+)/page/([a-z0-9]+)/$ /cc-core/controllers/comments.php?private=$1&page=$2 last;
    }    
    location /members {        
        rewrite ^/members/page/([0-9]+)/$ /cc-core/controllers/members.php?page=$1 last;
        rewrite ^/members/([a-zA-Z0-9]+)/$ /cc-core/controllers/profile.php?username=$1 last;
        rewrite ^/members/([a-zA-Z0-9]+)/videos/$ /cc-core/controllers/member_videos.php?username=$1 last;
        rewrite ^/members/([a-zA-Z0-9]+)/videos/page/([0-9]+)/$ /cc-core/controllers/member_videos.php?username=$1&page=$2 last;
        rewrite ^/members/$ /cc-core/controllers/members.php last;
    }    
    location /search {
        rewrite ^/search(/page/([0-9]+))?/$ /cc-core/controllers/search.php?page=$2 last;
    }    
    location /login {
        rewrite ^(.*)$ /cc-core/controllers/login.php last;
    }    
    location /login/forgot {
        rewrite ^(.*)$ /cc-core/controllers/login.php?action=forgot last;
    }    
    location /logout {
        rewrite ^(.*)$ /cc-core/system/logout.php last;
    }    
    location /register {
        rewrite ^(.*)$ /cc-core/controllers/register.php last;
    }    
    location /activate {
        rewrite ^(.*)$ /cc-core/controllers/activate.php last;
    }    
    location /opt {
        rewrite ^/opt-out/$ /cc-core/controllers/opt_out.php last;
    }    
    location /contact {
        rewrite ^(.*)$ /cc-core/controllers/contact.php last;
    }    
    location /embed {
        rewrite ^/embed/([0-9]+)/$ /cc-core/system/embed.php?vid=$1 last;
    }    
    location /page {
        rewrite ^(.*)$ /cc-core/system/page.php last;
    } 
    location /translation {
        rewrite ^(.*)$ /cc-core/system/translation.php last;
    }    
    location /notify {
        rewrite ^(.*)$ /cc-core/system/notify.php last;
    }    
    location /language/get {
        rewrite ^(.*)$ /cc-core/system/language.php?get last;
    }    
    location /language {
        rewrite ^/language/set/(.*)/$ /cc-core/system/language.php?set&language=$1 last;
    }    
    location /feed {
        rewrite ^/feed(/([a-zA-Z0-9]+))?/$ /cc-core/system/feed.php?username=$2 last;
    }    
    location /video {
        rewrite ^/video-sitemap(-([0-9]+))?\.xml$ /cc-core/system/video_sitemap.php?page=$2 last;
    }    
    location /myaccount/upload/avatar {
        rewrite ^(.*)$ /cc-core/system/avatar.ajax.php last;
    }    
    location /myaccount/upload/validate {
        rewrite ^(.*)$ /cc-core/system/upload.ajax.php last;
    }    
    location /myaccount/grab/validate {
        rewrite ^(.*)$ /cc-core/system/grab.ajax.php last;
    }    
    location /actions/username {
        rewrite ^(.*)$ /cc-core/system/username.ajax.php last;
    }    
    location /actions/flag {
        rewrite ^(.*)$ /cc-core/system/flag.ajax.php last;
    }    
    location /actions/favorite {
        rewrite ^(.*)$ /cc-core/system/favorite.ajax.php last;
    }    
    location /actions/subscribe {
        rewrite ^(.*)$ /cc-core/system/subscribe.ajax.php last;
    }    
    location /actions/rate {
        rewrite ^(.*)$ /cc-core/system/rate.ajax.php last;
    }    
    location /actions/comment {
        rewrite ^(.*)$ /cc-core/system/comment.ajax.php last;
    }    
    location /actions/post {
        rewrite ^(.*)$ /cc-core/system/post.ajax.php last;
    } 
    location /actions/stream {
        rewrite ^(.*)$ /cc-core/system/stream.ajax.php last;
    }    
    location /actions {
        rewrite ^/actions/mobile-(videos|search)/$ /cc-core/system/mobile_$1.ajax.php?mobile last;
    }   
    location /myaccount {        
        rewrite ^/myaccount/upload/complete/$ /cc-core/controllers/myaccount/upload_complete.php last;
        rewrite ^/myaccount/upload/video/$ /cc-core/controllers/myaccount/upload_video.php last;
        rewrite ^/myaccount/upload/$ /cc-core/controllers/myaccount/upload.php last;
        rewrite ^/myaccount/myvideos(/page/([0-9]+))?/$ /cc-core/controllers/myaccount/myvideos.php?page=$2 last;
        rewrite ^/myaccount/myvideos/([0-9]+)/$ /cc-core/controllers/myaccount/myvideos.php?vid=$1 last;
        rewrite ^/myaccount/editvideo/([0-9]+)/$ /cc-core/controllers/myaccount/edit_video.php?vid=$1 last;
        rewrite ^/myaccount/myfavorites(/page/([0-9]+))?/$ /cc-core/controllers/myaccount/myfavorites.php?page=$2 last;
        rewrite ^/myaccount/myfavorites/([0-9]+)/$ /cc-core/controllers/myaccount/myfavorites.php?vid=$1 last;
        rewrite ^/myaccount/privacy-settings/$ /cc-core/controllers/myaccount/privacy_settings.php last;
        rewrite ^/myaccount/change-password/$ /cc-core/controllers/myaccount/change_password.php last;
        rewrite ^/myaccount/subscriptions(/([0-9]+))?/$ /cc-core/controllers/myaccount/subscriptions.php?id=$2 last;
        rewrite ^/myaccount/subscriptions(/page/([0-9]+))?/$ /cc-core/controllers/myaccount/subscriptions.php?page=$2 last;
        rewrite ^/myaccount/subscribers(/page/([0-9]+))?/$ /cc-core/controllers/myaccount/subscribers.php?page=$2 last;
        rewrite ^/myaccount/message/inbox(/page/([0-9]+))?/$ /cc-core/controllers/myaccount/message_inbox.php?page=$2 last;
        rewrite ^/myaccount/message/inbox/([0-9]+)/$ /cc-core/controllers/myaccount/message_inbox.php?delete=$1 last;
        rewrite ^/myaccount/message/read/([0-9]+)/$ /cc-core/controllers/myaccount/message_read.php?msg=$1 last;
        rewrite ^/myaccount/message/send/([a-zA-Z0-9]+)/$ /cc-core/controllers/myaccount/message_send.php?username=$1 last;
        rewrite ^/myaccount/message/reply/([0-9]+)/$ /cc-core/controllers/myaccount/message_send.php?msg=$1 last;
        rewrite ^/myaccount/$ /cc-core/controllers/myaccount/myaccount.php last;
    }    
    location /myaccount/profile {
        rewrite ^(.*)$ /cc-core/controllers/myaccount/update_profile.php last;
    }    
    location /myaccount/profile/reset {
        rewrite ^(.*)$ /cc-core/controllers/myaccount/update_profile.php?action=reset last;
    }
    location /myaccount/message/send {
        rewrite ^(.*)$ /cc-core/controllers/myaccount/message_send.php last;
    }    
    location /m {
        rewrite ^/m/v/([0-9]+)/$ /cc-core/controllers/mobile/play.php?mobile&vid=$1 last;
        rewrite ^/m/v/$ /cc-core/controllers/mobile/videos.php?mobile last;
        rewrite ^/m/s/$ /cc-core/controllers/mobile/search.php?mobile last;
        rewrite ^/m/$ /cc-core/controllers/mobile/index.php?mobile last;
    }    
    location /system {
        rewrite ^/system-error/$ /cc-core/controllers/system_error.php last;
    }
    location /t {
        rewrite ^/t/(.*)$ /cc-core/system/translation.php last;
    }
    location / {
        if (!-e $request_filename){
            #rewrite ^/(.*)$ /$request_uri/ permanent;            
            rewrite ^/(.*)$ /cc-core/system/page.php last;
        }
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass backend-${host};
    }
    location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|bmp)$ {
        access_log off;
        expires 10d;
        break;
    }
    location ~ \.(flv|mp4|webm|ogg|ogv|mp3)$ {
        mp4;
        mp4_buffer_size     1m;
        mp4_max_buffer_size 5m;        
    }
    location ~ /\. {
        deny all;
    }
}
" 
echo "$directives">$sap 
sap_poll=/etc/php5/fpm/pool.d/$host.conf 
touch $sap_poll 
chmod 777 $sap_poll 
directives_poll="[${host}]
	listen = /var/run/php5-${host}.sock
	listen.mode = 0666
	user = ${users}
	group = ${users}
	chdir = /var/hosting/${host}
	php_admin_value[upload_tmp_dir] = /var/hosting/${host}/tmp
	php_admin_value[soap.wsdl_cache_dir] = /var/hosting/${host}/tmp
	php_admin_value[date.timezone] = Asia/Yekaterinburg
	pm                                  = dynamic
    pm.min_spare_servers                = 10
    pm.max_spare_servers                = 20
    pm.start_servers                    = 10
    pm.max_children                     = 40" 
echo "$directives_poll">$sap_poll 
ln -s /etc/nginx/sites-available/$host.conf /etc/nginx/sites-enabled/$host.conf 
mkdir -p /var/hosting/$host/www/ 
mkdir -p /var/hosting/$host/tmp/ 
dir=/var/hosting/$host/www 
chown -R $users:$users "$dir"; 
find "$dir" -type d -exec chmod 0755 '{}' \; 
find "$dir" -type f -exec chmod 0644 '{}' \; 
/etc/init.d/nginx restart
/etc/init.d/php5-fpm restart



На этом все. Данная конфигурация способна кодировать видео в разные форматы, а так же стримить поток. Если данная статья заинтересует кого либо, я с удовольствием приведу живые примеры стриминга.

К сожалению полной начинки показать не могу, но вот что получилось у меня stream.etagi.com

Спасибо за внимание.

P.S.1 Нашел более спокойный путь сборки ffmpeg. Исправленное ниже.

1. echo «deb www.deb-multimedia.org squeeze main non-free» » /etc/apt/sources.list
2. apt-get update
3. apt-get install deb-multimedia-keyring
4. apt-get update
5. apt-get remove ffmpeg
6. apt-get purge ffmpeg
7. apt-get autoremove
8. apt-get install ffmpeg x264 (установка подтянет все необходимые зависимости)
9. ffmpeg -version
(в выводе не должно быть DEPRECATED, если нет с 5 по 9 пункт заново)

P.S.2 Главная особенность конструкции
Работает только на PHP 5.3 из dotdeb
Head of IT Projects
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Дизайн

Комментарии (58)

  • 0
    Сорри за офтом, но не было ли опыта работы с амазоновским стримингом и jQPlayer? И насколько это вообще возможно?
    • 0
      jQPlayer тот что я использовал годится только для проигрывания видеофайла, для стримминга он не подошел. В сторону амазона не смотрел.
  • 0
    Есть clip-bucket уже готовый, и для него есть готовые virtual appliances
    • 0
      Спасибо, скачаю на досуге, тоже инетерсная CMS. cumulusclips простая, наращивать проще было, не было лишнего ничего. Из него я только подчерпнул
      nohup
      

      для выполнения скрипта в фоне… а все остальное обычная cms c шаблонами.
      • +1
        nohup не для выполнения скрипта в фоне, а для игнорирования сигнала HUP.
        • 0
          Видимо, автор имел ввиду запуск nohup <scriptname>&
        • 0
          Все именно так. Спасибо за поправку
  • +9
    Статья из серии:
    — Система управления пакетами? Нет, не слышал.
    • 0
      Где-то на Хабре видел отличную статью про сборку пакета из исходников. Найти бы…
      • +10
        Вот собственно для Debian
        ./configure
        make
        checkinstall -D --install=no
        dpkg -i пакет.deb
        
    • 0
      Конечно слышал и успешно использую… чем Вас так задел данный метод?
      • +1
        Не придираюсь к Вам, но, например, вы качали исходники Nginx, хотя можно было бы выполнить apt-get source nginx.
        • 0
          Не замечал в репах последних версий nginx.
          • +5
            Nginx предлагает свой репозиторий http://nginx.org/en/linux_packages.html#stable
          • 0
            Так ведь и PHP там не самый последний, но вы его почему-то не собирали из исходников.
            • 0
              PHP 4.9, действительно не последний… просто в php модулей дополнительных не надо. А nignx брал для теста самый последний
      • 0
        Вы взяли на себя смелость учить людей. Учите хорошему, не надо учить плохому.
        • 0
          На сайтe nginx сами предлагают сборку пакета из сорцов с необходимыми модулями
          • –2
            Где?
            • 0
              nginx.org/en/docs/configure.html — Здесь, если бы этого не было… то действительно я бы написал что то ужасное
              • +1
                Это информация для разработчиков, мейнтейнеров, и вообще всех желающих. Это не в коей мере не является какой-либо рекомендацией, а дана исключительно в справочных целях, подразумевается, что человек отдает отчет в своих действиях и знает наилучший способ установки ПО в своей системе. Сайт nginx.org посвящен отнюдь не deb-based системам и азам администрирования, и даже не операционным системам вообще, а конкретно отдельно взятому ПО.

                Есть и другая страница: nginx.org/ru/docs/install.html — причем последний пункт на ней, как и nginx.org/en/docs/configure.html не отменяет необходимых процедур для конкретной системы пользователя, а рассматривает лишь отдельно взятый процесс, касающийся непосредственно предоставляемого продукта.
                • 0
                  Да я не спорю, я пытаюсь Вам объяснить что собирал именно так, как меня научил «гугл» и «яндекс» )))
          • 0
            Предлагают собирать не значит что нужно собирать для всех и вся. Да и для бинарных дистрибутивов из сырцов собирать ПО как-то не правильно.
          • 0
            В сборке из исходников нет ничего плохого, но нужно понимать, что мэйтейнеры уже проверили пакет на совместимость и стабильность работы, а вы, беря последнуюю версию и думая, что она стабильная, можете неожиданно словить нестабильное поведение. Поэтому собирать можно, почему нет, но исходники для сборки лучше качать из репозитория пакетного менеджера.
            • 0
              Стабильная 1.4 стоит на другом серваке… а это чисто для тестов. Если честно, словил уже несколько багов, но пока выясняю...nginx ли это
              • 0
                Это он у Вас для тестов, а народ, прочитав статью, кинется повторять всё за Вами :) Поэтому лучше каждый шаг выверять заранее.
                • 0
                  Для текущей цели работает на ура
            • +3
              В сборке нет, а установка в обход пакетного менеджера — просто способ превратить систему в помойку.

              мэйтейнеры уже проверили пакет на совместимость
              Это заблуждение. В репах дебиана вы запросто можете обнаружить nginx собраный с несовместимыми между собой сторонними модулями, или ломающими какую-то основную функциональность. Регулярно в рассылку приходят люди с разными странными багами в nginx-full, вызванными сторонними модулями и патчами, которых не наблюдается в оригинальном nginx с nginx.org.

              Мы полгода не могли добиться, чтобы в репах убунты исправили критический баг, приводивший к падениям на типичных конфигурациях. При том, что был предоставлен патч, была выпущена исправленная версия, а все ответственные были проинформированы. И такая ситуация возникает очень часто. А последнюю критическую уязвимость в репах дебиана (и соответственно убунты) исправили только месяца 3 спустя. С более мелкими багами люди и вовсе живут годами только по причине той политики, которой придерживается их дистрибутив.

              Единственно проверенный код и пакеты лежат на nginx.org/en/download.html — все остальное может содержать что угодно. Мейнтейнеры дистрибутивов чаще всего ничего не понимают в исходниках nginx, и не способны оценить качество того или иного стороннего патча или модуля, который они накладывают. А критические уязвимости и баги исправляют по мере наличия свободного времени.
              • 0
                Ого, спасибо за развёрнутый комментарий.
        • +3
          Да ладно сборка из сорцов, Валентин, вы на конфиг посмотрите, его же без слез нельзя читать.
  • +1
    ffmpeg deprecated, юзаю avconv и вам посоветовал бы.
    • 0
      Про avconv знаю, но меня подбило другое. Насколько я понял, nginx-rtmp-module поддерживает только ffmpeg и получается я в будущем не смогу запускать видео в поток по требованию.
      • +2
        Нет, я сам только вчера собирал. Для сборки модуля более не нужен ffmpeg(теперь поддержка HLS нативна), а с чем дальше работать модулю — уже дело вкуса.
        P.S. Так и не нашел где он у вас используется
        • 0
          Статью не стал раздувать… в cumulusclips по умолчанию уже вшиты несколько строчек обработки видео.
          И еще трансляцию разрезаю по битрейтам — вот пример
          ffmpeg -i "rtsp://10.1.2.71/play1.sdp" -threads 2 -vcodec libx264 -preset UltraFast -rtbufsize 10000k -analyzeduration 0 -tune zerolatency -s 640x480 -acodec libmp3lame -ab 24k -ar 44100 -f flv "rtmp://127.0.0.1/live/it"
          
        • 0
          Завтра обязательно avconv заюзаю, снова только маны читать) каждая версия ffmpeg каждый релиз приподносила все новее и новее сюрпризы
    • 0
      чем avconv лучше ffmpeg? в плане производительности
    • 0
      А откуда информация о deprecated? На сайте www.ffmpeg.org в ченжлоге и в новостях ни слова.
      • 0
        Я читал где то, что компания разделилась и avconv уже больше к коммерческой версии
      • 0
         $ dpkg -l | grep ffmpeg
        ii  ffmpeg      6:0.8.5-1    amd64    Multimedia player, server, encoder and transcoder (transitional package) 
         $ ffmpeg 
        ffmpeg version 0.8.5-6:0.8.5-1, Copyright (c) 2000-2012 the Libav developers
          built on Jan 13 2013 12:05:48 with gcc 4.7.2
        *** THIS PROGRAM IS DEPRECATED ***
        This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
        Hyper fast Audio and Video encoder
        usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
        
        Use -h to get full help or, even better, run 'man ffmpeg'
        
  • +9
    Видеохостинг на регэкспах и реврайтах. [x]
    • 0
      nginx кушает это безболезнено, апатч бы уже пыхтел как паровоз
  • +1
    Почему не использовали готовый медиасервер (adobe, wowza, red5 и тд)?
    • –1
      Основной причиной стала защищенность информации, полное отслеживание пользователей
  • +1
    nginx по умолчанию ставится без потокового модуля, поэтому ставим из сорцов

    Аж передёргивает от таких слов. Автоматически получаем необходимость следить за критическими обновлениями nginx, неудобство при обновлении. Ну неужели у Debian based дистрибутивов нет какого-то простого механизма пересобрать нужный deb с отключением/включением параметров сборки?
    Это было одной из причин ухода на Gentoo, ибо оказалось, что не обязательно в системе держать половину компонентов KDE, которые ставятся в Ubuntu в качестве зависимостей.
    • +6
      Почему нету? Есть, просто почему-то не все про них умудряются прочитать в документации.
      Нужно подключить сорцовый репозиторий и собирать с какими угодно опциями:
      apt-get source foo && apt-get build-dep foo && cd foo* && DEB_BUILD_OPTIONS="--enable-gui --enable-radio --disable-ivt" fakeroot debian/rules binary && dpkg -i ../foo*.deb

      У нас тут даже свой emerge world apt-build world есть (:

      А про необязательные зависимости: в aptitude по умолчанию включена опция «Устанавливать рекомендуемые пакеты». Если её отключить, то в системе окажется гораздо меньше неиспользуемых пакетов.
      • 0
        Спасибо, взял на заметку
    • 0
      нет, они живут по принципу, собрать как бог на душу положит, если бы у них была такая прекрасная вещь как USE и определение оптимизации сборки для порта. По этому я и сижу на gentoo уже давно.

      По статистики не все админы знают, что такое мир, а некоторых ставит в ступор слово «пересобрать мир».
  • 0
    Ffmpeg не глючит? У меня постоянно в такой связке он сваливался
    • 0
      нет, не глючит, но если что то случалось, игра с битрейтами все решала
  • +2
    Приходите на Highload++ 2013 послушать, почему и когда выбранные вами решения не будут работать.
    • 0
      Все работает )) Слава кодерам
      И повторюсь… система для узкой аудитории, 1500-2000 человек
      • 0
        этот подход затрещит по швам, когда потребуется стримить мультиязыковой мультибитрейт, потому что mod_mp4 рассчитан на обычный контент.
        • +1
          Ну так поделитесь правильными подходом!
          основными тезисами хотя бы

          PS: приходить, а тем более прилетать, на вышеупомянутую конференцию большинству читателей очень проблематично…
          • 0
            тогда лучше я всё таки после конференции поделюсь слайдами.

            Если вкратце, то выбранные вами решения не смогут эффективно раздавать мультибитрейтные мультиязыковые файлы.
  • +1
    дабы отбить все необоснованные нападки из серии «ты неправльно делал, чему ты других учишь!», думаю, стоит в начале и в конце статьи добавить оговорку, что всё это ЛИЧНЫЙ опыт и описание того, как человек делал, не найдя статей кричальщиков «я всё правильно сделал, учитесь-на!» :)
  • 0
    А может ктонить подсказать насчет этого момента?

    «В файле auto/cc/gcc комментируем строчку:
    #CFLAGS=»$CFLAGS -Werror"

    Где найти этот файл?
  • 0
    Обнаружил неработоспособность php-ffmpeg из редакции 5.4, так что поддержка ONLY 5.3 из dotdeb

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