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,可以看到如下信息:

10|imageslim

恭喜你Nginx安装成功!

然后我们看看rtmp服务器组件是否也安装成功了,

在命令行输入以下命令:

cd /etc/nginx/modules-enabled
ls -l

看到如下返回的信息

恭喜你rtmp模块也安装成功了!

g345t3t3qwt43q

配置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 流片段。

这主要有以下两个用途:

  1. 避免播放器错误

某些 HLS 播放器在检测到序列断开时会报错。设置 hls_continuous 可以确保即使源流中断,依然会产生连续的序列号的 HLS 片段,避免播放器的错误。

  1. 快速恢复

当流中断后又恢复时,开启连续模式可以避免生成带有中间间隔的序列号的片段。这样可以帮助播放器快速恢复正常播放。

如果将 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 生效前,需要确保:

  1. hls_playlist_length 参数已正确设置,以控制播放列表长度。

  2. hls_path 已配置,用于指定 HLS 片段文件存放目录。

  3. 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服务器。

r32rqr3q23q2r32433453w

推流

最简单的推流方式是,使用OBS,

打开obs设置,配置如下:

u65eu6e5y5w4

rtmp服务器在我的局域网中的IP为192.168.100.107,请替换为你实际的主机IP地址。

hls 为刚才配置的路径,可通过修改nginx.conf实现改变。

steam1 为流密钥,与拉流相匹配即可,可以随便填写。

点击确定,保存配置。

OBS上按「开始直播」。。。

拉流

验证拉流的最简单防是使用VLC,

打开VLC播放器,选择打开网络地址,输入该拉流地址:

rtmp://192.168.100.107/hls/stream1

b4g5wgb

等待大概几秒中5-10几秒不等,

主要看主机性能,视频大小和网络环境,

经过一会儿,可以看到播放器显示出OBS的推流画面。