作者原創,轉載請聯系作者
publisher通過Publish進行推送流之后,客戶端可以發起Play操作,本文描述客戶端經過handshake、connection協議后的Play協議。Play協議與Publish協議非常類似,細節不同而已,本文主要講解不同之處。
涉及模塊
針對推流操作,NGX-RTMP處理比較復雜,涉及的模塊也比較多,先羅列如下。至于回調如何注冊、如何調用請參考前文。
- 模塊名:ngx_rtmp_access_module
回 調:ngx_rtmp_access_play - 模塊名:ngx_rtmp_cfms_module
回 調:ngx_rtmp_cfms_play - 模塊名:ngx_rtmp_cmd_module
回 調:ngx_rtmp_cmd_play - 模塊名:ngx_rtmp_exec_module
回 調:ngx_rtmp_exec_play - 模塊名:ngx_rtmp_live_module
回 調:ngx_rtmp_live_play - 模塊名:ngx_rtmp_log_module
回 調:ngx_rtmp_log_play - 模塊名:ngx_rtmp_notify_module
回 調:ngx_rtmp_notify_play - 模塊名:ngx_rtmp_play_module
回 調:ngx_rtmp_play_play - 模塊名:ngx_rtmp_log_module
回 調:ngx_rtmp_log_play - 模塊名:ngx_rtmp_relay_module
回 調:ngx_rtmp_relay_play
具體處理
- 上述那些模塊如何順序調用?
在注冊回調時,將原回調ngx_rtmp_publish保存起來為next_publish。在ngx_rtmp_live_publish回調處理完畢后調用next_publish,從而下一個模塊繼續調用。見代碼:
next_publish = ngx_rtmp_publish;
ngx_rtmp_publish = ngx_rtmp_live_publish;
- 上述那些模塊調用順序如何?
這個問題較簡單,查看我的前文《RTMP添加到NGINX》中描述,主要根據編譯時生成的 ngx_module_t *ngx_modules[] 變量在啟動的時候一次執行 - 做什么什么工作?
因為模塊比較多,在此挑選ngx_rtmp_live_module進行敘述,其他模塊處理細節請各位看官閱讀代碼,如有問題可以消息我,如有必要可以再撰文描述- 合法性校驗主要有:
NetStream.Play.StreamNotFound
NetStream.Publish.BadName
- 設置ctx
```
ctx->stream = stream;
ctx->publishing = 0;
ctx->next = (stream)->ctx;
ctx->cs[0].csid = NGX_RTMP_CSID_VIDEO;
ctx->cs[1].csid = NGX_RTMP_CSID_AUDIO;
- 給pulbisher回復消息NetStream.Play.Start