ngx_rtmp_hls_module 用于支持 RTMP 流式传输的 HLS (HTTP Live Streaming) 模块的代码。它包含了实现流媒体文件切片、播放列表生成、加密等功能的多个模块和函数。下面我会针对初学者逐步讲解代码的主要部分。
1. 模块结构
-
全局变量和函数:
-
next_publish
,next_close_stream
,next_stream_begin
,next_stream_eof
: 这些是函数指针,指向其他 RTMP 模块的默认实现。它们允许 HLS 模块在执行某些操作时,调用默认的 RTMP 行为。
-
-
数据结构:
-
ngx_rtmp_hls_frag_t
: 用于表示一个 HLS 分片。它包含该分片的持续时间、ID 和是否存在断点标志。 -
ngx_rtmp_hls_variant_t
: 表示 HLS 流的变种(例如不同分辨率或码率的版本)。包含变种的后缀和参数。 -
ngx_rtmp_hls_ctx_t
: 上下文结构,保存与当前 RTMP 流相关的 HLS 信息。它包含播放列表、密钥、分片信息等。 -
ngx_rtmp_hls_app_conf_t
: 应用配置结构,存储 HLS 模块的配置参数,比如分片长度、播放列表路径、加密密钥路径等。
-
2. 重要配置项
-
hls
:启用或禁用 HLS 功能。 -
hls_fragment
:设置每个 HLS 分片的持续时间(毫秒)。 -
hls_path
:指定 HLS 文件存储的路径。 -
hls_playlist_length
:设置播放列表的长度(毫秒)。 -
hls_sync
:同步视频和音频流的延迟。
3. 关键功能
-
创建和关闭分片:
-
ngx_rtmp_hls_open_fragment
和ngx_rtmp_hls_close_fragment
函数用于创建和关闭视频分片文件。这些分片会保存为.ts
文件,并存储在指定的目录中。
-
-
播放列表生成:
-
ngx_rtmp_hls_write_playlist
:该函数生成主播放列表(.m3u8
文件),其中包含所有 HLS 分片的信息。 -
ngx_rtmp_hls_write_variant_playlist
:为不同的流变种(例如不同的分辨率或码率)生成变种播放列表。
-
-
加密和密钥管理:
-
ngx_rtmp_hls_open_fragment
:在流开始时,如果启用了加密功能,会生成并保存加密密钥文件(.key
文件)。然后,视频分片会使用这些密钥进行加密。
-
-
分片的命名和路径:
-
ngx_rtmp_hls_get_fragment_id
:根据配置的命名规则(如时间戳、顺序编号等)生成分片的 ID。 -
ngx_rtmp_hls_rename_file
:重命名生成的.ts
文件,将临时文件重命名为实际的分片文件。
-
4. 音视频流的处理
-
音频:音频流首先会被缓存并分配一个缓冲区,如果音频帧大小超过缓冲区,则会被写入文件。
ngx_rtmp_hls_audio
用于处理音频数据,生成音频的 ADTS 头,并对其进行 HLS 切片。 -
视频:
ngx_rtmp_hls_video
用于处理视频数据。它将 H.264 视频帧转化为符合 HLS 格式的.ts
分片,并在需要时进行分片和播放列表更新。
5. 流的恢复
-
恢复播放流:
ngx_rtmp_hls_restore_stream
函数会从保存的播放列表中恢复分片信息,确保在流重新启动时能继续播放。
6. 目录和文件管理
-
ngx_rtmp_hls_ensure_directory
:确保指定的目录存在,如果不存在则创建它。
总结:
-
HLS 流式传输模块:此代码是为支持 RTMP 到 HLS 转码和分发的模块。它的核心功能包括视频分片的创建、播放列表的生成、加密支持以及音视频同步。可以从分片的创建、播放列表的生成、文件的管理等基础功能开始,逐步了解如何通过 RTMP 实现视频流的 HLS 支持。