1. 程式人生 > >如何搭建一個屬於自己的直播平臺?

如何搭建一個屬於自己的直播平臺?

現在直播非常火爆,可以從PC或手機直播,然後從PC或是手機或是 支援HTML5的瀏覽器 收看。但是,你知道直播平臺後面的技術和實現原理碼?

正好去年過年的時候,一個朋友破解了AirPlay和Chromecast協議,然後開發了一套技術能夠截獲和播放任何手機(iOS或是Android)螢幕上的任何內容。想到的第一個應用是做一個 直播的直播服務 ( 如有感興趣的投資人,可以聯絡 )。比如,通過螢幕直播,你可以邀請朋友看你正在看的直播的電影,球賽,演唱會,晚會,不管是免費的還是付費的。當初的想法是將螢幕的內容,通過AirPlay或Chromecast,推送到後臺伺服器,然後,受邀的朋友就可以從瀏覽器或是其它視訊播放器觀看了。為此,我們搭建和開發了一個直播平臺,現在把我們實現的過程記錄下來和大家共享。

首先,視訊有它的播放協議。原則上,RTSP,RTMP,HTTP都可以做直播和點播,但一般做直播用RTSP和RTMP,做點播用HTTP。我們選用的是RTMP協議。

RTMP 協議

RTMP(Real Time Message Protocol/實時資訊傳輸協議)是應用層協議,靠底層傳輸層協議(通常是TCP)來保證資訊傳輸的可靠性的。在TCP連結建立後,RTMP協議也要客戶端和伺服器通過“握手”來建立RTMP Connection,然後在Connection上傳輸控制資訊。RTMP協議傳輸時會對資料格式化,而實際傳輸的時候為了更好地實現多路複用、分包和資訊的公平性,傳送端會把Message劃分為帶有Message ID的Chunk,每個Chunk可能是一個單獨的Message,也可能是Message的一部分,在接受端會根據Chunk中包含的data的長度,message id和message的長度把chunk還原成完整的Message,從而實現資訊的收發。

我們看看兩個常用的視訊服務。一個是由客戶端向伺服器發起請求推流到伺服器,這個就是直播的播放服務,流程如下。

另一個是由客戶端向伺服器發起請求從伺服器端接受資料,可以多次呼叫,這就是播放服務。流程如下。

RTMP是直播後面的協議,有很多的開源軟體實現了,細節我們不再細說。下面,我們看看怎麼搭建後臺服務系統。

安裝和配置 LEMP

LEMP棧是指Linux(L), NGINX(E), MySQL(M), PHP(P),還記得LAMP嗎?LEMP既是將NGINX(E)取代了Apache(A)。

首先,用以下命令安裝和啟動NGINX web server。

# sudo apt-get update
# sudo apt-get install nginx
# sudo service nginx start

接著,安裝MySQL。

# sudo apt-get install mysql-server mysql php5-mysql

接著,安裝和配置PHP。

# sudo apt-get install php5-fpm
location ~ .php$ {
  try_files $uri =404;
  fastcgi_pass unix:/var/run/php5-fpm.sock;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
}

最後,重新啟動NGINX web server。

# sudo service nginx restart

這樣,後臺的web server設定好了,可以對外提供網頁和PHP服務了。但是,NGINX並不支援RTMP協議,我們需要下載,編譯,安裝和配置RTMP模組。

安裝和配置nginx-rtmp-module

首先,下載NGINX的原始碼,確保環境下能正確的編譯。

# git clone https://github.com/nginx/nginx.git

然後,下載RTMP模組。

# git clone https://github.com/arut/nginx-rtmp-module.git

然後,cd到NGINX的原始碼目錄,config,make和install 剛才下載的RTMP模組。

# ./configure --add-module=/path/to/nginx-rtmp-module make make install
# make
# make install

最後,在NGINX的配置檔案中,加上RTMP相關的配置,並且重新啟動NGINX server。

rtmp {
    server {
        listen 1935;
        chunk_size 4000;

        # HLS
        application hls {
            live on;
            hls on;
            hls_path /tmp/hls;
        }

        # MPEG-DASH is similar to HLS
        application dash {
            live on;
            dash on;
            dash_path /tmp/dash;
        }
    }
}

# HTTP can be used for accessing RTMP stats
http {
    server {
        listen      8080;

        # This URL provides RTMP statistics in XML
        location /stat {
            rtmp_stat all;
            # Use this stylesheet to view XML as web page
            # in browser
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            # XML stylesheet to view RTMP stats.
            # Copy stat.xsl wherever you want
            # and put the full directory path here
            root /path/to/stat.xsl/;
        }

        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }

        location /dash {
            # Serve DASH fragments
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}

其中看到了伺服器上視訊儲存的格式是HLS,下面需要介紹一下這個格式。

HLS(HTTP Live Streaming)

HLS是一個由蘋果公司提出的基於HTTP的流媒體網路傳輸協議,它把整個流分成一個個小的基於HTTP的檔案來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的資料速率。開始播放時,客戶端會下載一個包含元資料的extended M3U (m3u8)playlist檔案,用於尋找可用的媒體流。工作原理如下。

m3u8 playlist的檔案結構,它不是一個單獨的檔案,而是由一系列檔案組成。Index檔案和很多的資料檔案。

一個m3u8 playlist的index檔案內容。

所有的資料檔案,以.ts為字尾,存放在同一目錄下面。

直播客戶端(後面我們要介紹的OBS)將實時視訊推送到NGINX的RTMP模組。RTMP模組會根據配置將視訊流轉換成HLS檔案。這時,HLS檔案可以使用兩種模式播放。一是點播VOD模式,下載當前時間點可以獲取到所有index檔案和ts檔案,並播放。這種模式允許客戶端訪問全部內容,不一定是實時內容。二是Live 模式,實時生成m3u8和ts檔案。它的索引檔案一直處於動態變化的,播放的時候需要不斷下載index檔案,以獲得最新生成的ts檔案播放視訊。一般來說,實況直播時,會有一些延時。下面,來看一個JS實現的HLS player,嵌入到支援HTML5的瀏覽器就可以播放HLS檔案。

HLSPlayer

基於Javascript的HLS Player可以在PC瀏覽器(IE,Chrome,Firefox,Safari,等),iOS的Safari,Android的Chrome,等等支援HTML5的瀏覽器上播放。市面上有很多開源的,下面圖中是其中的一種,對於不同瀏覽器的支援都很好。下載以後,按照它給的例子修改HLS的源就可以了。

除了JS的播放器,還有獨立的播放器,ffmpeg是廣泛使用的一種命令列播放器,支援Windows,Linux,Mac等。

ffmpeg

ffmpeg是一個非常快的視訊/音訊轉換器,也可以現場抓取音訊/視訊源,並在任意取樣率、尺寸之間調整視訊,以及提供多種高品質的濾鏡系統。ffmpeg從任意數量/形式的輸入檔案中進行讀取,通過輸入檔案選項對輸入檔案進行設定,並寫入到任意數量/形式的輸出檔案中。它不但可以對任何格式的音視訊檔案相互轉化,而且可以播放任何格式的音視訊檔案。它的命令列選項超多,具體細節需要用到時自己去網上搜索和閱讀。

例如,下面的命令將一個本地的視訊檔案movie.avi推送到伺服器上可以生成HLS格式的檔案。

# ffmpeg -loglevel verbose -re -i movie.avi -vcodec libx264 -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/hls/movie

OBS

OBS(Open Broadcaster Software/開源直播軟體),它是目前世界上最火的免費開源直播軟體。由於它是免費的,而且質量高,對比其它軟體就有天生的優勢,很多商業化的直播平臺都支援和推薦使用。下面是它的基礎介面。

OBS能夠講視訊流推送到支援RTMP協議的伺服器上,需要進行一些簡單的設定。伺服器的地址,和流的金鑰,這樣,可以區分不同的使用者,也保證了不同使用者的內容安全。

直播平臺Demo

基於上面描述的技術和開源系統,我們用PHP實現了一個簡單的支援多使用者的直播平臺。使用者可以註冊,登入,follow/unfollow,評論,標籤,收看,直播(每個使用者有自己的直播金鑰),等等。

原始碼檔案目錄。

註冊介面。

播放和評論介面。

直播使用的是OBS,也可以使用你喜歡的直播移動App,需要設定系統給每個使用者提供的金鑰。收看時,直接選擇使用者和他正在播放視訊就好了。

直播的精髓都應該討論到了,如果將系統sharding,分層,SOA化,負載均衡,cache,就可以搭建出一個可擴充套件的大規模的直播平臺。

http://www.open-open.com/lib/view/open1473231814360.html