多协议、性能稳定、丰富API的流媒体服务器软件
您现在的位置:首页  >  文档  >  推流

1、如果你使用rtmp向Ti Top Streamer推流,那么你需要知道推流url是什么样的格式。


注:首先你需要一个直播流来源类型为rtmp push的Application, 关于源流类型,请阅读  基本概念中的源流类型

推流URL格式如下:
rtmp://[hostAddress]:[rtmpPort]/[applicationName]/[streamName]
			
[hostAddress]: 是你运行Ti Top Streamer的服务器的主机地址。

[rtmpPort]: 是你运行Ti Top Streamer的服务器的rtmp流服务端口,默认是1935

[applicationName]: 是Ti Top Streamer中Application的名字

[streamName]: 是你指定的流的名字,在obs studio中称之为key

我们假设,这个Application的名字为live,streamName为myStream,再假设主机地址为192.168.10.102,端口为1935,那么推流url就是:
rtmp://192.168.10.102:1935/live/myStream
			


2、Ti Top Streamer 支持基于token的防盗链技术,通过这个技术,您可以实现对推流的安全保护。下面介绍一下实现步骤:


1) 启用防盗链功能,如下图所示:

注1:在下图的复选框上打勾,表示启用防盗链功能(默认是没有启用的)

注2:设置SharedKey,它是一个共享密钥,您可以自己输入,也可以点击"生成"按钮自动生成。

rtmp

2) 通过代码生成rtmp推流url

在rtmp推流的url里,除了主机地址和端口外,其它部分是根据applicationName、streamName、SharedKey、expiredTime(失效时间)来确定的。

计算过程如下:

A、首先你要确定一个url失效时间,比如1分钟后失效(url失效的意思是当你用这个url推流时,系统会拒绝这个推流请求,但是不影响已经开始推流的连接)

url失效时间是一个绝对值,是一个unix时间戳,精确到秒。也就是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数。然后将它转换为16进制形式(字符用小写)

B、将 sharedKey、applicationName、streamName以及expiredTime 按这里表述的前后顺序链接起来,相当于(sharedKey+applicationName+streamName+expiredTime)

C、计算上面字符串的MD5值,相当于md5(sharedKey+appName+streamName+expiredTime)

D、然后你要生成两个url查询参数tiliuSecurityToken和tiliuExpiredTime,前者就是上面的md5值,后者就是前面说的url失效时间的16进制形式(字符用小写)。

注意: 之所以在这两个参数中使用"tiliu"这样的前缀,目的是为了避免跟您的其它自定义参数混淆。

E、将上面两个url查询参数加入到常规的rtmp推流url中,例如:
rtmp://192.168.10.102:1935/live/myStream?tiliuSecurityToken=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx&tiliuExpiredTime=xxxxxxxxxx
			
下面是一个页面工具,可以让您方便的生成防盗链推流url:

主机地址:

端口:

applicationName:

streamName:

sharedKey:

失效时间:(秒)以后(我们会为您转为绝对时间)

生成
注: 点击此按钮后将会发起一个后台调用,传入以上参数值,获得一个推流url如下:

rtmp推流url会显示在这里

您如果想实际推流做个测试,有很多工具可供选择,比如FFMpeg、OBS Studio以及Vmix。 下面的例子是采用FFMpeg推送一个mp4文件(sample.mp4)中的音视频内容。
ffmpeg -re -i sample.mp4 -vcodec copy -acodec copy -f flv "上面的rtmp 推流 url"

您可以从这里获取FFMpeg : http://ffmpeg.org/download.html

下面是上面生成rtmp url的页面工具的后台代码,采用nodejs编写,您可以参照它改写其它语言版本:
app.post('/rtmp/push/url', function (req, res) {
	let hostAddress = req.body.hostAddress;
	let rtmpPort = req.body.rtmpPort;	
	let applicationName = req.body.applicationName;
	let streamName = req.body.streamName;
	let sharedKey = req.body.sharedKey;
	let expiredSecond = parseInt(req.body.expiredSecond);
	let now = new Date();
	let expiredTime = parseInt( now.getTime() / 1000 )  + expiredSecond ;
	let expiredTime_hex = expiredTime.toString(16); // js输出的都是小写
	let originKey  = sharedKey + applicationName + streamName + expiredTime_hex;
	let caculatedMd5 = md5(originKey) ; //这里用了md5这个库
	let base_url = "rtmp://"+hostAddress+":"+rtmpPort+"/"+applicationName+"/"+streamName ;
	let url = base_url+"?tiliuSecurityToken="+caculatedMd5+"&tiliuExpiredTime="+expiredTime_hex;
	res.status(200).json({"code":200,"url":url});
});
			
我们强烈建议您将生成推流url的代码逻辑放在服务器端,就像我们上面这个例子这样,通过接口从后台获取。