NGINX 에서 RTMP 시작

7088 단어
작가 오리지널
본 고 는 앞에서 소개 한 rtmp 모듈 을 nginx 에 컴 파일 한 상황 에서 nginx 를 시작 할 때 rtmp 모듈 은 주로 어떤 작업 을 했 는 지 소개 한다.
Nginx 의 모듈 개발 3 단식
nginx 모듈 을 정의 하려 면 세 개의 변 수 를 정의 해 야 합 니 다: command, ctx, module.RTMP 이 3 단 식 은 rtmp. c 파일 에서 모듈 참조 코드 는 다음 과 같 습 니 다.
static ngx_command_t  ngx_rtmp_commands[] = {
  { ngx_string("rtmp"),
    NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
    ngx_rtmp_block,
    0,
    0,
    NULL },
  ngx_null_command
};

static ngx_core_module_t  ngx_rtmp_module_ctx = {
  ngx_string("rtmp"),
  NULL,
  NULL
};

ngx_module_t  ngx_rtmp_module = {
  NGX_MODULE_V1,
  &ngx_rtmp_module_ctx,                  /* module context */
  ngx_rtmp_commands,                     /* module directives */
  NGX_CORE_MODULE,                       /* module type */
  NULL,                                  /* init master */
  NULL,                                  /* init module */
  ngx_rtmp_init_process,                 /* init process */
  NULL,                                  /* init thread */
  NULL,                                  /* exit thread */
  NULL,                                  /* exit process */
  NULL,                                  /* exit master */
  NGX_MODULE_V1_PADDING
};

RTMP 모듈 은 어떻게 시작 합 니까?
RTMP 모듈 의 시작 함 수 는 ngxrtmp_commands 가 설명 한 ngxrtmp_block()。다음은 어떻게 호출 하 는 지 설명 한다.
  • ngx_rtmp_commands 의 유형 은 ngxcommand_t, 그 정의: struct ngxcommand_s { ngx_str_t name; ngx_uint_t type; char (set)(ngx_conf_t *cf, ngx_command_t cmd, voidconf); ngx_uint_t conf; ngx_uint_t offset; void *post; }; rtmp_Block 대응 은 set 포인터
  • set 는 nginx 가 시 작 될 때, ngxconf_handler () 에서 호출 되 었 습 니 다. 간단 한 코드 는 다음 과 같 습 니 다.이 를 통 해 알 수 있 듯 이 주로 컴 파일 할 때 생 성 되 는 ngxmodules 변 수 를 사용 하여 module 이 정의 하 는 command 와 ctx 를 추출 하고 command 의 set 함 수 를 호출 하여 각 모듈 for (i = 0; ngx modules [i]; i + +) {cmd = ngx modules [i] - > commands; for (/ * void /; cmd - > name. len; cmd +) {/ set up the directive 's configuration context * / conf = NULL; if (cmd - > type & NGX DIRECT CONF) {conf = ((void *) cf - > ctx)[ngx modmodule[] - - > index];; {{config modmodmodmodmodmodmodmodmodmodmodmodmodmodmodmodmod[- > type & NGX MAIN CONF) {conf = & (((void * *) cf - > ctx) [ngx modmodmodmodmodmodmod# - - - - - - - > index]];} (cf - > ctx * *) cf - > ctx + cmd - / / / conf); (confp) {confp = confp [ngx configx [] - - > ctx index]];}} rv = cmd - - - > set (cf - > ctx + cmd, cmd, conf 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값;} 호출 체인 은 다음 과 같 습 니 다: static ngx int t ngx conf handler(ngx_conf_t *cf, ngx_int_t last) ->
    char * ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) ->
    
    char * ngx_conf_param(ngx_conf_t *cf)  ->
    
    ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle) ->
    
    int ngx_cdecl  main(int argc, char *const *argv)
    
  • RTMP 작 동 은 무엇 을 했 습 니까? RTMP 작 동 은 구체 적 으로 무엇 을 했 습 니까? 사실은 ngx rtmp block () 입 니 다.RTMP 모듈 수 를 계산 하고 각 모듈 의 컨 텍스트 색인 2 를 설정 하 며, 각 RTMP 모듈 에 main conf 3 를 만 들 고, 각 RTMP 모듈 에 srv conf 4 를 만 들 고, 각 RTMP 모듈 에 app conf 5 를 만 들 고, 각 RTMP 모듈 preconfiguration 6 을 호출 하 며, 각 RTMP 모듈 init main conf 7 을 초기 화하 고, 각 RTMP 모듈 의 각 APP m 를 초기 화 합 니 다.erge srv conf 8, 각 RTMP 모듈 의 각 앱 을 초기 화 하 는 merge app conf 9, 각 RTMP 서비스 이벤트 초기 화
  • 10. 각 모듈 postconfiguration 을 호출 하 는데 주로 등록 리 셋 입 니 다. 구체 적 으로 다음 과 같 습 니 다.
  • NGX RTMP CONNECT 등록 모듈: ngx rtmp limit module 등록 리 셋: ngx rtmp limit connect;
  • NGX RTMP HANDSHAKE DONE 등록 모듈: ngx rtmp relay module 에서 등록 리 셋 초기 화: ngx rtmp relay handshake done
  • NGX RTMP DISCONNECT 등록 모듈: ngx rtmp cmd module 등록 리 셋: ngx rtmp cmd disconnect init; 등록 모듈: ngx rtmp codec module 등록 리 셋: ngx rtmp codec disconnect; 등록 모듈: ngx rtmp limit module 등록 리 셋: ngx rtmp limit disconnect; 등록 모듈: ngx rtmp log module 등록 리 셋: ngx rtmp log disconnect; 등록 모듈:ngx rtmp netcall module 등록 리 셋: ngx rtmp netcall disconnect;
  • NGX RTMP MSG AUDIO 등록 모듈: ngx rtmp codec module 등록 리 셋: ngx rtmp codec av 등록 모듈: ngx rtmp dash module 등록 리 셋: ngx rtmp dash video 등록 모듈: ngx rtmp hls module 등록 리 셋: ngx rtmp hls audio 등록 모듈: ngx rtmp live module 등록 리 셋: ngx rtmp live av 등록 모듈: ngx rtmp record module 등록 리 셋 모듈: ngx rtmp record module 등록 리 셋:ngx_rtmp_record_av
  • NGX RTMP MSG VIDEO 등록 모듈: ngx rtmp codec module 등록 리 셋: ngx rtmp codec av 등록 모듈: ngx rtmp dash module 등록 리 셋: ngx rtmp dash video 등록 모듈: ngx rtmp hls module 등록 리 셋: ngx rtmp hls audio 등록 모듈: ngx rtmp live module 등록 리 셋: ngx rtmp live av 등록 모듈: ngx rtmp record module 등록 리 셋 모듈: ngx rtmp record module 등록 리 셋:ngx_rtmp_record_av

  • 11. 이벤트 처리 초기 화, 주로 AMF 메시지, 특수 메시지, 리 셋 등록 처리
    static size_t    pm_events[] = {
        NGX_RTMP_MSG_CHUNK_SIZE,
        NGX_RTMP_MSG_ABORT,
        NGX_RTMP_MSG_ACK,
        NGX_RTMP_MSG_ACK_SIZE,
        NGX_RTMP_MSG_BANDWIDTH
      };
      static size_t    amf_events[] = {
        NGX_RTMP_MSG_AMF_CMD,
        NGX_RTMP_MSG_AMF_META,
        NGX_RTMP_MSG_AMF_SHARED,
        NGX_RTMP_MSG_AMF3_CMD,
        NGX_RTMP_MSG_AMF3_META,
        NGX_RTMP_MSG_AMF3_SHARED
      };
      /* init standard protocol events */
      for(n = 0; n < sizeof(pm_events) / sizeof(pm_events[0]); ++n) {
        eh = ngx_array_push(&cmcf->events[pm_events[n]]);
        *eh = ngx_rtmp_protocol_message_handler;
      }
    
      /* init amf events */
      for(n = 0; n < sizeof(amf_events) / sizeof(amf_events[0]); ++n) {
        eh = ngx_array_push(&cmcf->events[amf_events[n]]);
        *eh = ngx_rtmp_amf_message_handler;
      }
    
      /* init user protocol events */
      eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_USER]);
      *eh = ngx_rtmp_user_message_handler;
    
      /* aggregate to audio/video map */
      eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AGGREGATE]);
      *eh = ngx_rtmp_aggregate_message_handler;
    

    특히 제시 해 야 할 것 은 ngx rtmp cmd module 모듈 에서 해당 하 는 사용자 제어 메 시 지 를 등록 하 는 것 입 니 다. 코드 는 다음 과 같 습 니 다.
    static ngx_rtmp_amf_handler_t ngx_rtmp_cmd_map[] = {
    { ngx_string("connect"),            ngx_rtmp_cmd_connect_init           },
    { ngx_string("createStream"),       ngx_rtmp_cmd_create_stream_init     },
    { ngx_string("closeStream"),        ngx_rtmp_cmd_close_stream_init      },
    { ngx_string("deleteStream"),       ngx_rtmp_cmd_delete_stream_init     },
    { ngx_string("publish"),            ngx_rtmp_cmd_publish_init           },
    { ngx_string("play"),               ngx_rtmp_cmd_play_init              },
    { ngx_string("play2"),              ngx_rtmp_cmd_play2_init             },
    { ngx_string("seek"),               ngx_rtmp_cmd_seek_init              },
    { ngx_string("pause"),              ngx_rtmp_cmd_pause_init             },
    { ngx_string("pauseraw"),           ngx_rtmp_cmd_pause_init             },
    };
    
    ......
    ncalls = sizeof(ngx_rtmp_cmd_map) /  sizeof(ngx_rtmp_cmd_map[0]);
    ch = ngx_array_push_n(&cmcf->amf, ncalls);
    bh = ngx_rtmp_cmd_map;
    for(n = 0; n < ncalls; ++n, ++ch, ++bh) {
        *ch = *bh;
    }
    ......
    

    12. 각 RTMP 서비스 검색 을 시작 하고 연결 을 등록 할 때 ngx rtmp init connection 의 리 셋 을 실행 합 니 다.

    좋은 웹페이지 즐겨찾기