1. 配置指令
模块通过 ngx_rtmp_notify_commands
定义了多个配置指令,这些指令允许用户配置与 RTMP 会话相关的事件通知 URL 和方法。
enum {
NGX_RTMP_NOTIFY_PLAY,
NGX_RTMP_NOTIFY_PUBLISH,
NGX_RTMP_NOTIFY_PLAY_DONE,
NGX_RTMP_NOTIFY_PUBLISH_DONE,
NGX_RTMP_NOTIFY_DONE,
NGX_RTMP_NOTIFY_RECORD_DONE,
NGX_RTMP_NOTIFY_UPDATE,
NGX_RTMP_NOTIFY_APP_MAX
};
enum {
NGX_RTMP_NOTIFY_CONNECT,
NGX_RTMP_NOTIFY_DISCONNECT,
NGX_RTMP_NOTIFY_SRV_MAX
};
-
事件相关指令:
-
on_connect
:配置连接事件的通知 URL。 -
on_disconnect
:配置断开连接事件的通知 URL。 -
on_publish
:配置发布流的通知 URL。 -
on_play
:配置播放流的通知 URL。 -
on_publish_done
:配置发布流完成后的通知 URL。 -
on_play_done
:配置播放流完成后的通知 URL。 -
on_done
:配置完成事件的通知 URL。 -
on_record_done
:配置录制完成的通知 URL。 -
on_update
:配置更新事件的通知 URL。
-
-
HTTP 方法配置:
-
notify_method
:配置 HTTP 请求使用的方法(GET 或 POST)。
-
-
时间相关配置:
-
notify_update_timeout
:设置更新事件的超时时间。 -
notify_update_strict
:设置是否严格要求更新操作成功。
-
-
转发相关配置:
-
notify_relay_redirect
:配置是否允许转发(relay)重定向。
-
这些配置通过 ngx_rtmp_notify_on_srv_event
和 ngx_rtmp_notify_on_app_event
进行解析,分别用于服务器级别和应用级别的事件通知配置。
2. 配置合并与创建
-
ngx_rtmp_notify_create_app_conf
:-
用于创建应用级的配置结构体
ngx_rtmp_notify_app_conf_t
,它存储了关于各类事件的 URL 配置、方法(GET 或 POST)、更新超时时间等信息。
-
-
ngx_rtmp_notify_create_srv_conf
:-
用于创建服务器级的配置结构体
ngx_rtmp_notify_srv_conf_t
,主要存储与服务器相关的事件通知配置。
-
-
ngx_rtmp_notify_merge_app_conf
和ngx_rtmp_notify_merge_srv_conf
:-
这两个函数用于合并父级和子级的配置,确保配置的继承和覆盖。
-
3. 通知请求的创建
通知请求的创建通过以下函数实现:
-
ngx_rtmp_notify_create_request
:-
根据给定的
url_idx
和参数,创建 HTTP 请求的数据链表。该函数格式化并构建请求,发送到对应的 URL。根据配置的 HTTP 方法(GET 或 POST),选择不同的请求格式。
-
-
ngx_rtmp_notify_connect_create
、ngx_rtmp_notify_disconnect_create
、ngx_rtmp_notify_publish_create
、ngx_rtmp_notify_play_create
等:-
这些函数负责根据不同的 RTMP 事件(如连接、断开、发布、播放等)构建 HTTP 请求的数据体(如事件名称、应用名、URL 等)。它们会生成合适的请求链表(
ngx_chain_t
),并交给ngx_rtmp_notify_create_request
来最终生成 HTTP 请求。
-
4. 事件处理
-
ngx_rtmp_notify_connect_handle
:-
该函数处理连接事件的通知。如果服务器返回了 3xx 重定向响应,模块会尝试解析重定向的目标地址并执行重定向。
-
-
ngx_rtmp_notify_publish_handle
:-
处理发布事件的通知。如果发生重定向(如推流到另一个地址),模块会更新发布流的 URL,并重新执行推流。
-
-
ngx_rtmp_notify_play_handle
:-
处理播放事件的通知。如果发生重定向,模块会更新播放流的 URL,并重新执行播放。
-
-
ngx_rtmp_notify_update_handle
:-
处理更新事件的通知。根据配置的超时限制(
update_timeout
),定期发送更新请求。
-
-
ngx_rtmp_notify_record_done_handle
:-
处理录制完成事件的通知。记录完毕后,向配置的 URL 发送通知。
-
5. 会话和标志管理
-
ngx_rtmp_notify_init
:-
初始化 RTMP 会话的通知状态,包括设置事件的名称、参数和标志。如果配置了更新事件的 URL,并且设置了超时时间,它会初始化定时器并定期发送更新事件。
-
-
ngx_rtmp_notify_clear_flag
:-
清除会话中的标志位,用于处理事件完成后的状态重置。
-
6. HTTP 响应解析
-
ngx_rtmp_notify_parse_http_retcode
:-
解析 HTTP 响应的状态码。如果返回 2xx,表示成功;如果返回 3xx,表示重定向;其他状态则表示失败。
-
-
ngx_rtmp_notify_parse_http_header
:-
解析 HTTP 响应头部,用于提取重定向的目标地址或其他响应内容。
-
7. 最终处理与回调
-
ngx_rtmp_notify_done
:-
在事件完成时调用,通过回调通知外部系统事件已经处理完毕。
-
-
ngx_rtmp_notify_done_create
:-
用于创建完成事件的请求数据,通常是响应外部系统的回调请求。
-
8. 总结与扩展
该模块的核心作用是监听 RTMP 流会话的各种事件,并通过 HTTP 通知外部系统。通过配置指令,用户可以灵活地指定哪些事件需要被通知,并设置通知的方式(如 HTTP POST 或 GET)。对于直播和推流应用,实时的通知机制是非常重要的,可以用于实现监控、告警、统计等功能。
模块的工作流程:
-
配置 RTMP 事件和对应的通知 URL。
-
监听 RTMP 事件(如连接、断开、发布、播放等)。
-
在事件触发时,根据配置生成 HTTP 请求,发送通知。
-
如果发生重定向,自动处理并更新通知目标。
对于初学者来说,理解该模块的核心工作是如何在 RTMP 流事件发生时,构建通知请求,并通过 HTTP 通知外部系统。