本文由做者張遠道受權網易雲社區發佈。html
轉碼集羣的搭建linux
隨着媒體技術的發展,以及硬件設備的普及和移動設備的觸角延伸之社會各個角落,人們能夠隨時隨地產生信息。而這些海量信息中,有很多多媒體信息。多媒體信 息成爲了人們信息分享的重要方式。絕不誇張地說,如今是一個信息爆炸的時代。傳統的電視,電影,視頻網站,及至移動的自媒體(自由人)無時無刻不在吞吐着媒體信息。nginx
這些海量信息的存在給存儲和分享都帶來了挑戰。挑戰主要有兩方面,一是如何儘量以小成原本存儲這些信息。二是如何讓這些千差萬別的設備產生的信息能被千 差萬別是設備觀看。解決問題一的方法是在儘量地縮小這些多媒體信息的同時不下降媒體信息的質量。解決問題二的方法是將這些有千差萬別設備產生的格式各異 的視頻編碼成統一的能支持各類設備的視頻格式。git
幸運地是,確實存在在實踐上已經被證實是切實可行的方案存在,即視頻編碼技術。能夠構建視頻編碼集羣,將原始視頻編碼成目標格式,在再編碼的過程當中,完成視頻壓縮和統一制式,從而實現存儲下降及制式統一。從視頻的角度能夠將如今 設備分割成兩個陣營,一個是蘋果陣營,另外一個是非蘋果陣營。蘋果陣營的視頻只要是m3u8爲封裝格式,內部編碼配以H264和AAC便可。而非蘋果陣營則 是MP4爲封裝格式,內部編碼已H264和AAC便可。據初略統計H264+aac的編碼組合能夠達到2:1到4:1的壓縮比,能夠顯著地下降存儲空間。github
下圖是一個採用gearman框架搭建的簡易轉碼集羣(固然該簡易集羣曾經有1~2人力一個月左右的時間搭建完成,並在生產環境中部署)。
該簡易轉碼集羣由四個模塊組成:web
JobServer負責接收API服務器的請求,創建轉碼Job,將Job分發給transcode-worker。瀏覽器
API服務器負責接收第三方產品的轉碼請求,將其轉發給JobServer。ruby
transcode-worker接收JobServer的做用請求,而且完成轉碼做業。服務器
分佈式文件系統主要用於存儲原視頻和目標視頻。之因此用分佈式文件系統是由於transcode-worker部署在不一樣服務器上,transcode-worker須要可以在分佈式環境中訪問視頻文件。 app
所需技術:
gearman分佈式任務調度框架。很是輕量級,支持C,Java,Python,PHP,C#,Ruby等各類語言,具備任何語言背景的人能夠再一塊兒工做。
ffmpeg,轉碼領域的瑞士軍刀。幾乎支持市面上全部商業視頻格式。實驗室格式除外。
搭建API的web服務器技術。本人比較習慣J2EE的Spring那套。固然你能夠用ruby on rails,點Net等。
基礎的音視頻知識。包括H264編碼技術,視頻解壓縮知識等。
到這裏,一個內容生產系統基本成型。可是還須要一個視頻內容的deliver系統,即視頻播放服務器[集羣]。這裏將詳細地記錄視頻服務器的搭建步驟。
如何搭建flv媒體服務器
操做系統:linux 2.6.32-5-amd64。Linux 版本便可。
服務器:nginx 1.3.3。nginx的版本能夠更高。
客戶端:jwplayer
安裝nginx with http_module_flv
一、 下載nginx
wget http://nginx.org/download/nginx-1.3.3.tar.gz |
二、 解壓
tar –xzvf nginx-1.3.3.tar.gz |
三、 安裝
cd nginx-1.3.3 ./configure --prefix=/home/user/nginx_flv --with-http_flv_module |
四、 配置
#user nobody; worker_processes 1;
#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
#pid logs/nginx.pid;
events { worker_connections 1024; }
http { include mime.types; default_type application/octet-stream;
log_format main 'remoteaddr−remote_user [timelocal]"request" ' 'statusbody_bytes_sent "$http_referer" ' '"httpuseragent""http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on; #tcp_nopush on;
#keepalive_timeout 0; keepalive_timeout 65;
#gzip on;
server { listen 8088; server_name localhost;
#charset koi8-r;
access_log logs/host.access.log main;
location / { root /home/fs/video; index index.html index.htm; autoindex on; location ~ \.flv{ flv; } }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
# deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } } |
說明:綠色部分爲配置flv的部分。/home/fs/video目錄爲資源存放路徑,包括jwplayer以及測試用的視頻文件都存放於該目錄。
五、 配置jwplayer服務器。
下載開源的jwplayer,好比mediaplayer-5.10。解壓以後將player.swf以及jwplayer.js置於/home/fs/video。並將測試視頻 zyd.flv 也置於/home/fs/video。
六、 測試
在瀏覽器中輸入 http://hostip:8080/player.swf?type=http&file=zyd.flv |
能夠隨意拖動進度條,能夠看到視頻正常播放。
如何搭建MP4媒體服務器
操做系統:linux 2.6.32-5-amd64。Linux 版本便可。
服務器:nginx 1.3.3。nginx的版本能夠更高。
客戶端:jwplayer。或者任何播放器便可。
安裝nginx with nginx_mod_h264_streaming
一、 下載nginx 和nginx_mod_h264_streaming
git clone github.com/vivus-ignis… |
二、 解壓
tar –xzvf nginx-1.3.3.tar.gz |
三、 安裝
cd nginx-1.3.3 #nginx_mod_h264_streaming爲第三方模塊。 ./configure --prefix=/home/user/nginx_flv --add_module=nginx_mod_h264_streaming_2.2.7 |
四、 配置
#user nobody; worker_processes 1;
#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
#pid logs/nginx.pid;
events { worker_connections 1024; }
http { include mime.types; default_type application/octet-stream;
log_format main 'remoteaddr−remote_user [timelocal]" |