smart rtmpd 服务器配置文件说明及优化方法介绍

----------------------------------------------------------------------------------------------------------------------------------------

一分钟快速搭建 rtmpd 服务器: https://blog.csdn.net/freeabc/article/details/102880984

软件下载地址: http://www.qiyicc.com/download/rtmpd.rar

github 地址:https://github.com/superconvert/smart_rtmpd

-----------------------------------------------------------------------------------------------------------------------------------------
smart rtmpd 服务器配置文件说明及优化方法介绍

smart rtmpd 服务器配置文件说明及优化方法介绍

就 smart rtmpd 做一个简单的介绍。

第一 smart rtmpd 无任何依赖,无需安装,解压即可运行,非常方便快捷,无论是技术老手还是新手,都能轻易部署。

第二 smart rtmpd 跨平台,windows, linux ( ubuntu & centos ), 都支持。

第三 smart rtmpd 性能高,体积小,作为一款新型的直播服务器,就是为挑战而生的,否则,就没存在的意义了。

第四 smart rtmpd 支持级联(可做大规模集群)和 CDN 的分发。

第五 smart rtmpd 具有灵活的接口,满足各种业务的需要。就说这么多吧有兴趣的可以看看

一分钟快速搭建 rtmpd 服务器: https://blog.csdn.net/freeabc/article/details/102880984

1. smart rtmpd 配置文件说明

<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置更改后,重启 rtmp 服务器 -->
<config>
	<!-- 跟踪耗时, 不要轻易打开, 容易 crash -->
	<elapse>false</elapse>
	<!-- 鉴权地址: http://authurl/v1/smart_rtmpd?type=rtmp&action=publisher&your param. -->
	<authurl></authurl>
	<!-- 套结字基本配置项 -->
	<sock>
		<!-- 接收缓冲区, 单位 KB -->
		<recvbuffer>4096</recvbuffer>
		<!-- 发送缓冲区, 单位 KB -->
		<sendbuffer>4096</sendbuffer>
	</sock>
	<!-- SSL 配置, 单项认证 serverkey, servercert 不为空; 双向认证主要用于级联  -->
	<ssl>
		<serverca></serverca>
		<serverkey></serverkey>
		<servercert></servercert>
		<clientca></clientca>
		<clientkey></clientkey>
		<clientcert></clientcert>
	</ssl>
	<!-- RTMP 网络,CPU,内存相关 -->
	<rtmp>
		<!-- 服务器地址 -->
		<ip></ip>
		<!-- 服务器端口 -->
		<port>1935</port>
		<!-- 开启 ssl -->
		<ssl>false</ssl>
		<!-- 直播标签 -->
		<live>live</live>
		<!-- h265 的 CodecID -->
		<codech265>12</codech265>
		<!-- 组包模式 1 或 2 -->
		<packmode>1</packmode>
		<!-- gop 队列最大大小 -->
		<gopsize>512</gopsize>
		<!-- 秒开功能, 不过增加延时 -->
		<gopenable>false</gopenable>
		<!-- 心跳包间隔时间(分) -->
		<heartbeat>3</heartbeat>
		<!-- chunksize -->
		<chunksize>8192</chunksize>
		<!-- 接收端队列抖动大小,超过就丢包 -->
		<shrinkesize>80</shrinkesize>	
		<!-- 堆积包个数 -->
		<waitcount>4</waitcount>
		<!-- 堆积延时设置 -->
		<waitsleep>120</waitsleep>
		<!-- 堆积大小设置 当 waitcount == 0 时,启用 -->
		<waitchunk>8192</waitchunk>
		<!-- 数据发送连续阻塞次数, 超过断开链接 -->
		<blockcount>1024</blockcount>
		<!-- 是否开启 http-flv 输出 -->
		<hasflv>true</hasflv>
		<!-- 是否开启 http-hls 输出 -->
		<hashls>true</hashls>
		<!-- 是否开启 http-dash 输出 -->
		<hasdash>true</hasdash>
		<!-- 是否开启 rtsp-live 输出 -->
		<hasrtsp>true</hasrtsp>
		<!-- rtmp2rtsp rtp payload 类型定义 -->
		<rtp h265="98" h264="96" aac="97"/>
	</rtmp>
	<!-- RTSP 服务器配置 -->
	<rtsp>
		<!-- 服务器地址 -->
		<ip></ip>
		<!-- 服务器端口 -->
		<port>8554</port>
		<!-- 开启 ssl -->
		<ssl>false</ssl>
		<!-- 是否开启 rtmp 输出 -->
		<hasrtmp>true</hasrtmp>
		<!-- 关闭 rrsp 服务 -->
		<enable>true</enable>
		<!-- rtp & rtcp 端口区间, que 接收队列最大缓冲 -->
		<rtp min="30000" max="60000" que="20000" />
	</rtsp>
	<!-- HTTP 服务器配置 -->
	<http>
		<!-- 服务器地址 -->
		<ip></ip>
		<!-- http 端口 -->
		<port>8085</port>
		<!-- 开启 ssl -->
		<ssl>false</ssl>
		<!-- 关闭 http 服务 -->
		<enable>true</enable>
		<!-- 状态查询, vod 列表查询,需要验证 -->
		<httpcmd user="admin" pwd="123456"/>
		<!-- http 累积数据大小, 超过此值才发送 -->
		<httpcache>8192</httpcache>
		<!-- http 文件下发, 文件每次读取数据大小 -->
		<httpchunk>8192</httpchunk>
		<!-- IO 队列堆积个数 -->
		<ioshrink>512</ioshrink>
		<!-- http-flv 数据累积超过此值丢包, 单位 KB -->				
		<flvblock>2048</flvblock>
		<!-- http-hls vod 模式缓存文件个数, 如出现音视频文件找不到,扩大这个值 -->
		<hlsvodcache>20</hlsvodcache>
		<!-- http-hls live 模式缓存文件个数, 如出现音视频丢帧,扩大这个值 -->
		<hlslivecache>4</hlslivecache>
		<!-- http-hls 模式 0 - ts, 1 - fmp4 -->
		<hlsmode>0</hlsmode>
		<!-- http-hls 切片个数 -->
		<hlssegment>3</hlssegment>
		<!-- http-hls 切片时长(秒) -->
		<hlsduration>5</hlsduration>
		<!-- dash vod 模式缓存文件个数, 如出现音视频文件找不到,扩大这个值 -->
		<dashvodcache>20</dashvodcache>
		<!-- dash live 模式缓存文件个数, 如出现音视频丢帧找不到,扩大这个值 -->
		<dashlivecache>8</dashlivecache>
		<!-- dash 回收文件时延, 最小 10 秒  -->
		<dashduration>10</dashduration>
		<!-- http-vod 模式 0 - dash 模式, 1 - hls 模式 -->
		<vodmode>0</vodmode>
		<!-- http-vod 存储分割时间( 分钟 ) -->
		<vodduration>1</vodduration>
	</http>
	<!-- vhost 列表 vhost 可以有多个节点,url 也可以有多个节点,Forward 第三方平台,上面的 packmode 一定配置为 2 -->
	<vhosts>		
		<!-- 可以针对虚拟主机进行 forward,name 就是虚拟主机地址和端口比如: 192.168.1.108:1936 -->	
		<vhost name="">
			<!-- 改写 url , 如: 本机 192.168.1.1, forward 地址 192.168.1.2, 就改写成 forward 的地址 -->
			<rewrite>false</rewrite>
			<!-- 是否开启 flv ,优先级高于全局配置 -->
			<hasflv>true</hasflv>
			<!-- 是否开启 hls ,优先级高于全局配置 -->
			<hashls>true</hashls>
			<!-- 是否开启 dash ,优先级高于全局配置 -->
			<hasdash>true</hasdash>
			<!-- 是否开启 rtsp ,优先级高于全局配置 -->
			<hasrtsp>true</hasrtsp>
			<!-- forword 地址列表,默认端口号 1935 也可以不加 -->
			<forward></forward>
			<!-- forword 地址列表,默认端口号 1935 也可以不加 -->
			<forward></forward>
		</vhost>
		<vhost name="">
		</vhost>
		<!-- 可以针对具体的 url 进行 forward,从而避免 forward 整个 vhost name 比如: rtmp://192.168.1.108/live/stream -->
		<url name="">
			<!-- 改写 rtmp url ,为空表示不改写,改写格式: rtmp://192.168.1.108/live/stream -->
			<!-- 例如: rtmp://www.cctv.com/live/sport 可以改写成 rtmp://www.shandong.com/live/sport -->
			<rewrite></rewrite>
			<!-- 是否开启 flv ,优先级高于全局配置 -->
			<hasflv>true</hasflv>
			<!-- 是否开启 hls ,优先级高于全局配置 -->
			<hashls>true</hashls>
			<!-- 是否开启 dash ,优先级高于全局配置 -->
			<hasdash>true</hasdash>
			<!-- 是否开启 rtsp ,优先级高于全局配置 -->
			<hasrtsp>true</hasrtsp>
			<!-- forword 地址列表,默认端口号 1935 也可以不加 -->
			<forward></forward>
			<!-- forword 地址列表,默认端口号 1935 也可以不加 -->
			<forward></forward>
		</url>
		<url name="">
		</url>
	</vhosts>
	<!-- 日志相关 -->
	<log>
	</log>
</config>

1.1  --- 性能跟踪 ( 技术人员 )

elapse 性能追踪开关,技术人员调试跟踪时,值为: true 或 false , 默认是 false 。运营时,建议关闭。

1.2  --- 鉴权服务器地址 ( 技术人员 )

authurl 鉴权服务器地址,防止有恶意用户推流,拉流,同时也可以配合自己的业务对用户进行授权处理,具体用法可参考博文

https://blog.csdn.net/freeabc/article/details/105781985

1.3 --- 套接字选项 ( 技术人员 )

TCP 套接字 recvbuffer 接收缓冲区大小,默认是 KB,  TCP 套接字 sendbuffer 发送缓冲区大小,默认是 KB

1.4 --- SSL 配置项说明 ( 技术人员 )

我们知道 SSL 支持单项和双向认证,下面就两种方法,我们一一介绍。

我们最常见的是单项认证,单项认证的配置方法如下,别的字段为空

<serverkey>server_key.pem</serverkey>
<servercert>server_cert.pem</servercert>

双向认证配置如下,一般 ca 为同一个。

<serverca>ca.pem</serverca>
<serverkey>server_key.pem</serverkey>
<servercert>server_cert.pem</servercert>
<clientca>ca.pem</clientca>
<clientkey>client_key.pem</clientkey>
<clientcert>client_cert.pem</clientcert>

1.5 --- rtmp 相关配置项

服务器绑定指定的网络地址 --- 空表示绑定所有的网络地址 (多网卡)
<ip></ip>
服务器端口 --- 默认都是 1935,这也是 rtmp 的默认端口
<port>1935</port>
true :  开启 ssl , 推流拉流必须是 rtmps 方式; false : 关闭 ssl,推流拉流必须是 rtmp 方式
怎么让 ffmpeg 支持推送 rtmps 流,参考博文 https://blog.csdn.net/freeabc/article/details/105526273
<ssl>false</ssl>
smart rtmpd 只支持两种格式的推流和拉流, 举例如下: 
点播 url --- rtmp://192.168.1.1:1935/vod/stream
直播 url --- rtmp://192.168.1.1:1935/live/stream

支持两种 app 标签, live 和 vod ,如果你觉得 live 不符合你的需求, 
可以改成你想要的格式 <live>xxx</live>,那么推拉流格式如下:
rtmp://192.168.1.1:1935/xxx/stream

我们就有关 rtmp 的 url 做一个简单的说明
rtmp://192.168.1.1:1935/live/stream
上述的 rtmp url 具体 

rtmp:// 代表的是 rtmp 协议
192.168.1.1:1935 代表 vhost ,也可以是域名,一个机器可能有一个 ip 多个域名
live 是 app 标签,代表一个应用的标签,类型,可以看作一个应用分类
stream 是这个流的名字,这个可以随意写自己想要的。比如:

rtmp://192.168.1.1:1935/live/sport
rtmp://192.168.1.1:1935/live/movie
rtmp://192.168.1.1:1935/live/music
由于 adobe 没用在 rtmp 协议内并不支持 h265 ,因此协议内的 codecID 是没有统一的值的,
包括数据格式,但国内的媒体爱好者,有个不成文的规矩,流的格式尽量按 h264 的风格走,codecID 
定义为 12. 但也有可能采用其它的值,这个地方就可以灵活配置 codecID,以适应不同的需求
<codech265>12</codech265>
smart rtmpd 打包模式分为两种,这里值只能是 1 或 2. 对于模式 1 性能会更高一点,但只适合
smart rtmpd 内部交互,如果采用这种模式可能和第三方的程序对接会有问题,比如做 CDN 分发或
级联. 如果级联对象或 CDN 对象都是 smart rtmpd 没问题,打包模式可以为 1. 如果是第三方的
产品,比如 srs 或 nginx rtmp ,就必须采用打包模式 2. 建议服务器端全部用 smart rtmpd 做
级联和 CDN 分发,模式为 1, 这样性能更高。
<packmode>1</packmode>
这个选项是对于有些推流软件, gopsize 超级大,非常不适合直播,也不适合妙可,如果 gopsize 
超过 512 帧,就采用丢弃的方式,防止因为坏流导致 smart rtmpd 出现性能降低或不稳定。
<gopsize>512</gopsize>

秒开功能, 值为 true 表示开启,false 表示关闭,如果开启妙开功能,肯定会带来直播的延时,最大
可能一个 GOP 的时长。
<gopenable>false</gopenable>
smart rtmpd 的心跳时间,单位分钟,默认是 3 分钟
<heartbeat>3</heartbeat>
性能调优项之一
rtmp 包的 chunk 大小, 理论上数值越大,性能越好,当然不是无限大最好,默认是 8K ,你可以设置
64K, 跟踪一下效果,找到一个适合自己的值,good luck! 
<chunksize>8192</chunksize>

smart rtmpd 为播放端设置的缓冲区大小,不适合过大,如果日志内出现 shrinke 的字样,说明播放端
接收数据过慢,出现丢包,通过调整这个值,可以增大缓冲队列,可能会改善,但不从根本上解决问题。
<shrinkesize>80</shrinkesize>    

性能调优项之一
包堆积超过多少,才发送 rtmp 数据到播放端,建议采用 0 到 4 之间,太大肯定引起延时
<waitcount>4</waitcount>

性能调优项之一
发送时间间隔,单位毫秒。如果包的累积满足条件了,但 waitsleep 时间还未到,smart rtmpd 也不会
继续发包。如果想提速,可以设置为 0 或者 20,设置过大,也会带来一点点延时。
<waitsleep>120</waitsleep>

性能调优项之一
waitcount == 0 时,这种发送模式才起作用,单位 B。如果 waitcount == 0 ,意思就是说数据累积
8K ,smart rtmpd 就可以推数据到播放端,如果你网络足够好,可以设置 128 试试。
<waitchunk>8192</waitchunk>

数据发送连续阻塞次数, 超过断开链接 , 如果 smart rtmpd 推送数据到播放器,如果尝试了 1024 次
都是阻塞状态,则认为这个播放器网络太差,不具有直播的条件,断开与这个播放器的链接。
<blockcount>1024</blockcount>
true : 开启 rtmp 转 http-flv , false : 关闭
<hasflv>true</hasflv>

true : 开启 rtmp 转 http-hls ,  false : 关闭
<hashls>true</hashls>

true : 开启 rtmp 转 mpeg-dash ,  false : 关闭
<hasdash>true</hasdash>

true : 开启 rtmp 转 rtsp ,  false : 关闭
<hasrtsp>true</hasrtsp>

rtmp 转 rtsp ,需要对视频的 rtp payload 进行定义
<rtp h265="98" h264="96" aac="97"/>

1.6  --- rtsp 配置项

服务器绑定指定的网络地址 --- 空表示绑定所有的网络地址 (多网卡)
<ip></ip>
服务器端口 --- 默认都是 8554
<port>8554</port>
true :  开启 ssl , 推流拉流必须是 rtsp 的加密方式; false : 关闭 ssl
<ssl>false</ssl>

是否开启 rtsp 转 rtmp , 这必须要求 rtsp 视频编码为 h264, 音频编码是 aac
<hasrtmp>true</hasrtmp>

关闭 rtsp 服务 
<enable>true</enable>

rtp 传输一般都是 UDP 的,这里是是需要开启的 UDP 服务的端口区间 que 接收队列最大缓冲 ,
如果接收到的 RTP 包,超过这个队列,则会自动丢弃未处理的包。
<rtp min="30000" max="60000" que="20000" />

1.7 --- http 配置项

服务器绑定指定的网络地址 --- 空表示绑定所有的网络地址 (多网卡)
<ip></ip>
服务器端口 --- 默认都是 8080
<port>8080</port>
true :  开启 ssl , 推流拉流必须是 https 的加密方式; false : 关闭 ssl
<ssl>false</ssl>

true : 开启 http 服务, false : 关闭 http 服务 
<enable>true</enable>

smart rtmpd 提供了一些对外的接口,以方便查询 smart rtmpd 的内部流的状态信息,
为了防止恶意查询,查询时,需要带上用户名和密码才行,这个就是那个配置
<httpcmd user="admin" pwd="123456"/>

查询接口如下,查看所有流信息
http://192.168.1.1:8080/application?user=admin&pwd=123456
查看具体流信息
http://192.168.1.1:8080/application?user=admin&pwd=123456&stream=流的名字
查看统计信息
http://192.168.1.1:8080/statistics?user=admin&pwd=123456

http-flv 等数据下发时,有个数据缓冲累积单位字节,如果累积到了 8K 就下发给播放器
<httpcache>8192</httpcache>

如果下发的是文件,那么每次需要下发数据大小,如果速度加快,建议这个值可以再大点,
不过需要注意的是,不是越大越好,需要自己慢慢调试,找出最优的值。
<httpchunk>8192</httpchunk>

smart rtmpd 有写磁盘的动作,如果写磁盘的数据队列超过这个值,则会丢弃这些还未写到
磁盘的数据,这表明您的磁盘 IO 确实太慢了。。。。。
<ioshrink>512</ioshrink>

http-flv 数据累积超过此值丢包, 单位 KB 
<flvblock>2048</flvblock>

http-hls vod 模式缓存文件个数, 如出现音视频文件找不到,扩大这个值 
<hlsvodcache>20</hlsvodcache>

http-hls live 模式缓存文件个数, 如出现音视频丢帧,扩大这个值
<hlslivecache>4</hlslivecache>
http-hls 模式 0 - ts, 1 - fmp4, 这里就别改动了,建议存成 ts 格式。fmp4 支持的不好,别启用了
hls 一般时延比较大,最好的改善方法是,推流端的 GOP 设置要合适,建议要控制在 1 秒之内,这个条
件满足,然后 smart rtmpd 的这些配置项,切片时长可以设置为 2 秒或这 1 秒(保证 GOP 小于 1 秒)
然后切片格式就为 3 吧,不断的尝试优化,基本上时延能在 3 秒左右。
<hlsmode>0</hlsmode>
http-hls 切片个数 
<hlssegment>3</hlssegment>
http-hls 切片时长(秒) 
<hlsduration>5</hlsduration>
dash vod 模式缓存文件个数, 如出现音视频文件找不到,扩大这个值 
<dashvodcache>20</dashvodcache>
dash live 模式缓存文件个数, 如出现音视频丢帧找不到,扩大这个值
<dashlivecache>8</dashlivecache>
dash 回收文件时延, 最小 10 秒  
<dashduration>10</dashduration>
smart rtmpd 的录像模式,具体可参考博文
https://blog.csdn.net/freeabc/article/details/103360588

0 - dash 模式, 1 - hls 模式 ,建议录像采用 hls 模式,毕竟这个是最成熟的。
<vodmode>0</vodmode>
http-vod 录像分割时间( 分钟 ) 
<vodduration>1</vodduration>

 

上一篇:RTMP推流网关如何实现摄像头微信幼儿园直播?


下一篇:nginx rtmp 配置