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 通知外部系统。
















