【官方文檔】Nginx模塊Nginx-Rtmp-Module學習筆記(二)HLS 指令詳解


源碼地址:https://github.com/Tinywan/PHP_Experience

一、在Nginx配置文件的RTMP模塊中配置hls

 hls_key_path /tmp/hlskeys;

提示錯誤信息:

nginx: [emerg] the same path name "/data/hlskeys" used in /usr/local/nginx/conf/nginx.conf:178 and in /usr/local/nginx/conf/nginx.conf:178

解決辦法:

查看官方RTMP源代碼:nginx-rtmp-module hls /ngx_rtmp_hls_module.c

 

ngx_conf_merge_str_value(conf-> key_path,prev-> key_path,“”);

在hls / ngx_rtmp_hls_module.c中的第2346行和第2421行調用兩次 應該刪除線或者注釋掉2346上的一個【我這里時暫時注釋掉了】,以阻止nginx拋出配置錯誤nginx:[emerg]在以下語言中使用相同的路徑.

修改后的配置文件:

重新編譯:nginx-rtmp-module 模塊,

重新啟動不會出現該錯誤信息:

root@iZ231gvwxe7Z:/usr/local/nginx/conf# service nginx restart
* Stopping Nginx Server... 
* Starting Nginx Server...

查看生成的文件即可,HLS密鑰文件已經生成了,如下所示:

root@iZ231gvwxe7Z:/tmp# ls
Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>  disk_io   hls      netio_stat               qtsingleapp-aegisG-46d2-lockfile
cpu_stat                                            dump.rdb  hlskeys  qtsingleapp-aegisG-46d2  vm.log
root@iZ231gvwxe7Z:/tmp# cd hlskeys/
root@iZ231gvwxe7Z:/tmp/hlskeys# ls
S0000_8-156.key  S0000_8-166.key  S0000_8-176.key

同時HLS存放的文件:

播放列表文件:

root@iZ231gvwxe7Z:/tmp/hls# ls
S0000_8-224.ts  S0000_8-227.ts  S0000_8-230.ts  S0000_8-233.ts  S0000_8-236.ts  S0000_8-239.ts  S0000_8-242.ts  test.txt
S0000_8-225.ts  S0000_8-228.ts  S0000_8-231.ts  S0000_8-234.ts  S0000_8-237.ts  S0000_8-240.ts  S0000_8-243.ts
S0000_8-226.ts  S0000_8-229.ts  S0000_8-232.ts  S0000_8-235.ts  S0000_8-238.ts  S0000_8-241.ts  S0000_8.m3u8

加密后的文件列表:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:239
#EXT-X-TARGETDURATION:5
#EXT-X-KEY:METHOD=AES-128,URI="http://sewise.amai8.com/authcheck/accesskeyS0000_8-236.key",IV=0x000000000000000000000000000000EC
#EXTINF:5.013,
S0000_8-239.ts
#EXTINF:5.014,
S0000_8-240.ts
#EXTINF:5.013,
S0000_8-241.ts
#EXTINF:5.013,
S0000_8-242.ts
#EXTINF:5.014,
S0000_8-243.ts
#EXTINF:5.013,
S0000_8-244.ts

 

但是為了降低HLS的延遲,您需要設置此設置hls_fragment和hls_playlist_length,如下所示:

application live {
    live on;
    hls on;
    hls_fragment 3;
    hls_playlist_length 60;
    hls_path /tmp/hls;
}

這樣可以播放60秒的播放列表。
Peer5 HLS設置,這可能會延遲3-60秒,(也許更像9-15秒),你可以嘗試玩這個設置,以適應。但是,由於碎片,HLS會有更高的延遲,但是在不穩定的網絡上播放更流暢。

hls_path

語法:hls 路徑路徑
上下文:rtmp,服務器,應用程序
描述:設置HLS播放列表和片段目錄。 如果目錄不存在,它將被創建

 

hls_fragment

語法:hls_fragment 片段時間
上下文:rtmp,服務器,應用程序
描述:設置HLS片段長度。 默認為5秒。

hls_playlist_length

語法:hls_playlist_length  時間
上下文:rtmp,服務器,應用程序
描述:設置HLS播放列表長度。 默認為30秒。

 hls_playlist_length 10m;

 

hls_sync

語法:hls_sync 時間
上下文:rtmp,服務器,應用程序

描述:設置HLS時間戳同步閾值。 默認值為2ms。 此功能可防止在從低分辨率RTMP(1KHz)到高分辨率MPEG-TS(90KHz)轉換后出現裂紋噪聲。

hls_sync 100ms;

 

hls_continuous

語法:hls_continuous on | off
上下文:rtmp,服務器,應用程序

描述:打開HLS連續模式。 在這種模式下,HLS序列號從上次停止的地方開始。 老片段被保存。 默認為關閉。

hls_continuous on;

 

hls_base_url

語法:hls_base_url url
上下文:rtmp,服務器,應用程序

描述:設置HLS播放列表項目的基本URL。 當為空時,這些項目沒有前綴,並假定與父播放列表位於相同的位置,或者在使用hls_nested時降低一個級別。 此功能適用於主(變式)和從HLS播放列表。 它可以讓您下載播放列表並在本地播放,因為它包含對子播放列表或片段的完整引用。 默認為空。

hls_base_url http://myserver.com/hls/;

 

hls_cleanup

語法:hls_cleanup on | off
上下文:rtmp,服務器,應用程序

描述:切換HLS清理。 默認情況下,該功能處於打開狀態。 在這種模式下,nginx緩存管理器進程從HLS目錄中刪除舊的HLS片段和播放列表。

hls_cleanup off;

測試案例:每次推流完畢的時候Nginx會自動的清除上一次生成的.ts文件和m3u8視頻目錄文件

 

hls_nested

語法:hls_nested on|off
上下文:rtmp,server,application

切換HLS嵌套模式。在此模式下,hls_path為每個流創建一個子目錄播放列表和片段在該子目錄中創建。默認為關閉。

hls_nested on;

設置為開啟后的測試案例:例如我們當前推流的名稱為123456,則會在hls指定目錄下面新創建一個以流名稱為名字的目錄名稱,同時在這里我設置了:hls_fragment_naming system;

播放地址:http://vwww.nginx.com/live/123456/index.m3u8 

 

hls_fragment_naming

語法:hls_fragment_naming sequential | timestamp | system
上下文:rtmp,服務器,應用程序

描述:設置片段命名模式。

順序 - 使用遞增的整數
timestamp - 使用流時間戳
系統 - 使用系統時間
默認是順序的。

hls_fragment_naming system;

測試案例:hls播放地址:http://服務器IP/hls/123123/index.m3u8

system

timestamp  

 sequential 

 

hls_fragment_naming_granularity

語法:hls_fragment_naming_granularity number
上下文:rtmp,服務器,應用程序

描述:設置hls片段ID的粒度。 如果大於零,更改ids以划分所提供的值。 默認值為零。

#使用系統時間舍入到500ms作為片段名稱
hls_fragment_naming system;
hls_fragment_naming_granularity 500;

 

hls_type

語法:hls_type live | event
上下文:rtmp,服務器,應用程序

描述:設置在X-PLAYLIST-TYPE播放列表指令中指定的HLS播放列表類型。 Live HLS流通常從當前活動位置播放,該活動位置是幾個片段到播放列表的結尾。 事件HLS流始終從播放列表的開始播放。 在事件模式下,確保播放列表長度足以用於整個事件。 默認是live;

hls_type  event;

 
hls_keys

語法:hls_keys on | off
上下文:rtmp,服務器,應用程序
描述:啟用HLS加密。 AES-128方法用於加密整個HLS片段。 默認關閉。

hls_keys on;

描述:下面是使用HLS加密的示例配置。 此配置要求nginx使用--with-http_ssl_module為https支持構建。
...

http {
    ...
    server {
        listen 443 ssl;
        server_name example.com;

        ssl_certificate /var/ssl/example.com.cert;
        ssl_certificate_key /var/ssl/example.com.key;

        location /keys {
            root /tmp;
        }
    }

    server {
        listen 80;
        server_name example.com;

        location /hls {
            root /tmp;
        }
    }
}

rtmp {
    server {
        listen 1935;

        application myapp {
            live on;

            hls on;
            hls_path /tmp/hls;

            hls_keys on;
            hls_key_path /tmp/keys;
            hls_key_url https://example.com/keys/;
            hls_fragments_per_key 10;
        }
    }
}

hls_key_path

語法:hls_key_path 路徑
上下文:rtmp,服務器,應用程序

描述:設置保存自動生成的HLS密鑰的目錄。 密鑰文件具有使用OpenSSL RAND_bytes()例程創建的.key擴展和偽隨機16字節內容。 如果目錄不存在,它將在運行時創建。 默認情況下,hls_path目錄用於密鑰文件。 但是記住,你通常應該限制對密鑰文件的訪問,這些文件與播放列表和片段分開存儲時更容易。

hls_key_path / tmp / keys;

 

hls_key_url

語法:hls_key_url url
上下文:rtmp,服務器,應用程序

描述:設置HLS密鑰文件條目的URL。 當為空時,那些項目沒有前綴,並且假設鍵位於與播放列表相同的位置。 默認為空。

hls_key_url https://myserver.com/keys/;
具有上述設置的播放列表條目示例

#EXT-X-KEY:METHOD=AES-128,URI="https://myserver.com/keys/337.key",IV=0x00000000000000000000000000000151

 

hls_fragments_per_key

語法:hls_fragments_per_key 值
上下文:rtmp,服務器,應用程序

描述:設置用同一個密鑰加密的HLS分片數。 零意味着在發布開始時僅創建一個密鑰,並且使用此密鑰對會話中的所有片段進行加密。 默認值為零。

hls_fragments_per_key 10;

 

一段兼容阿里雲m3u8配置

rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;

        application live {
            live on;
            hls on;
            hls_path /home/www/live;
            hls_fragment 6;
            hls_playlist_length 36s;
            hls_sync 100ms;
            hls_fragment_naming system;
            hls_fragment_slicing aligned;
        }
    }
}

 反向代理的config 配置

        location / {
            set $stream_id "";
            rewrite_by_lua_file  /opt/openresty/nginx/conf/lua/proxy_pass_livenode.lua;
            if ( $uri ~ \.m3u8 ) {
               expires 3s;
               access_by_lua_file /opt/openresty/nginx/conf/lua/hls_address_auth.lua;
            }
            proxy_pass          $stream_id;
        }

 

 

 

 

重點:在Ubuntu上安裝Nginx來流式播放Live HLS視頻:https://www.vultr.com/docs/setup-nginx-on-ubuntu-to-stream-live-hls-video


免責聲明!

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



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