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

3,509 views

Published on

Доклад с хабравстречи

Published in: Self Improvement
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,509
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
22
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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

  1. 1. Видеохостинг своими руками Докладчик: Малкин Станислав Киев, 2012
  2. 2. Архитектура• Морда видеохостинга• Файловые сервера (связываются с кодирующим(-и) сервером(-ами) по NFS)• Сервер для загрузки видео (используем http://pecl.php.net/package/uploadprogress)• Сервер(-а) для кодирования видео
  3. 3. Путь и инструментарий• ffmpeg• nginx• shell-скриптинг, perl• плеер (uppod например) и клиентская часть• ??????• PROFIT!
  4. 4. FFMPEG1. Ставим из сорцов, предварительно скачав из git: git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg4. Ключи сборки: --prefix=/usr --libdir=/usr/lib --shlibdir=/usr/lib --bindir=/usr/bin --incdir=/usr/include/ffmpeg --enable-libx264 --enable-postproc --enable-libxvid --enable-pthreads --enable-libvorbis --enable-gpl --enable-x11grab --enable-shared --enable-libmp3lame --enable- libtheora --enable-libfaac --enable-nonfree --enable-libopencore- amrnb --enable-libopencore-amrwb --enable-libgsm --enable-version3 --enable-avfilter --enable-libspeex --enable-zlib --enable- libschroedinger --disable-encoder=libschroedinger --enable-libdc1394 --enable-libdirac --disable-decoder=libdirac --enable-libopenjpeg --extra-cflags=-Wall --cc=ccache cc --enable-swscale --enable-libvpx
  5. 5. 3. Ставим qt-faststart (для метаинформации с  конца mp4 контейнера в  начало) : make tools/qt-faststart4. Кодируем видео: ffmpeg -i video.avi -y -vcodec libx264 –s 640x360 -vpre max –b 498k -threads 0 -r 29 -acodec libfaac -ab 128k -ar 44100 -ac 2 –f mp4 temp.mp45. Перемещаем moov-атомы в начало файла: /usr/local/bin/qt-faststart temp.mp4 output.mp46. Делаем превьюшки: ffmpeg -ss 00:00:04 -i out.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -s 176x99 output.jpg
  6. 6. NGINX1. Ставим из сорцов с такими ключами сборки: --pid-path=/var/run/nginx.pid --with-file-aio --with- http_stub_status_module --with-http_flv_module --with-http_mp4_module --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log- path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --http-log- path=/var/log/nginx/access.log --with-http_secure_link_module2. Настраиваем псевдостриминг: location ~ .mp4$ { mp4; }3. Добавляем статистику: server { listen 8888; server_name serverName; location / { stub_status on; access_log off; } }
  7. 7. 4. Защищаемся от хотлинкинга (--with_http_secure_link_module):location /video/ { rewrite ^/video/([w-_=]+)/(d+)/(.+)$ /storage/$3?s=$1&t=$2; }location /storage/ { secure_link $arg_s,$arg_t; secure_link_md5 pass$uri$arg_t$remote_addr; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; } rewrite ^/storage/(.*)$ /storage/$1 break; root /disk1; internal; mp4; aio on; directio 4m; limit_rate_after 2m; set $limit_rate 1m; limit_conn dlconn 3; output_buffers 1 1m;}
  8. 8. 5. Пару советов по настройке и выбору железа: – Чем больше ядер у файлового раздающего сервера – тем лучше (воркеры выставляем в конфиге по количеству ядер - worker_processes 4) – Файловой системой лучше всего выбрать xfs (быстрая, без журналирования) и монтировать с –noatime – Обязательно использовать AIO, тем более, что nginx его поддерживает – Контент лучше всего дублировать на разные винты и отдавать его поочередно, таким образом балансируя нагрузку – Контент хранить в древовидной структуре (/ab/cd/ef/abcdef.mp4), а не держать в одной папке – можно будет обслужить большее количество клиентов – Ограничивать скорость отдачи видео и количество одновременных подключений – больше клиентов сможет потребить контент. – «Горячий контент» стоит отдавать с отдельных быстрых винтов, подойдет даже SSD
  9. 9. SHELL-скриптинг, PERL• Кодирования видео с использованием очередей• Скачивание видео по ссылке (YouTube, RuTube, Vimeo etc)• Обнаружение горячего контента• CDN для более «умной» раздачи контента…об этом и другом в следующие разы 
  10. 10. Плеер и клиентская часть• Выбрать подходящий плеер (рекомендую Uppod + Pro аккаунт) и настроить, использовать HTML5 + flash fallback• Правильно закодировать ссылку к видео, чтобы защититься от хотлинкинга: public function secureLink($url) { $time = time() + 14400; $string = pass .$url.$time.$_SERVER[REMOTE_ADDR]; $hash = md5($string, true); return $url./.$hash./.$time; }
  11. 11. Обратная связь:Станислав Малкинmalkin.stanislav@gmail.comhttp://malkin.com.ua Киев, 2012

×