1. 程式人生 > >流媒體伺服器(Nginx+rtmp)

流媒體伺服器(Nginx+rtmp)

使用 nginx 和 rtmp 模組 ,可以很容易地搭建一個視訊直播和點播伺服器出來。

  1. 安裝 nginx 和 rtmp 模組

有關 nginx 的編譯和安裝比較簡單,這裡就不介紹了,看參考文獻。這裡提示以下幾點:

(1) 安裝好 nginx 後,配置檔案在這裡:

/usr/local/nginx/conf/nginx.conf

(2) 啟動 nginx 的命令:

sudo/usr/local/nginx/sbin/nginxsstop sudo
/usr/local/nginx/sbin/nginx

2 配置 nginx 視訊直播和點播服務

先看一下完整的 nginx 配置檔案裡有關視訊點播和直播的配置:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        application live {
            live on;
            record off;
        }
        application live2 {
            live on;
            record off;
        }
        # video on demand
        application vod {
            play /var
/flvs; } application vod_http { play http://192.168.31.185/vod;//我的是自己本地測試,用自己的IP } application hls { live on; hls on; hls_path /tmp/hls; } } }
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; } } }

現在來解釋一下里面各行程式碼的含義。對於視訊直播服務,如果需要支援多路流輸入的話,很簡單,在 nginx 配置檔案裡多配幾個 Application 就只可以了,像下面這樣:

application live {
    live on;
    record off;
}
application live2 {
    live on;
    record off;
}

這樣就可以通過下面的地址來推送直播流,其它觀眾端也可以通過下面的地址來訪問直播流:

rtmp://192.168.31.185/live/test
rtmp://192.168.31.185/live2/test

後面緊跟的 test 關鍵字,可以隨便更換,只要你的推送流和訪問流的地址一樣就可以了。

rtmp 模組也可以直接支援 VOD 這種視訊點播服務 ,只需要在配置檔案裡新增如下內容即可:

application vod {
    play /var/flvs;
}

application vod_http {
    play http://myserver.com/vod;
}

然後把一個 mp4 或是 flv 檔案扔到 /var/flvs 目錄下,對於 /var/flvs/dir/file.flv 這個視訊檔案,就可以通過下面的網址來訪問了:

  http://myserver.com/vod//dir/file.flv

這樣直接在瀏覽器裡就可以通過網頁觀看視訊。對於 mp4 檔案,也可以實現 VOD 服務,不過需要的是採用 H.264 和 AAC 格式編碼的 mp4 檔案。

  1. HLS 直播流的配置

如果需要使用 HLS 來視訊直播,可以直接像配置檔案那樣,寫上下面這一段:

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

同時把後面有關 http 訪問的內容寫上:

//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;
        }
    }
}

配好以後,推流可以使用下面的地址:

rtmp://192.168.31.185/hls/movie

movie 關鍵字可以任何替換。對於觀眾端來說,可以有幾種播放方式:

(1) 用 rtmp:

rtmp://192.168.31.185/hls/movie

(2) 用 hls 播放:

http://192.168.31.185:8080/hls/movie.m3u8

這樣就可以看到主播端推出來的流。注意,如果使用 http 方式,則是監聽的 8080 埠,這個是在配置檔案裡寫的。

  1. 網頁播放器外掛

在第二步裡,除了可以直接在瀏覽器裡開啟網址來觀看視訊,還可以寫一個網頁,實現像優酷那樣的視訊點播業務。通過使用第三方的播放器,在網頁裡植入該播放器來實現這個功能,比如說使用 JWPlayer 播放器。

下載 JWPlayer 播放器,放到 nginx 網頁服務的根目錄,比如說,在我這兒是 /usr/local/nginx/html 這個目錄,把 JWPlayer 解壓後放到這個目錄裡,然後在這個目錄裡新建一個 play.html 的文字檔案,再寫入以下內容:

<html>
  <head>
    <script src="/jwplayer/jwplayer.js"></script>
  </head>

<body>
  <div id='my-video'></div>
  <script type='text/javascript'>
    jwplayer('my-video').setup({
      file:'http://192.168.31.185/vod/North.mp4',
      fallback:'false'
    });
  </script>
</body>
</html>

對於 flv 檔案,可以採用如下的形式來實現網頁播放:

<html>
  <head>
    <script src="/jwplayer/jwplayer.js"></script>
  </head>

<body>
  <div id='my-video'></div>
  <script type='text/javascript'>
    jwplayer('my-video').setup({
      file:'http://192.168.31.185/vod/1.flv',
      width:'50%',
      aspectratio:'3:2',
      fallback:'false',
      primary:'flash'
    });
  </script>
</body>
</html>

另外,如果有一些 flv 檔案沒有辦法拖動播放,那是因為沒有給 flv 檔案新增“關鍵幀”,可以用工具“yamdi” 和“flvtool”來給 flv 生成關鍵幀,以 yamdi 為例,下載解壓後從 shell 執行:

yamdi –i src.flv –o dst.flv
意思是將 src.flv 新增關鍵幀,並輸出為 dst.flv 。這樣 flv 就有關鍵幀了,即可進行拖動播放操作。