HLS-搭建Nginx流媒體服務器


Nginx本身是一個非常出色的HTTP服務器,FFMPEG是非常好的音視頻解決方案.這兩個東西通過一個nginx的模塊nginx-rtmp-module,組合在一起即可以搭建一個功能相對比較完善的流媒體服務器.

這個流媒體服務器可以支持RTMP和HLS(Live Http Stream)

從安裝開始

Nginx的安裝參照我之前的這個: http://blog.csdn.net/redstarofsleep/article/details/45092127

 

在configure的時候需要增加nginx-rtmp-module的支持,下載好nginx-rtmp-module后解壓,然后nginx安裝時增加這個模塊(--add-module),其它都是一樣的.

 ./configure --prefix=/usr/local/nginx --with-pcre=/home/user/pcre/pcre-8.32 --with-zlib=/home/user/zlib/zlib-1.2.8 --with-openssl=/home/user/openssl/openssl-1.0.1i  --add-module=/home/user/nginx-rtmp-module

 

## Mac 系統可以使用Homebrew, Homebrew是以最簡單,最靈活的方式來安裝蘋果公司在MacOS中不包含的UNIX工具

 

FFMPEG的安裝

ubuntu 安裝: http://blog.csdn.net/redstarofsleep/article/details/45092145

Liunx下yum 安裝: http://www.cnblogs.com/dennisit/archive/2012/12/27/2835089.html

nginx配合ffmpeg做流媒體服務器的原理是: nginx通過rtmp模塊提供rtmp服務, ffmpeg推送一個rtmp流到nginx,然后客戶端通過訪問nginx來收看實時視頻流. HLS也是差不多的原理,只是最終客戶端是通過HTTP協議來訪問的,但是ffmpeg推送流仍然是rtmp的。

 在整個 http{} 之后添加 rtmp的配置內容 

官方rtmp 手冊https://github.com/arut/nginx-rtmp-module/wiki/Directives

中文手冊 :視頻直播點播nginx-rtmp開發手冊中文版

 1 rtmp {
 2     server {
 3         listen 1935; #端口  4       RTMP 直播流配置
 5         application rtmplive {
 6             live on;
 7         }
       HLS 直播流配置
8 application hls { 9 live on; 10 hls on; #開啟hls 11 hls_path /tmp/hls;
          hls_fragment 5s #一個ts 文件的時長 5s
12 } 13 } 14 }

 

需要在http里面增加一個location配置

1 location /hls {
2             types {
3                 application/vnd.apple.mpegurl m3u8;
4                 video/mp2t ts;
5             }
6             root /tmp;
7             add_header Cache-Control no-cache;
8 }

 

注意:修改nginx.conf之后,需重啟nginx服務,才會生效:$nginx -s reload。

     再次在瀏覽器中測試:http://localhost:8080,以確認nginx開啟的狀態。

保存完配置文件后,啟動nginx,通過netstat -ltn命令可以看到增加了一個1935端口的監聽.8080是nginx默認的http監聽端口。

# netstat -ltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:1935            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN  

 

然后用ffmpeg推流到nginx:

RTMP流,推流至rtmplive:

ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac
 -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://server:1935/rtmplive/test1

HLS流,推流至hls:

ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac
 -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://ip:1935/hls/test2
 
其中,HLS流表現較明顯,在nginx的臨時目錄下,直觀的可看到 m3u8索引文件和N多個 .ts文件。m3u8列表會實時更新,且會動態更改當前播放索引切片(.ts)。這種實時更新的機制,不會使得.ts文件長時間存在於Nginx服務器上,且當推流結束之后,該目錄下的內容會被全部清除,這樣無形中減緩了nginx服務器的壓力。HLS協議在服務器端將直播 數據流存儲為連續的、很短時長的媒體文件(MPEG-TS格式),而客戶端則不斷的下載並播放這些小文件,因為服務器端總是會將最新的直播數據生成新的小文件,這樣客戶端只要不停的按順序播放從服務器獲取到的文件,就實現了直播。由此可見,基本上可以認為, HLS是以點播的技術方式來實現直播。由於數據通過HTTP協議傳輸,所以完全不用考慮防火牆或者代理的問題,而且分段文件的時長很短,客戶端可以很快的選擇和切換碼率,以適應不同帶寬條件下的播放。不過HLS的這種技術特點,決定了它的延遲一般總是會高於普通的流媒體直播協議。
 
m3u8索引文件
#EXTM3U                     m3u文件頭,必須放在第一行
#EXT-X-MEDIA-SEQUENCE       第一個TS分片的序列號 #當前索引
#EXT-X-TARGETDURATION       每個分片TS的最大的時長
#EXT-X-ALLOW-CACHE          是否允許cache
#EXT-X-ENDLIST              m3u8文件結束符
#EXTINF                     extra info,分片TS的信息,如時長,帶寬等

 

現在我們的流媒體服務器有兩個實時流了,一個是rtmp的,另一個是hls的,用流媒體播放器播放一下,流媒體播放器可以用vlc也可以用ffmpeg帶的ffplay.手機也是可以播放的。

第一個就是推送的地址: rtmp://serverIp:1935/myapp/test1

第二個是HTTP地址: http://serverIp:8080/hls/test2.m3u8

 

播放rtmp流或hls流

最簡單的測試,可通過VLC播放器,建立網絡任務實現播放。所謂的播放,就是從Nginx服務器取到視頻流並播放,也稱之為“拉流”。需注意的是,HLS是基於HTTP的流媒體傳輸協議, 端口為8080 ,hls的話用hls on開啟hls,並且為hls設置一個臨時文件目錄 hls_path /tmp/hls;其它更高級的配置可以參看nginx-rtmp-module的readme;而RTMP本身即為實時消息傳輸協議, 端口為1935。由此決定了客戶端訪問直播流的方式,見下圖:(客戶端拉流過程)

拉流地址:

RTMP流:rtmp://localhost:1935/rtmplive/test

HLS流:http://localhost:8080/hls/test.m3u8

 

文章引用:HLS-搭建Nginx流媒體服務器(3)

        nginx+nginx-rtmp-module+ffmpeg搭建流媒體服務器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM