Jetson nano 通过Nginx建立rtmp服务器,实现局域网中的推流和拉流直播
目录
凌顺实验室(lingshunlab.com)测试,并分享如何通过Jetson Nano实现直播的推流和拉流。
安装Nginx和rtmp服务器组件
运行以下命令进行安装:
sudo apt-get install nginx
sudo apt-get install libnginx-mod-rtmp
安装完Nginx后,运行以下命令重启Nginx:
sudo systemctl restart nginx.service
重启后,一切顺利的话,访问 http://127.0.0.1 或者 主机ip,可以看到如下信息:
恭喜你Nginx安装成功!
然后我们看看rtmp服务器组件是否也安装成功了,
在命令行输入以下命令:
cd /etc/nginx/modules-enabled
ls -l
看到如下返回的信息
恭喜你rtmp模块也安装成功了!
配置RTMP
nginx的配置文件存放在 /etc/nginx/
目录下,
命令行,输入以下命令打开该目录,并修改nginx.conf文件:
cd /etc/nginx/
sudo nano nginx.conf
在配置文件的最后,添加以下代码:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
}
application hls {
live on;
hls on;
hls_path /var/www/html/hls;
hls_fragment 5s;
hls_playlist_length 15s;
hls_continuous on;
hls_cleanup on;
hls_nested on;
}
}
}
配置说明
listen
在 Nginx 配置中,listen 指令用于定义 Nginx 服务器监听的 IP 地址和端口。其基本语法如下:
listen address:port [parameters];
例如:
listen 80;
listen 127.0.0.1:8080;
listen 指令常用在 HTTP、STREAM 和 MAIL 等模块中,用于指定 Nginx 的监听位置。
-
listen 80 表示 Nginx 会监听 80 端口的所有 IP 的流量。
-
listen 127.0.0.1:8080 表示仅监听 IP 为 127.0.0.1,端口为 8080 的流量。
如果不指定 IP,则默认监听 0.0.0.0,即所有地址。
listen 后还可以带一些参数,如:
- listen 443 ssl 指定了此监听使用 SSL 协议
- listen 127.0.0.1 default_server 设置默认服务器
绑定多个 listen 可以实现不同 IP 或端口的请求处理。
总之,listen 是 Nginx 配置中一个非常基础和重要的指令,它定义了 Nginx 服务器提供服务的网络地址,是实现网络访问的基础。
chunk_size
在 Nginx 的 RTMP 模块配置中,chunk_size 参数用于设置 RTMP 协议流传输时的块大小。
RTMP(Real Time Messaging Protocol)是一种用于流媒体传输的协议。它将音视频流分成一个个小块进行传输,这些小块称为 chunk。
chunk_size 就代表了每个 chunk 的大小,单位是字节。例如:
chunk_size 4096;
这表示每个 RTMP chunk 的大小为4096字节。
设置 chunk 大小主要有以下作用:
-
减少包头开销。每个 chunk 都有一个包头,增大 chunk 大小可以减少这个开销。
-
平衡延迟和吞吐量。chunk 大小越大,网络吞吐量越高,但端到端延迟也越大。
-
优化不同网络环境下的传输。在不稳定网络中,可以适当减小 chunk 大小。
chunk 大小的合适值一般在4096-65536字节之间。默认值在不同 Nginx 版本中可能有所不同。
需要根据网络带宽、RTMP 流量和稳定性等因素进行测试,找到最佳的 chunk_size 设置。
live
在 Nginx-RTMP 模块的配置中,live 指令用于控制对直播流的支持。
live on 表示对直播流开启支持。
live off 表示不支持直播流。
例如:
application myapp {
live on;
}
这表示对名为 myapp 的应用开启直播流支持。
开启 live 后,就可以在该应用上推送直播流,Nginx-RTMP 会处理并向播放客户端转发这个实时流。
与 live 相关的还有以下参数:
- live_notify: 推流开始时发送通知的间隔
- max_streams: 每个应用的最大直播流数量
live 是基本的直播流支持参数。如果要使用 Nginx-RTMP 部署直播服务,那 live on 是必备的配置。
关闭 live 可以避免该应用被用于直播,只用于点播流或其他用途。
所以 live 参数直接控制了该应用的直播流支持开关。
hls
在 Nginx-RTMP 模块的配置中,hls 指令用于控制对HLS直播流的支持。
hls on 表示为应用开启HLS支持。
hls off 表示不生成HLS流。
例如:
application myapp {
live on;
hls on;
}
这会为 myapp 应用的直播流同时生成HLS流。
开启 hls 后,Nginx-RTMP 将直播流动态切割为ts格式的小片段,并生成m3u8索引文件,以实现HLS直播。
hls相关的其他重要参数包括:
- hls_path: HLS片段存储目录
- hls_fragment: 每片长度
- hls_playlist_length: 播放列表长度
调整这些参数可以控制HLS的生成方式。
所以hls on可以为应用实时产生HLS流,实现在移动端的直播播放。和live搭配使用效果更佳。
而hls off可以禁用HLS,从而减少不必要的性能开销。
hls_path
在 Nginx-RTMP 模块的配置中,hls_path 指令用于定义 HLS 视频片段的存储路径。
HLS(HTTP Live Streaming)是一种流媒体传输协议,它会将视频流切分成一个个小的 ts 格式片段。
hls_path 就用于指定这些 HLS 片段文件的存储目录。例如:
hls_path /data/hls;
这会将 HLS 视频片段存储在 /data/hls 目录下。
hls_path 的设置需要注意:
- 应该为 Nginx 工作进程可写的目录
- 不要设置为系统根目录
- 有足够空间存储大量小文件
在流量大的情况下,HLS 片段文件会非常多,所以 hls_path 需要设置在空间充足的目录。
hls_path 如果不设置,默认会直接存储在 Nginx 当前工作目录。
建议设置为自定义的目录,并适当监控磁盘空间占用情况。
hls_fragment
在这个 Nginx RTMP 模块的配置中,hls_fragment 指定了 HLS 流的分片长度。
hls_fragment 5s; 表示 HLS 视频流会被切分成 5 秒一个小片段。
HLS(HTTP Live Streaming)是一种流媒体传输协议,它工作的原理是:
-
将直播视频流切割成一个个小的基于 HTTP 的文件片段,每片都包含几秒的视频。
-
在客户端浏览器通过顺序调度请求这些小片段来播放视频。
那么 hls_fragment 就决定了每个 HLS 片段的长度,它越短,对于客户端就越容易开始播放,但片段数量也越多。
通常设置为 2到10秒为佳。如果设得太长,客户端播放前的缓冲时间就会更久。
除了 hls_fragment,还有其他一些参数用于控制 HLS 的切片方式,例如 hls_playlist_length 控制播放列表长度。
调整这些参数可以优化 HLS 流的传输质量。
hls_playlist_length
在 Nginx-RTMP 模块的配置中,hls_playlist_length 用于指定 HLS 播放列表的长度。
HLS(HTTP Live Streaming)通过将音视频流分成一个个小段来实现流媒体传输。这些小段会按照顺序添加到一个播放列表(playlist)文件中。
hls_playlist_length 则指定了这个播放列表的最大长度,即它可以包含的最大片段(segment)个数。例如:
hls_playlist_length 60;
表示这个播放列表最多可以包含60个片段。
当直播时间超过播放列表长度时,旧的片段会从播放列表中删除,新的片段不断被添加到列表末尾。
这样可以使播放列表的长度固定在一个范围内,不会无限增长。
播放列表长度通常设置为2-5分钟,既能满足直播延迟要求,也可以减少客户端重新加载列表的次数。
如果将其设置得太长,客户端加载和更新列表就会比较耗时。太短也会导致客户端频繁重新加载。
所以需要根据情况选择一个合适的 hls_playlist_length 值。
hls_continuous
在 Nginx-RTMP 模块的 HLS 设置中,hls_continuous 参数用于控制 HLS 流是否连续产生。
当 hls_continuous 设置为 on 时,即使没有流输入,Nginx 也会按照标准方式持续生成 HLS 流片段。
这主要有以下两个用途:
- 避免播放器错误
某些 HLS 播放器在检测到序列断开时会报错。设置 hls_continuous 可以确保即使源流中断,依然会产生连续的序列号的 HLS 片段,避免播放器的错误。
- 快速恢复
当流中断后又恢复时,开启连续模式可以避免生成带有中间间隔的序列号的片段。这样可以帮助播放器快速恢复正常播放。
如果将 hls_continuous 设置为 off,则当没有流输入时,也不会产生 HLS 片段。播放器会因为片段序列中断而报错。
所以正常情况下,建议设置 hls_continuous 为 on,确保产生连续的 HLS 序列,获得更好的直播体验。
将其关闭可能会导致一些问题,需要对 HLS 的工作机制比较了解才可以关闭。
hls_cleanup
在 Nginx-RTMP 模块的 HLS(HTTP Live Streaming) 设置中,hls_cleanup 参数用于控制是否自动清理旧的 HLS 片段文件。
hls_cleanup on 表示开启自动清理功能。
hls_cleanup off 表示关闭自动清理功能。
当 hls_cleanup 开启时,Nginx 会定期检查 HLS 流片段文件,并删除旧的、不再被播放列表引用的 HLS 片段文件。
这可以避免 HLS 音视频片段文件无限积累,节约存储空间。
通常在生产环境下都建议开启 hls_cleanup 功能。
需要注意的是,在hls_cleanup 生效前,需要确保:
-
hls_playlist_length 参数已正确设置,以控制播放列表长度。
-
hls_path 已配置,用于指定 HLS 片段文件存放目录。
-
Nginx 工作进程有权限删除 hls_path 目录下的文件。
另外,可以通过 hls_cleanup_period 参数调整清理周期,默认是 60 秒检查一次。
总之,hls_cleanup 能有效管理 HLS 文件的存储,避免系统存储空间被大量占用,所以在 HLS 播放场景下应该开启它。
hls_nested
在 Nginx-RTMP 模块的 HLS(HTTP Live Streaming)设置中,hls_nested 参数用于控制是否以目录的方式组织生成的 HLS 片段。
hls_nested on 表示启用目录方式组织 HLS 片段。
hls_nested off 表示禁用目录方式,默认片段直接在 hls_path 指定的目录下。
当 hls_nested 开启时,Nginx 会以如下目录结构组织 HLS 片段:
hls_path/
└─ streams
└─ streamid
├─ index.m3u8
├─ seq1.ts
├─ seq2.ts
这里 streams 是一级目录,streamid 是这个流的唯一标识作为二级目录。
这样可以将不同直播流的 HLS 片段隔离在各自目录下,避免直接混在一起。
主要优点:
- 方便维护不同流
- 避免文件数太多造成性能问题
- HLS 片段可以独立定期清理
所以在大型系统中,建议开启 hls_nested,使用目录方式组织 HLS 片段文件,更易于管理。
需要注意,开启后需要确保 Nginx 有权限创建子目录。
record
在 Nginx-RTMP 模块的配置中,record 指令用于控制是否录制并保存直播流。
record on 表示开启录制功能。
record off 表示关闭录制功能。
例如:
application myapp {
live on;
record on;
}
这将开启对myapp应用的直播流的录制。
开启录制功能后,Nginx-RTMP 会将直播流录制并保存为 FLV 格式的视频文件。
录制文件存放的目录可以通过 record_path 参数控制,默认是存放在 Nginx 工作目录的 records 子目录。
record_max_size 参数可以用于限制录制文件大小。
record_interval 参数可以控制切割录制文件时间间隔。
录制功能可以将直播流录下来保存为视频,实现直播录像回放等功能。但需要注意录制会占用一定存储空间。
建议结合 record_path、record_max_size 等参数来控制录制行为,避免录制文件过多导致系统负载问题。
保存配置,测试配置
添加完配置代码后,保存(ctrl+o),退出编辑(ctrl+x)
然后,使用以下命令测试:
nginx -t
会看到返回信息,当信息中包含“ sucess” 即测试通过
使用以下命令,重启nginx:
nginx -s reload
检查本机/目标主机开放的端口
可以使用nmap查看指定ip主机,打开了什么端口.
首先,需要安装nmap,运行以下命令进行安装:
sudo apt-get install nmap
运行以下命令,查看指定主机的开放端口:
nmap 192.168.100.107
已经看到rtmp服务器的1935端口,已经打开,
一切都很顺利,现在已经完成部署Nginx和rtmp服务器。
推流
最简单的推流方式是,使用OBS,
打开obs设置,配置如下:
rtmp服务器在我的局域网中的IP为192.168.100.107,请替换为你实际的主机IP地址。
hls 为刚才配置的路径,可通过修改nginx.conf实现改变。
steam1 为流密钥,与拉流相匹配即可,可以随便填写。
点击确定,保存配置。
OBS上按「开始直播」。。。
拉流
验证拉流的最简单防是使用VLC,
打开VLC播放器,选择打开网络地址,输入该拉流地址:
rtmp://192.168.100.107/hls/stream1
等待大概几秒中5-10几秒不等,
主要看主机性能,视频大小和网络环境,
经过一会儿,可以看到播放器显示出OBS的推流画面。