nginx-rtmp-module之ngx_rtmp_live_module.c代码详解

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_inbw_in_audiobw_in_video:分别表示流的总带宽、音频带宽和视频带宽。

      • active:流是否处于活动状态。

      • publishing:流是否正在被发布。

      • epoch:流的起始时间。

  • ngx_rtmp_live_app_conf_t

    • 该结构用于存储应用程序配置,定义了多个控制直播流行为的参数:

      • live:是否启用直播。

      • sync:同步设置,控制流的同步方式。

      • idle_timeout:空闲连接的超时时间。

      • interleave:是否启用交错模式。

      • wait_keywait_video:控制是否等待关键帧或视频流。

      • publish_notify:是否启用发布通知。

2. 主要函数声明
  • ngx_rtmp_live_join:让一个 RTMP 会话加入指定的直播流(作为发布者或订阅者)。

  • ngx_rtmp_live_get_stream:获取指定名称的直播流,如果流不存在,则可以选择创建新流。

  • ngx_rtmp_live_startngx_rtmp_live_stop:分别用于开始和停止直播流。

  • ngx_rtmp_live_publishngx_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_startngx_rtmp_live_stop

    • 启动和停止流的播放。

    • 例如,在开始播放时发送"开始播放"状态通知,在停止时发送"停止播放"状态通知。

3. 流的控制和同步
  • ngx_rtmp_live_pause

    • 处理流的暂停操作。如果流被暂停,通知其他订阅者,并停止流的传输。

    • 如果恢复播放,则重新启动流的传输。

  • ngx_rtmp_live_stream_beginngx_rtmp_live_stream_eof

    • 处理流开始(stream_begin)和流结束(stream_eof)事件。

    • 在流开始时,启动流的播放,在流结束时停止播放。

4. 流的广播和同步
  • ngx_rtmp_live_av

    • 这是处理音视频数据包的核心函数。它根据流的类型(音频或视频)以及是否为关键帧来决定是否广播数据包。

    • 包括数据包的同步,确保订阅者收到正确的顺序和时间戳的数据包。

    • 如果启用了流同步,则会控制数据包的时间戳,避免因网络延迟造成不同步问题。

5. 事件处理和状态更新
  • ngx_rtmp_live_set_status

    • 更新流的状态,例如标记流是否活跃,是否正在发布,是否暂停等。

    • 发送 RTMP 状态消息(如 NetStream.Play.StartNetStream.Publish.Start),通知客户端当前的流状态。

配置指令

在 Nginx 配置文件中,可以通过以下指令来控制直播流的行为:

  • live:启用或禁用直播功能。

  • stream_buckets:设置直播流的哈希桶数量,控制流的分配方式。

  • buffersyncinterleave 等:控制流的缓冲区大小、同步方式和交错模式。

  • wait_keywait_video:控制是否等待视频关键帧和视频流。

  • publish_notifyplay_restart:启用流发布和播放的通知功能。

  • idle_streams :是否允许空闲流的存在,如果设置为 0,则停止空闲流。

总结

Nginx RTMP 直播模块通过这些功能使得流的管理、发布、播放、同步变得更加灵活和高效。模块通过 RTMP 协议进行流媒体的推送和拉取操作,并提供了流的生命周期管理(如暂停、恢复、开始和结束播放)。此外,还提供了带宽管理、流同步等功能,以确保直播体验的稳定性。

相关推荐
盛满暮色 风止何安30 分钟前
VLAN的高级特性
运维·服务器·开发语言·网络·网络协议·网络安全·php
ydm_ymz1 小时前
初阶8 list
c语言·开发语言·数据结构·c++·list
喵手1 小时前
Java实现视频格式转换的完整指南:从FFmpeg到纯Java方案!
java·开发语言·ffmpeg
钰爱&1 小时前
【Qt】ffmpeg编码—存储(H264)
c++·qt·ffmpeg
lemon3106241 小时前
dockerfile制作镜像
linux·运维·服务器·学习
yunteng5212 小时前
音视频(二)ffmpeg编译及推流
ffmpeg·音视频·h264·媒体推流
AI享网无代码创作2 小时前
WP Mail 邮件发送:WordPress Mail SMTP设置
运维·服务器·网络
Kendra9194 小时前
Keepalive+LVS+Nginx+NFS高可用架构
nginx·架构·lvs
若云止水4 小时前
ngx_http_core_main_conf_t
nginx
struggle20255 小时前
AWS Bedrock 多代理蓝图存储库使用 CDK、Streamlit 和 LangFuse 运行 AWS Bedrock 多代理 AI 协作的蓝图
运维·人工智能·自动化·云计算·aws