0. 前言
這段時間在搭建一個ipcamera專案伺服器。視訊點對點通話,客戶端會查看裝置端的音視訊即時串流。為了省流量,是透過p2p進行穿透。但是由於nat設備的原因和ipv4的枯竭。有些設備是無法進行點對點傳輸即時串流。所以需要進行伺服器轉送。這裡為了快速實現原型,同時參考現在主流的串流媒體協議。發現很多使用的是rtmp協定。
下圖是整體設計圖,為了整合多平台,會自建rtmp串流伺服器和使用雲端廠商saas的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配置 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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=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×tamp=122815&name=room(3) 客戶端進行推流,這裡的推流軟體,我是使用這個
(4) 行動端,我使用微信小程式裡的騰訊視訊雲 這個小程式裡面有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; }
以上是Nginx-rtmp怎麼實現直播媒體即時串流效果的詳細內容。更多資訊請關注PHP中文網其他相關文章!