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

bjse4217 8年前發布 | 325K 次閱讀 RTMP Nginx 流媒體服務器

現在直播非常火爆,可以從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://mp.weixin.qq.com/s?__biz=MjM5ODIzNDQ3Mw==&mid=2649966092&idx=1&sn=aaba8cc1f2b34860669f5fbfa814cf60&scene=0

 

 本文由用戶 bjse4217 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!