Nginx-rtmp怎么實現直播媒體實時流效果

0. 前言

  這段時間在搭建一個ipcamera項目服務器。視頻點對點通話,客戶端會查看設備端的音視頻實時流。為了省流量,是通過p2p進行穿透。但是由于nat設備的原因和ipv4的枯竭。有些設備是無法進行點對點傳輸實時流。所以需要進行服務器轉發。這里為了快速實現原型,同時參考現在主流的流媒體協議。發現很多使用的是rtmp協議。

  下圖是總體設計圖,為了整合多平臺,會自建rtmp流媒體服務器和使用云廠商saas的rtmp流媒體服務。但是由于有時候會傳輸一些非流媒體數據,需要傳輸一些二進制文件,所以會需要自定義媒體轉發服務。

  以下是我實際項目中,用到的架構實現流程圖。

Nginx-rtmp怎么實現直播媒體實時流效果

?1.?客戶端a無法進行p2p穿透,請求業務服務器要進行轉發。 ?2.?業務服務器根據客戶端a,請求類型,返回對應的轉發服務器地址和對應的房間號roomid/token等信息 ?3.?上述請求類型,可以是請求自建rtmp流媒體服務,購買于云廠商rtmp流媒體服務或者自定義協議媒體轉發服務 ?4.?客戶端a得到業務服務器返回的媒體服務器地址和roomid/token ?5.?通過信令服務器或者mqtt服務器,把對應的媒體服務器地址和roomid/token告訴另一端客戶端b ?6.?客戶端a和客戶端b同時進入相同房間room,客戶端a進行推流,客戶端b進行拉流 ?7.?其他媒體信息,如編解碼格式,清晰度,播放,暫停,拍照等命令,通過上述信令或mqtt服務器進行命令控制

1. 編譯nginx

  rtmp流媒體服務器,現成的開源方案有很多,有srs,red5,wowoza,fms等,我這里使用的是nginx的rtmp插件實現實時流轉發。

  下載 nginx-rtmp-module?

  重新編譯nginx

--prefix=/opt/nginx?--with-stream?--with-http_ssl_module?--with-stream_ssl_module?--with-debug?--add-module=../nginx-rtmp-module

2. 配置nginx.conf

  基本的nginx配置,這里就不進行介紹了,需要了解的可以參考我其他博客,里面有介紹。這里只介紹rtmp段的定義。

rtmp{ ??server{ ????listen?8081; ????access_log?logs/rtmp_access.log; ????on_connect?http://127.0.0.1:8080/v1/rtmp/on_connect; ????application?rtmp?{ ??????live?on; ??????notify_method?get; ??????on_play?http://127.0.0.1:8080/v1/rtmp/on_play; ??????on_publish?http://127.0.0.1:8080/v1/rtmp/on_publish; ??????on_done?http://127.0.0.1:8080/v1/rtmp/on_done; ??????on_play_done?http://127.0.0.1:8080/v1/rtmp/on_play_done; ??????on_publish_done?http://127.0.0.1:8080/v1/rtmp/on_publish_done; ??????on_record_done?http://127.0.0.1:8080/v1/rtmp/on_record_done; ??????on_update?http://127.0.0.1:8080/v1/rtmp/on_update; ??????notify_update_timeout?10s; ????} ????application?vod?{ ??????play?/opt/openresty/video; ????} ??} }

3. http異步通知回調

?  nginx-rtmp-module插件實現了針對rtmp協議的一些命令做了事件通知。這里我通過一個簡單的springboot項目,快速搭建一個http服務來接收rtmp的回調。

?package?com.wunaozai.rtmp.notify.controller; import?javax.servlet.http.httpservletrequest; import?org.springframework.web.bind.annotation.getmapping; import?org.springframework.web.bind.annotation.requestmapping; import?org.springframework.web.bind.annotation.restcontroller; @restcontroller @requestmapping(value="/v1/rtmp/") public?class?rtmpnotifycontroller?{ ??@getmapping(value="/on_connect") ??public?string?onconnect(httpservletrequest?request){ ????debug(request,?"on_connect"); ????return?"on_connect"; ??} ??@getmapping(value="/on_play") ??public?string?onplay(httpservletrequest?request){ ????debug(request,?"on_play"); ????return?"on_play"; ??} ??@getmapping(value="/on_publish") ??public?string?onpublish(httpservletrequest?request){ ????debug(request,?"on_publish"); ????return?"on_publish"; ??} ??@getmapping(value="/on_done") ??public?string?ondone(httpservletrequest?request){ ????debug(request,?"on_done"); ????return?"on_done"; ??} ??@getmapping(value="/on_play_done") ??public?string?onplaydone(httpservletrequest?request){ ????debug(request,?"on_play_done"); ????return?"on_play_done"; ??} ??@getmapping(value="/on_publish_done") ??public?string?onpublishdone(httpservletrequest?request){ ????debug(request,?"on_publish_done"); ????return?"on_publish_done"; ??} ??@getmapping(value="/on_record_done") ??public?string?onrecorddone(httpservletrequest?request){ ????debug(request,?"on_record_done"); ????return?"on_record_done"; ??} ??@getmapping(value="/on_update") ??public?string?onupdate(httpservletrequest?request){ ????debug(request,?"on_update"); ????return?"on_update"; ??} ??private?string?debug(httpservletrequest?request,?string?action){ ????string?str?=?action?+?":?"?+?request.getrequesturi()?+?"?"?+?request.getquerystring(); ????system.out.println(str); ????return?str; ??} }

4. 運行效果

  (1) 啟動nginx和springboot

  (2) 以下是springboot打印信息(各位可以簡單分析一下這些日志的)

on_connect:?/v1/rtmp/on_connect?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178269841&call=connect on_publish:?/v1/rtmp/on_publish?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=publish&name=room&type=live on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=update_publish&time=10&timestamp=3999&name=room on_done:?/v1/rtmp/on_done?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=done&name=room on_publish_done:?/v1/rtmp/on_publish_done?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=541&call=publish_done&name=room on_connect:?/v1/rtmp/on_connect?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178305623&call=connect on_publish:?/v1/rtmp/on_publish?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=publish&name=room&type=live on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=10&timestamp=7296&name=room on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=20&timestamp=17248&name=room on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=30&timestamp=27328&name=room on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=40&timestamp=37280&name=room on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=50&timestamp=47296&name=room on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=60&timestamp=57312&name=room on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=70&timestamp=67264&name=room on_connect:?/v1/rtmp/on_connect?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178380351&call=connect on_play:?/v1/rtmp/on_play?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345 on_play_done:?/v1/rtmp/on_play_done?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=play_done&name=room&pass=12345 on_done:?/v1/rtmp/on_done?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=557&call=done&name=room&pass=12345 on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=80&timestamp=77344&name=room on_connect:?/v1/rtmp/on_connect?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178388202&call=connect on_play:?/v1/rtmp/on_play?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345 on_done:?/v1/rtmp/on_done?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=done&name=room&pass=12345 on_play_done:?/v1/rtmp/on_play_done?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=563&call=play_done&name=room&pass=12345 on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=90&timestamp=87360&name=room on_connect:?/v1/rtmp/on_connect?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178396146&call=connect on_play:?/v1/rtmp/on_play?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345 on_done:?/v1/rtmp/on_done?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=done&name=room&pass=12345 on_play_done:?/v1/rtmp/on_play_done?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=569&call=play_done&name=room&pass=12345 on_connect:?/v1/rtmp/on_connect?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&epoch=178403666&call=connect on_play:?/v1/rtmp/on_play?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=play&name=room&start=4294966296&duration=0&reset=0&pass=12345 on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=100&timestamp=97311&name=room on_update:?/v1/rtmp/on_update?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=update_play&time=10&timestamp=105504&name=room&pass=12345 on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=110&timestamp=107199&name=room on_done:?/v1/rtmp/on_done?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=done&name=room&pass=12345 on_play_done:?/v1/rtmp/on_play_done?app=rtmp&flashver=&swfurl=&tcurl=rtmp://rtmp.wunaozai.com:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=574&call=play_done&name=room&pass=12345 on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=120&timestamp=117344&name=room on_update:?/v1/rtmp/on_update?app=rtmp&flashver=fmle/3.0%20(compatible%3b%20fmsc/1.0)&swfurl=&tcurl=rtmp://120.24.210.62:8081/rtmp&pageurl=&addr=113.74.127.195&clientid=547&call=update_publish&time=130&timestamp=122815&name=room

(3) 客戶端進行推流,這里的推流軟件,我是使用這個

Nginx-rtmp怎么實現直播媒體實時流效果

  (4) 移動端,我使用微信小程序里的 騰訊視頻云? 這個小程序里面有rtmp測試

Nginx-rtmp怎么實現直播媒體實時流效果

  (5) nginx-rtmp 日志

1?113.74.127.195?[05/aug/2018:16:18:08?+0800]?publish?"rtmp"?"room"?""?-?2646572?687?""?"fmle/3.0?(compatible;?fmsc/1.0)"?(1m?46s) ?2?113.74.127.195?[05/aug/2018:16:19:49?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?542?""?""?(4s) ?3?113.74.127.195?[05/aug/2018:16:19:57?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?542?""?""?(4s) ?4?113.74.127.195?[05/aug/2018:16:20:05?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?542?""?""?(4s) ?5?113.74.127.195?[05/aug/2018:16:20:13?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?542?""?""?(4s) ?6?113.74.127.195?[05/aug/2018:16:30:39?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?871?""?""?(4s) ?7?113.74.127.195?[05/aug/2018:16:30:54?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?647163?""?""?(12s) ?8?113.74.127.195?[05/aug/2018:16:31:08?+0800]?publish?"rtmp"?"room"?""?-?4961955?409?""?"fmle/3.0?(compatible;?fmsc/1.0)"?(1m?30s) ?9?113.74.127.195?[05/aug/2018:23:06:47?+0800]?publish?"rtmp"?"room"?""?-?425763?529?""?"fmle/3.0?(compatible;?fmsc/1.0)"?(13s) 10?113.74.127.195?[05/aug/2018:23:08:29?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?871?""?""?(4s) 11?113.74.127.195?[05/aug/2018:23:08:37?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?871?""?""?(4s) 12?113.74.127.195?[05/aug/2018:23:08:45?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?871?""?""?(4s) 13?113.74.127.195?[05/aug/2018:23:09:05?+0800]?play?"rtmp"?"room"?"pass=12345"?-?413?926026?""?""?(17s) 14?113.74.127.195?[05/aug/2018:23:09:30?+0800]?publish?"rtmp"?"room"?""?-?7061016?409?""?"fmle/3.0?(compatible;?fmsc/1.0)"?(2m?20s)

5. rtmp鑒權方式

   一般商用的話,為了防止被其他人使用和安全性考慮,所以需要對rtmp進行鑒權處理。鑒權如果有特殊性的,可以通過修改nginx-rtmp-module的源代碼,然后進行修改,其實就是增加個auth函數,這個函數可以查詢數據庫之類的,然后決定返回0成功還是-1表示失敗。

  除了上面說到的方式,還可以通過簡單的方式,就是上面提到的http回調。如果http回調返回的http狀態碼是2xx的,表示成功。如果是返回5xx的狀態碼,那么表示失敗。那樣的話,服務器就是斷開rtmp連接。

  就是在?rtmp://rtmp.wunaozai.com/rtmp_live/room?username=username&password=password

  至于實現,這里暫時還沒有,其實就是在springboot項目中對每個請求,判斷一下參數即可。如果后面有機會就詳細寫一下,關聯redis數據庫,實現房間號功能。但是可能不會寫了,因為實際上不難。就是整個流程跑通還是比較多代碼要寫的,在博客里貼太多代碼有點不好。博客最主要的還是提供思路。實際實現就應該在項目中實現了。

6. 其他

  這里是一些配置說明和示例

application?創建一個rtmp應用,這里有點區別于http的location timeout?60s? stocket超時,可以配合keepalive和ping值來實現不讓服務器端長期處于監聽連接客戶端狀態,實現快速關掉socket ping?3m ping_timeout?30s rtmp?ping用于檢查活動連接的協議。發送一個特殊的包遠程連接,在ping_timeout指定時間內期待一個回復,如果沒有收到回復,連接斷開 max_streams?32 設置rtmp流的最大數目,單一流數據最大限制,一般默認的32就可以了 ack_window?5000000 設置rtmp窗口的大小 chunk_size?4096 數據塊大小?設置值越大cpu負載就越小 max_queue 最大隊列數,一般默認即可 max_message?1m 輸入數據消息的最大大小。所有輸入數據消息都會保存在內存中,等待完成流媒體轉發。在理論上傳入的消息可以是非常大,對服務器穩定性影響較大,所以一般默認即可。 out_queue out_cork buflen?5s 設置默認緩沖區長度。通常客戶端發送播放前rtmp?set_buflen命令并重置該設置 訪問控制 access allow/deny 允許來自指定地址或者所有地址發布/播放 allow?public?127.0.0.1 deny?publish?all; allow?play?192.168.0.0/24 deny?play?all; exec命令 exce? exec_options?on; 啟動一些exec指令選項,通過一些exec事件來干預整個rtmp流 可以仔細一些外部編解碼功能 exec?ffmpeg?-i?rtmp://localhost?src/$name?-vcodec?libx264?-vprofile?baseline?-g?10?-s?300x200?-acodec?libfaac?-ar?44100?-ac?1?-f?flv?rtmp://localhost/hls/$name?2>>?/var/log/ffmpeg-$name.log; exce_statc? 類似exce,屬于靜態命令,不支持傳遞上下文參數 exec_kill_signal?term; exec_kill_signal?user1; exec_kill_signal?3; exec_pull? exec_push exec_publish 指定與參數外部命令要在發布事件執行。 exec_play 指定與要在打開事件執行外部命令 exec_play_done 指定要在打開完成事件執行外部命令 exec_publish_done exec_record_done 例子 exec_play?bash?-c?“echo?$addr?$pageurl?>>?/tmp/clients” exec_publish?base?-c?“echo?$addr?$flashver?>>?/tmp/publishers” 轉錄 exec_record_done?ffmpeg?-y?-i?$path?-acodec?libmp31ame?-ar?44100?-ac?1?-vcodec?libx264?$dirname/$basename.mp4 live?模式 live?on 切換直播模式,即一對多廣播 meta?on/copy/off 奇幻發送元數據到客戶端?默認on interleave?on/off 切換交叉模式。在該模式下,音視頻會在同一個rtmpchunk流中傳輸。默認為off wait_key?on|off 使視頻流從一個關鍵幀開始,默認為off wait_video?on|off 在一個視頻幀發送前禁用音頻。默認off 通過wait_key/wait_video進行組合以使客戶端可以收到具有所有其他數據的視頻關鍵幀。但這樣會增加連接延遲。不過可以通過編解碼器中調整關鍵幀間隔來減少延遲。 publish_notify?on 發送netstream.publish.start和netstream.publish.stop給用戶,默認off drop_idle_publisher?10s 終止指定時間內閑置(沒有音頻、視頻)的發布連接,默認為off。注意這個僅僅對于發布模式的連接起作用(發送publish命令之后) sync?10ms 同步音視頻流。如果用戶帶寬不足以接收發布率,服務器會丟棄一些幀。這將導致同步問題。當時間戳差超過sync指定值,將會發送一個絕對幀來解決這個問題,默認為300ms play_restart?off 使nginx-rtmp能夠在發布啟動或者停止時發送netstream.play.start?和?netstrem.play.stop到每個用戶。如果關閉的話,那么每個用戶就只能在回放的開始結束時收到該通知了。默認為on record?模式 record?off|all|audio|video|keyframes|manual 切換錄制模式,流可以被記錄到flv文件 off?不錄制 all?錄制音頻和視頻 audio video keyframes?只錄制關鍵視頻幀 manual?不自動啟動錄制,使用控制接口來進行啟動和停止 record_path?/tmp/rec 指定錄制的flv文件存放目錄 record_suffix?-%d-%b-%y-%t.flv 錄制后綴strftime格式 record_unique?on|off 是否添加時間戳到錄制文件,防止文件被覆蓋,默認off record_append?on|off 切換文件附加模式。開啟后,錄制時將新數據附加到舊文件后面。默認off record_lock?on|off 鎖定文件,調用系統的fcntl record_max_size?128k 設置錄制文件的最大值 record_max_frames?2 設置每個錄制文件的視頻幀最大數量 record_interval?1s/15m 在這個指令指定的時間之后重啟錄制。默認off設置為0表示錄制中無延遲。如果record_unique為off時所有的記錄都會被寫到同一個文件中。否則就會以時間戳區分在不同文件 record_notify?on|off 奇幻當定義錄制啟動或者停止文件時發送netstream.record.start和netstream.record.stop狀態信息onstatus到發布者。 應用 application?rtmp{ live?on; record?all; record_path?/var/rec; recorder?audio{ record?audio; record_suffix?.audio.flv; } recorder?chunked{ record?all; record_interval?15s; record_path?/var/rec/chunked; } } 創建錄制塊。可以在單個application中創建多個記錄?。 vod媒體 play?dir|http://loc? 播放指定目錄或者http地址的flv或者mp4文件。注意http播放是要在整個文件下載完后才開始播放。同一個play可以播放多個視頻地址(用于負載)。mp4格式要在編解碼都被rtmp支持才可以播放。一般常見的就是h264/aac application?vod{ play?/var/flvs; } application?vod_http{ play?http://localhost/vod; } play_temp_path?/www 設置遠程vod文件完全下載之后復制于play_temp_path之后的路徑。空值的話禁用此功能。 play_local_path?dir 在播放前設置遠程存儲vod文件路徑,默認/tmp play_local_path?/tmp/videos; paly?/tmp/videos?http://localhost/videos 表示播放視頻,先播放本地緩存,如果沒有的話,從localhost/videos下載到本地/tmp/videos后,在進行播放 relay模式 pull?url?[key=value] 創建pull中繼。主要是從遠程服務器拉取流媒體。并進行重新發布。 url語法?[rtmp://]host[:port][/app[/playpath]]?如果application找不到那么將會使用本地application名,如果找不到playpath那么久用當前流名稱。 參數如下(使用key=value方式) app?明確application名 name?捆綁到relay的bending流名稱。如果為空,那么會使用application中所有本地流 tcurl pageurl swfurl flashver playpath live start stop static pull?rtmp://cdn.example.com/main/ch?id=1234?name=channel; push?url?[key=value] 與pull類似,只是push推送發布流到遠程服務器。 push_reconnect?1s 在斷開連接后,在push重新連接錢等待的時間,默認3秒 session_relay?on; 切換會話relay模式。在這種情況下關閉時relay銷毀。 notify?模式 這個功能主要是提供http回調。當發送一些連接操作是,一個http請求異步發送。命令處理會被暫停掛起,知道它返回結果代碼。當http返回2xx成功狀態碼時,rtmp會話繼續。3xx狀態碼會使rtmp重定向到另一個從http返回頭獲取到的application,否則連接丟失。其他狀態碼,連接斷開。目前用來做簡單的鑒權。 on_connect?url 設置http連接回調。當客戶分發連接命令時。 例子: on_connect?http://localhost/my_auth; location?/on_connect{ if($arg_flashver?!=?“my_secret_flashver”){ rewrite?^.*$?fallback?permanent; } } on_play?url 設置http播放回調。分發客戶分發播放命令時。 http?{ location?/redirect?{ rewrite?^.*$?newname?permanent; } } rtmp{ application?myqpp{ live?on; on_play?http://localhost/redirect; } } on_publish on_doone on_play_done on_publish_done on_record_done on_update notify_update_timeout 設置on_update回調時間 notify_update_strict?on|off notify_relay_redirect?on notify_method?get 設置http方法通知,默認是application/x-www-form-urlencodeed?的post內容類型。有時候可能會需要get方法,在nginx的http{}部分處理調用。在這種情況下可以使用arg_*變量去訪問參數。 例如如果是method為get時 location?/on_play{ if($arg_pageurl?~*?localhost){ return?200; } return?500; } hls?模式 hls?on|off 使application?切換hls協議直播 hls_path?/tmp/hls; 設置hls播放列表和分段目錄。這一目錄必須在nginx啟動前就已經存在。 hls_fragment?15s; 設置hls分段長度,默認5秒,這個跟直播延遲有比較大的影響 hls_playlist_length?20m; 設置hls播放列表長度,默認30秒。這個跟直播緩存有關。 hls_sync?time 設置hls時間戳同步閾值。默認2ms。這個功能防止由低分辨率rtmp(1khz)轉換到高分辨率mpeg-ts(90khz)之后出現的噪音。 hls_continuous?on|off 切換hls連續模式,默認off。 hls_nested?on|off 切換hls嵌套模式。默認off。 hls_cleanup?on|off; 切換hls清理。默認on accesslog日志 access_log?off|path?[format_name] log_format?new_format?‘$remote_addr'; access_log?logs/rtmp_access.log?new_format; log_format?指定日志格式 創建指定的日志格式。日志格式看起來很像?nginx?http?日志格式。日志格式里支持的幾個變量有: *?connection?-?連接數。 *?remote_addr?-?客戶端地址。 *?app?-?application?名。 *?name?-?上一個流名。 *?args?-?上一個流播放/發布參數。 *?flashver?-?客戶端?flash?版本。 *?swfurl?-?客戶端?swf?url。 *?tcurl?-?客戶端?tcurl。 *?pageurl?-?客戶端頁面?url。 *?command?-?客戶端發送的播放/發布命令:none、play、publish、play+publish。 *?bytes_sent?-?發送到客戶端的字節數。 *?bytes_received?-?從客戶端接收到的字節數。 *?time_local?-?客戶端連接結束的本地時間。 *?session_time?-?持續連接的秒數。 *?session_readable_time?-?在可讀格式下的持續時間。 默認的日志格式叫做?combined。這里是這一格式的定義: $remote_addr?[$time_local]?$command?"$app"?"$name"?"$args"?-? $bytes_received?$bytes_sent?"$pageurl"?"$flashver"?($session_readable_time) limits限制 max_connections?number; 設置rtmp引擎最大連接數,默認off application?hls{ live?on; hls?on; hls_path?/tmp/hls; hls_fragment?15s; }

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享