亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

nginx_rtmp的amf命令的處理

2023-09-20 08:03:09
13
0

rtmp接收的時候在通過分析chunk,組合成消息,然后在判斷收到完整的消息后,就調用ngx_rtmp_fire_event來處理碼流,鏈接,AMF等消息。使用的是類似http的動態數組處理鏈的方法。


只是http是分為11個階段,每個階段為處理回調函數的動態數組,然后依次調用每個階段的動態數組的回調函數指針運行,


而rtmp是每個消息就只有一個階段,每個階段的處理為動態數組的回調。

 


typedef ngx_int_t (*ngx_rtmp_handler_pt)(ngx_rtmp_session_t *s,
        ngx_rtmp_header_t *h, ngx_chain_t *in);

 


ngx_int_t
ngx_rtmp_fire_event(ngx_rtmp_session_t *s, ngx_uint_t evt,//指明命令的類型
        ngx_rtmp_header_t *h, ngx_chain_t *in)
{
    ngx_rtmp_core_main_conf_t      *cmcf;
    ngx_array_t                    *ch;
    ngx_rtmp_handler_pt            *hh;
    size_t                          n;


    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);//即在ngx_rtmp_core_main_conf_t中找回調


    ch = &cmcf->events[evt];
    hh = ch->elts;
    for(n = 0; n < ch->nelts; ++n, ++hh) {
        if (*hh && (*hh)(s, h, in) != NGX_OK) {
            return NGX_ERROR;
        }
    }
    return NGX_OK;
}

 


對于AMF命令的處理使用的是類似http的filter的方法。

 


首先AMF的命令是通過類型http的的動態數組回調的方法處理,

 

這樣AMF的類型的所有命令都是通過ngx_rtmp_amf_message_handler來進行處理的,


在ngx_rtmp_amf_message_handler函數中根據具體的amf命令名,找到對應的回調指針數組,即又使用了一次動態回調數組。

 


即找ngx_rtmp_core_main_conf_t中amf_hash這個hash表

 


看到ngx_rtmp_core_main_conf_t的amf_hash是通過amf_arrays初始化的,而amf_arrays是通過amf來初始化的,


amf的初始化是在:

 


最后可以看到使用的為ngx_rtmp_cmd_map

 


比如對于publish命令其處理為調用ngx_rtmp_cmd_publish_init,而在ngx_rtmp_cmd_publish_init函數中使用了類型http filter的機制。

 


對于publish命令,有全局的ngx_rtmp_publish,


ngx_rtmp_publish最開始初始化的地方在


注意其是沒有調用next_publish的,
這是最先初始化,也是最后調用的,這個應該是裝飾模式


在每個模塊中有局部全局的next_publish

 


其他模塊的處理如下:

 


這樣對于publish命令,先調用ngx_rtmp_cmd_publish_init命令,然后其調用全局的ngx_rtmp_publish
然后調用每個添加的publish處理,然后調用到next_publish,最后調用到最先設置的

 


所以amf的命令的處理經過了兩次動態回調函數數組,一次裝飾模式的回調函數處理鏈。

 


typedef struct {
    ngx_array_t             servers;    /* ngx_rtmp_core_srv_conf_t */
    ngx_array_t             listen;     /* ngx_rtmp_listen_t */


    ngx_array_t             events[NGX_RTMP_MAX_EVENT];


    ngx_event_t             hot_deploy_checker;


    ngx_hash_t              amf_hash;
    ngx_array_t             amf_arrays;
    ngx_array_t             amf;//設置amf命令處理的回調
} ngx_rtmp_core_main_conf_t;


兩次動態回調函數數組的過程都是和ngx_rtmp_core_main_conf_t相關。


第一次是找events
第二次是找amf


amf_hash是使用amf來建立的。

 

0條評論
0 / 1000
何****毅
5文章數
0粉絲數
何****毅
5 文章 | 0 粉絲
何****毅
5文章數
0粉絲數
何****毅
5 文章 | 0 粉絲
原創

nginx_rtmp的amf命令的處理

2023-09-20 08:03:09
13
0

rtmp接收的時候在通過分析chunk,組合成消息,然后在判斷收到完整的消息后,就調用ngx_rtmp_fire_event來處理碼流,鏈接,AMF等消息。使用的是類似http的動態數組處理鏈的方法。


只是http是分為11個階段,每個階段為處理回調函數的動態數組,然后依次調用每個階段的動態數組的回調函數指針運行,


而rtmp是每個消息就只有一個階段,每個階段的處理為動態數組的回調。

 


typedef ngx_int_t (*ngx_rtmp_handler_pt)(ngx_rtmp_session_t *s,
        ngx_rtmp_header_t *h, ngx_chain_t *in);

 


ngx_int_t
ngx_rtmp_fire_event(ngx_rtmp_session_t *s, ngx_uint_t evt,//指明命令的類型
        ngx_rtmp_header_t *h, ngx_chain_t *in)
{
    ngx_rtmp_core_main_conf_t      *cmcf;
    ngx_array_t                    *ch;
    ngx_rtmp_handler_pt            *hh;
    size_t                          n;


    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);//即在ngx_rtmp_core_main_conf_t中找回調


    ch = &cmcf->events[evt];
    hh = ch->elts;
    for(n = 0; n < ch->nelts; ++n, ++hh) {
        if (*hh && (*hh)(s, h, in) != NGX_OK) {
            return NGX_ERROR;
        }
    }
    return NGX_OK;
}

 


對于AMF命令的處理使用的是類似http的filter的方法。

 


首先AMF的命令是通過類型http的的動態數組回調的方法處理,

 

這樣AMF的類型的所有命令都是通過ngx_rtmp_amf_message_handler來進行處理的,


在ngx_rtmp_amf_message_handler函數中根據具體的amf命令名,找到對應的回調指針數組,即又使用了一次動態回調數組。

 


即找ngx_rtmp_core_main_conf_t中amf_hash這個hash表

 


看到ngx_rtmp_core_main_conf_t的amf_hash是通過amf_arrays初始化的,而amf_arrays是通過amf來初始化的,


amf的初始化是在:

 


最后可以看到使用的為ngx_rtmp_cmd_map

 


比如對于publish命令其處理為調用ngx_rtmp_cmd_publish_init,而在ngx_rtmp_cmd_publish_init函數中使用了類型http filter的機制。

 


對于publish命令,有全局的ngx_rtmp_publish,


ngx_rtmp_publish最開始初始化的地方在


注意其是沒有調用next_publish的,
這是最先初始化,也是最后調用的,這個應該是裝飾模式


在每個模塊中有局部全局的next_publish

 


其他模塊的處理如下:

 


這樣對于publish命令,先調用ngx_rtmp_cmd_publish_init命令,然后其調用全局的ngx_rtmp_publish
然后調用每個添加的publish處理,然后調用到next_publish,最后調用到最先設置的

 


所以amf的命令的處理經過了兩次動態回調函數數組,一次裝飾模式的回調函數處理鏈。

 


typedef struct {
    ngx_array_t             servers;    /* ngx_rtmp_core_srv_conf_t */
    ngx_array_t             listen;     /* ngx_rtmp_listen_t */


    ngx_array_t             events[NGX_RTMP_MAX_EVENT];


    ngx_event_t             hot_deploy_checker;


    ngx_hash_t              amf_hash;
    ngx_array_t             amf_arrays;
    ngx_array_t             amf;//設置amf命令處理的回調
} ngx_rtmp_core_main_conf_t;


兩次動態回調函數數組的過程都是和ngx_rtmp_core_main_conf_t相關。


第一次是找events
第二次是找amf


amf_hash是使用amf來建立的。

 

文章來自個人專欄
文章 | 訂閱
0條評論
0 / 1000
請輸入你的評論
0
0