ngx_rtmp_live_module.h
头文件分析
这个头文件定义了直播模块相关的结构体、函数声明和一些常量,主要用于支持 RTMP 协议中的直播流。
1. 核心数据结构:
-
ngx_rtmp_live_chunk_stream_t
:-
该结构体用于表示一个数据流中的"块",包含:
-
active
:标记该块是否处于活动状态。 -
timestamp
:数据块的时间戳。 -
csid
:流的标识符。 -
dropped
:表示被丢弃的字节数。
-
-
-
ngx_rtmp_live_ctx_t
:-
用于表示每个 RTMP 会话的上下文(例如,连接的状态、正在流媒体传输的流等)。
-
session
:指向 RTMP 会话的指针。 -
stream
:当前会话正在播放或发布的直播流。 -
active
:该上下文是否处于活动状态。 -
publishing
:标记该会话是否是发布者(即推流)。 -
paused
:标记是否处于暂停状态。 -
cs
:包含两个ngx_rtmp_live_chunk_stream_t
的数组,用于存储视频和音频数据流的状态。
-
-
ngx_rtmp_live_stream_t
:-
直播流的基本信息结构,包括:
-
name
:流的名称。 -
ctx
:该流的上下文。 -
bw_in
、bw_in_audio
、bw_in_video
:分别表示流的总带宽、音频带宽和视频带宽。 -
active
:流是否处于活动状态。 -
publishing
:流是否正在被发布。 -
epoch
:流的起始时间。
-
-
-
ngx_rtmp_live_app_conf_t
:-
该结构用于存储应用程序配置,定义了多个控制直播流行为的参数:
-
live
:是否启用直播。 -
sync
:同步设置,控制流的同步方式。 -
idle_timeout
:空闲连接的超时时间。 -
interleave
:是否启用交错模式。 -
wait_key
、wait_video
:控制是否等待关键帧或视频流。 -
publish_notify
:是否启用发布通知。
-
-
2. 主要函数声明:
-
ngx_rtmp_live_join
:让一个 RTMP 会话加入指定的直播流(作为发布者或订阅者)。 -
ngx_rtmp_live_get_stream
:获取指定名称的直播流,如果流不存在,则可以选择创建新流。 -
ngx_rtmp_live_start
、ngx_rtmp_live_stop
:分别用于开始和停止直播流。 -
ngx_rtmp_live_publish
、ngx_rtmp_live_play
:分别处理流的发布和播放操作。 -
ngx_rtmp_live_set_status
:设置流的状态,包括是否活跃、是否正在播放等。
ngx_rtmp_live_module.c
源文件分析
该文件实现了头文件中声明的函数,处理直播流的各种功能,包括流的创建、管理、发布、播放和同步。
1. 模块配置:
-
ngx_rtmp_live_postconfiguration
:用于模块的后配置阶段,注册 RTMP 事件处理函数,修改 RTMP 处理流的逻辑。 -
ngx_rtmp_live_create_app_conf
:创建应用程序的配置,设置默认值。 -
ngx_rtmp_live_merge_app_conf
:合并父子配置的值,允许继承和覆盖默认配置。
2. 直播流的创建和管理:
-
ngx_rtmp_live_get_stream
:-
查找是否已有指定名称的流,如果找不到且
create
参数为1
,则创建新流。 -
通过
ngx_hash_key
将流名称映射到流数组的索引位置,避免频繁的线性查找。
-
-
ngx_rtmp_live_join
:-
该函数让 RTMP 会话加入一个指定的流,可以是作为发布者(推流)或订阅者(拉流)。
-
如果是发布者,流将被标记为
publishing
;如果是订阅者,开始播放流。
-
-
ngx_rtmp_live_start
和ngx_rtmp_live_stop
:-
启动和停止流的播放。
-
例如,在开始播放时发送"开始播放"状态通知,在停止时发送"停止播放"状态通知。
-
3. 流的控制和同步:
-
ngx_rtmp_live_pause
:-
处理流的暂停操作。如果流被暂停,通知其他订阅者,并停止流的传输。
-
如果恢复播放,则重新启动流的传输。
-
-
ngx_rtmp_live_stream_begin
和ngx_rtmp_live_stream_eof
:-
处理流开始(
stream_begin
)和流结束(stream_eof
)事件。 -
在流开始时,启动流的播放,在流结束时停止播放。
-
4. 流的广播和同步:
-
ngx_rtmp_live_av
:-
这是处理音视频数据包的核心函数。它根据流的类型(音频或视频)以及是否为关键帧来决定是否广播数据包。
-
包括数据包的同步,确保订阅者收到正确的顺序和时间戳的数据包。
-
如果启用了流同步,则会控制数据包的时间戳,避免因网络延迟造成不同步问题。
-
5. 事件处理和状态更新:
-
ngx_rtmp_live_set_status
:-
更新流的状态,例如标记流是否活跃,是否正在发布,是否暂停等。
-
发送 RTMP 状态消息(如
NetStream.Play.Start
和NetStream.Publish.Start
),通知客户端当前的流状态。
-
配置指令
在 Nginx 配置文件中,可以通过以下指令来控制直播流的行为:
-
live
:启用或禁用直播功能。 -
stream_buckets
:设置直播流的哈希桶数量,控制流的分配方式。 -
buffer
、sync
、interleave
等:控制流的缓冲区大小、同步方式和交错模式。 -
wait_key
和wait_video
:控制是否等待视频关键帧和视频流。 -
publish_notify
和play_restart
:启用流发布和播放的通知功能。 -
idle_streams
:是否允许空闲流的存在,如果设置为0
,则停止空闲流。
总结
Nginx RTMP 直播模块通过这些功能使得流的管理、发布、播放、同步变得更加灵活和高效。模块通过 RTMP 协议进行流媒体的推送和拉取操作,并提供了流的生命周期管理(如暂停、恢复、开始和结束播放)。此外,还提供了带宽管理、流同步等功能,以确保直播体验的稳定性。