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, 音视频处理