arut/nginx-ts-module

GitHub: arut/nginx-ts-module

NGINX MPEG-TS 直播模块,通过 HTTP 接收 TS 流并自动生成和管理 HLS 与 MPEG-DASH 直播内容。

Stars: 430 | Forks: 94

## NGINX MPEG-TS 直播模块 .. contents:: # 功能 - 通过 HTTP 接收 MPEG-TS - 生成并管理直播 HLS_ - 生成并管理直播 MPEG-DASH_ # 兼容性 - `nginx `_ 版本 >= 1.11.5 # 构建 使用该模块构建 nginx: .. code-block:: bash ``` # static module $ ./configure --add-module=/path/to/nginx-ts-module # dynamic module $ ./configure --add-dynamic-module=/path/to/nginx-ts-module ``` # 指令 ## ts ========== ======== *语法:* ``ts`` *上下文:* location ========== ======== 为该 location 设置直播 MPEG-TS 处理程序。 要生成 HLS 或 MPEG-DASH,**必须**使用此指令。 URI 的最后一个组件用作流名称。 例如,如果 URI 是 ``/foo/bar/baz``,则流名称为 ``baz``。 通过运行 ``ffmpeg`` 是通过 HTTP 传输 MPEG-TS 的一种简单方法: .. code-block:: bash ``` $ ffmpeg ... -f mpegts http://127.0.0.1:8000/foo ``` 默认情况下,nginx 中的 HTTP 请求正文大小受限。 要启用没有大小限制的直播,请使用指令 ``client_max_body_size 0``。 ## ts_hls ========== ======== *语法:* ``ts_hls path=PATH [segment=MIN[:MAX]] [segments=NUMBER] [max_size=SIZE] [noclean]`` *上下文:* location ========== ======== 允许在该 location 生成直播 HLS。 ``PATH`` 参数指定将用于创建 HLS 播放列表和分片文件的目录。 如果目录不存在,则会自动创建。 对于每个发布的流,都会在 ``PATH`` 目录下创建一个以流名称命名的子目录。 在流子目录中创建的 HLS 播放列表文件名为 ``index.m3u8``。 系统会安装一个 path 处理程序来监视目录中的文件。 一旦目录中的旧文件足够老化且不再应被客户端访问,它们将被自动删除。 不允许在其他 ``ts_hls`` 或 ``ts_dash`` 指令中重复使用该路径。 ``segment`` 参数指定分片的最小和最大持续时间。 如果流包含视频,则分片从视频关键帧开始。 如果在 ``MAX`` 持续时间内未出现关键帧,则分片将被截断。 最小分片持续时间的默认值为 5 秒。 如果未指定,最大分片持续时间将设置为最小值的两倍。 ``segments`` 参数指定播放列表中分片的最大数量。 随着新分片被添加到播放列表中,最旧的分片将被从中移除。 ``max_size`` 参数指定分片的最大大小。 一旦分片达到此大小,就会被截断。 ``noclean`` 参数指示不应自动从磁盘中删除旧文件(分片和播放列表)。 示例: ``` location / { ts; ts_hls path=/var/hls segment=10s; } ``` ## ts_dash ========== ======== *语法:* ``ts_dash path=PATH [segment=MIN[:MAX]] [segments=NUMBER] [max_size=SIZE] [noclean]`` *上下文:* location ========== ======== 允许在该 location 生成直播 MPEG-DASH。 ``PATH`` 参数指定将用于创建 MPEG-DASH manifest 和分片文件的目录。 如果目录不存在,则会自动创建。 对于每个发布的流,都会在 ``PATH`` 目录下创建一个以流名称命名的子目录。 在流子目录中创建的 MPEG-DASH manifest 文件名为 ``index.mpd``。 系统会安装一个 path 处理程序来监视目录中的文件。 一旦目录中的旧文件足够老化且不再应被客户端访问,它们将被自动删除。 不允许在其他 ``ts_hls`` 或 ``ts_dash`` 指令中重复使用该路径。 ``segment`` 参数指定分片的最小和最大持续时间。 如果流包含视频,则分片从视频关键帧开始。 如果在 ``MAX`` 持续时间内未出现关键帧,则分片将被截断。 最小分片持续时间的默认值为 5 秒。 如果未指定,最大分片持续时间将设置为最小值的两倍。 在为 ``MAX`` 参数设置显式值时,应考虑到以下注意事项。 如果下一个分片比上一个分片短两倍以上,dash.js_ 可能会陷入死循环,不断地重复请求第二个分片。 ``segments`` 参数指定 manifest 中分片的最大数量。 随着新分片被添加到 manifest 中,最旧的分片将被从中移除。 ``max_size`` 参数指定分片的最大大小。 一旦分片达到此大小,就会被截断。 ``noclean`` 参数指示不应自动从磁盘中删除旧文件(分片和 manifest)。 示例: ``` location / { ts; ts_dash path=/var/hls segment=10s; } ``` # 示例 nginx.conf: ``` # nginx.conf events { } http { server { listen 8000; location / { root html; } location /publish/ { ts; ts_hls path=/var/media/hls segment=10s; ts_dash path=/var/media/dash segment=10s; client_max_body_size 0; } location /play/ { types { application/x-mpegURL m3u8; application/dash+xml mpd; video/MP2T ts; video/mp4 mp4; } alias /var/media/; } } } ``` HTML 中的 HLS: .. code-block:: html ``` ``` 使用 dash.js_ 播放器在 HTML 中播放 MPEG-DASH: .. code-block:: html ``` ``` 推流单比特率 mp4 文件: .. code-block:: bash ``` $ ffmpeg -re -i ~/Movies/sintel.mp4 -bsf:v h264_mp4toannexb -c copy -f mpegts http://127.0.0.1:8000/publish/sintel ``` 以多比特率推流 mp4 文件。 为了正确生成 HLS,流应通过 ``ffmpeg`` 的 ``-program`` 选项被分组到 MPEG-TS 程序中: .. code-block:: bash ``` $ ffmpeg -re -i ~/Movies/sintel.mp4 -bsf:v h264_mp4toannexb -map 0:0 -map 0:1 -map 0:0 -map 0:1 -c:v:0 copy -c:a:0 copy -c:v:1 libx264 -b:v:1 100k -c:a:1 libfaac -ac:a:1 1 -b:a:1 32k -program "st=0:st=1" -program "st=2:st=3" -f mpegts http://127.0.0.1:8000/publish/sintel ``` .. _HLS: https://tools.ietf.org/html/draft-pantos-http-live-streaming-23 .. _MPEG-DASH: https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP .. _dash.js: https://github.com/Dash-Industry-Forum/dash.js
标签:HLS, MPEG-DASH, MPEG-TS, Nginx, 客户端加密, 流媒体服务器, 负责任AI, 音视频处理