系列文章:
Nginx rtmp 推流(publish) 解析_fdsafwagdagadg6576的專欄-CSDN博客
Nginx rtmp 拉流播放(play)_fdsafwagdagadg6576的專欄-CSDN博客
Nginx rtmp 拉流(轉發pull)_fdsafwagdagadg6576的專欄-CSDN博客
Nginx rtmp 轉推_fdsafwagdagadg6576的專欄-CSDN博客
Nginx rtmp 點播流程_fdsafwagdagadg6576的專欄-CSDN博客
Nginx rtmp server有兩種獲得流的方式:push和pull方式;pull又分成靜態或者非靜態拉流.
Relay server有兩個功能:拉流和轉推。
Relay 場景=play 場景+publish場景+轉推場景
對于上游是play,從上游拉流,發送play請求.建立信令連接.也就是向上游注冊一個subscribe。
參見play篇
對于下游是publish,發送stream begin. 建立信令連接。下游已經注冊成了subscribe,就是轉流.
pull拉流之后,立刻做轉推(根據config)。
handshake ,connect,createstream同publish,play
連接建立以后,liveav轉流.
另一個分支:ngx_rtmp_relay_create_local_ctx-->ngx_rtmp_relay_push_reconnect僅僅是斷開重連
流程圖
靜態pull和動態pull
靜態pull,根據配置ip拉流即可. 詳見參考引用。
動態pull先從業務服務器獲取源站ip,下圖是http-flv協議動態拉流,rtmp同理
源碼分析
ngx_rtmp_relay_on_result {
...
if (ngx_rtmp_relay_send_play(s) != NGX_OK) {
return NGX_ERROR;
}
//pull流之后又轉推 (轉推一共兩處,一處是接收推流之后,一處是pull之后.)
return ngx_rtmp_relay_publish_local(s);
}
QA:pull和play什么關系?
play是pull嗎,應該有區別,中間的ngx_rtmp_relay_pull才是pull
pull 開始client handshake---connect---createstream---play
(動態pull,應該是類似aqy回源找到server)
play終端也得走上述過程。
參考:nginx_rtmp_relay_module模塊解讀 - 尚碼園