文章目录
- 流程
- 推流流程
- 扩展
- 拉流流程
- 文件加密
- 流程
常用开源流媒体服务器为SRS和MTX
流程
涉及到的组件
- 主播(推流端)
- 观众(播放器)
- 业务服务【持有一些私有Key,如rtmpKey等】
- 流媒体服务器【SRS/MTX】
- CDN【持有公钥】
推流流程
1.主播登录系统。
2.主播点击发起直播,业务系统返回一个可用的推流地址,其携带认证token(token直接使用JWT也行)。
-
token = now time + random + ttl + signature md5(now time + random + ttl + rtmpKey) 【自己验自己只用一个key即可】
-
示例:
- signature = md5(now time + random + ttl + rtmpKey) = 88195f8943e5c944066725df2b1706f8
- rtmp://192.168.1.10/live?time=1402307089&expire=3600&signature =88195f8943e5c944066725df2b1706f8
加签是为了放篡改,把防止篡改的信息都参与加签
3.主播用上一步返回的可用推流地址进行推流。
4.根据地址会连接到SRS/MTX。
后面都以SRS举例,在SRS上提前配置http回调,回调到我们的业务系统。
on_connect http://127.0.0.1:8085/api/v1/on_connect;
当客户端连接到指定的vhost和app时会触发这个callback。
5.我们在业务系统拿到token去校验, 按同样的算法验证,如果md5变了就返回错误,srs就会拒绝连接。如果返回0就会接受连接。
6.流媒体服务器就可以根据我们的配置在内存中生成flv或者在文件系统生成ts文件。
扩展
1.ts文件移动,移动到OSS或其他位置
on_hls:当SRS获取HLS的ts文件时触发 POST请求
当切片生成时,回调这个url,使用POST回调。用来和自己的系统集成,譬如实现切片移动等。
{
"action": "on_hls",
"client_id": 1985,
"ip": "192.168.1.10",
"vhost": "video.test.com",
"app": "live",
"stream": "livestream",
"param":"?token=xxx&salt=yyy",
"duration": 9.36, // in seconds
"cwd": "/usr/local/srs",
"file": "./objs/nginx/html/live/livestream/2015-04-23/01/476584165.ts",
"url": "live/livestream/2015-04-23/01/476584165.ts",
"m3u8": "./objs/nginx/html/live/livestream/live.m3u8",
"m3u8_url": "live/livestream/live.m3u8",
"seq_no": 100, "server_id": "vid-werty"
}
2.触发CDN上ts文件的缓存预热
on_hls_notify:当SRS获取HLS的ts文件时触发,用于将文件推送到CDN网络,通过从CDN网络获取ts文件。该请求是一个GET请求,请求地址为格式:
当切片生成时,回调这个url,使用GET回调。用来和系统集成,可以使用[ts_url]变量,实现预分发(即下载一次ts片,预热)。
- https://127.0.0.1:8085/api/v1/hls/[app]/[stream]/[ts_url]?[param]
[server_id]服务器ID
[app]应用名称
[stream]流名称
[ts_url]url
[param]参数
拉流流程
1.观众根据需要可登录也可不登录到系统。
2.业务系统返回一个可用的播放地址,这个播放地址是CDN的,临时的(10分钟过期)
- 播放地址可以是Http-flv地址,也可以是hls的m3u8地址。
- 每次请求都会返回一个不一样的CDN临时URL。
- 如果是涉密的流,管理好这个临时URL即可,例如只有登录的人才返回这个URL。
- 例如:http://cdn.com/stream.m3u8?timestamp=1456213&ttl=600&random&signature=md5hash(timestamp,ttl,random+
CDNKey
)- 跟推流时候的临时签名一样。
- 防篡改 + 临时有效性10分钟。
- 注意这个地址也是业务系统加签,但是验签是CDN,回源的时候业务系统自己也会验。
- 这里因为是2个系统加签,验签流程,所以可以采用私钥加签,公钥验签逻辑,业务系统用私钥加签,CDN用共钥验签。(可以用多套密钥对,参数传递密钥对ID)
- 也可以用对称算法加签验签。
- 无论什么算法,都要去CDN上传你的key。
3.当用户拿着加了CDN的临时url访问时,CDN会鉴权,会验证是否过期,是否篡改。
-
CDN节点对鉴权URL中的鉴权信息(包括鉴权字符串、时间戳等)进行验证,判断请求的合法性。
-
鉴权失败,拒绝访问请求。
-
鉴权通过,正常响应合法请求。
4.如果CDN有cache则直接返回,否则CDN请求源站,即回源操作。
5.回源服务器鉴权保护,我们可以将源站设置为仅允许 CDN访问,而拒绝客户端的直接回源。
-
同样鉴权URL中的鉴权信息(包括鉴权字符串、时间戳等)进行验证,判断请求的合法性,是否过期,是否篡改。
-
在 CDN Origin 设置时,添加自定义 Header 字段及值,源站对请求中的字段检查,若不含有该 Header 字段及值,则返回错误码。
-
验证请求IP白名单,只运行CDN的IP放行请求。
- AWS的CloudFront的IP段:https://ip-ranges.amazonaws.com/ip-ranges.json
-
若源站为OSS存储桶
在OSS存储桶策略中设置,仅允许CDN从存储桶中获取内容。
文件加密
背景信息
HLS(HTTP Live Streaming的缩写)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。HLS协议基于HTTP协议,客户端按照顺序使用HTTP协议下载存储在服务器上的文件。HLS协议规定,视频的封装格式是TS(Transport Stream),除了TS视频文件本身,还定义了用来控制播放的M3U8文件(文本文件)。HLS协议的工作原理是把整个视频流分割成一个个小的TS格式视频文件来传输,在开始一个流媒体会话时,客户端会先下载一个包含TS文件URL地址的M3U8文件(相当于一个播放列表),给客户端用于下载TS文件。
HLS基本字段:
#EXTM3U
:M3U8文件头,必须放在第一行。EXT-X-MEDIA-SEQUENCE
:第一个TS分片的序列号,一般情况下是0,但是在直播场景下,这个序列号标识直播段的起始位置;#EXT-X-MEDIA-SEQUENCE:0
。#EXT-X-TARGETDURATION
:每个分片TS的最大的时长;#EXT-X-TARGETDURATION:10
,表示每个分片的最大时长是10秒。#EXT-X-ALLOW-CACHE
:是否允许cache,#EXT-X-ALLOW-CACHE:YES
、#EXT-X-ALLOW-CACHE:NO
,默认情况下是YES。#EXT-X-ENDLIST
:M3U8文件结束符。#EXTINF
:extra info,分片TS的信息,如时长,带宽等;一般情况下是#EXTINF:<duration>,[<title>]
后面可以跟其他的信息,逗号之前是当前分片的TS时长。分片时长要小于#EXT-X-TARGETDURATION
定义的值。#EXT-X-VERSION
:M3U8版本号。#EXT-X-DISCONTINUITY
:该标签表明其前一个切片与下一个切片之间存在中断。#EXT-X-PLAYLIST-TYPE
:表明流媒体类型。#EXT-X-KEY
:是否加密解析。例如:#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/video.key?token=xxx"
加密算法是AES-128,密钥通过请求https://example.com/video.key?token=xxx
来获取,密钥请求回来以后存储在本地,并用于解密后续下载的TS视频文件。
示例
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:13
// 在这里 全部
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/keyfile.key",IV=0x1234567890ABCDEF1234567890ABCDEF
#EXT-X-TARGETDURATION:15
#EXTINF:10.147, no desc
livestream-13.ts
#EXTINF:10.007, no desc
livestream-14.ts
// 或者在这里 局部
#EXT-X-KEY:METHOD=AES-128,URI="livestream-15.key",IV=0x175D2375FEBAE7ED8E92A7E6A64F5113
#EXTINF:10.216, no desc
livestream-15.ts
#EXTINF:10.170, no desc
livestream-16.ts
#EXTINF:11.378, no desc
livestream-17.ts
#EXTINF:9.668, no desc
livestream-18.ts
流程
切片加密
1.流媒体服务器在推流端连接上时,从业务服务端获取key和IV。
2.流媒体服务器在生成ts文件时,使用Key和IV加密TS文件。
切片解密
1.索引m3u8文件含有获取解密匙URI,大致如下:
#EXT-X-KEY:METHOD=AES-128,URI=“https://example.com/keyfile.key”
2.URI部分就是去获取解密匙的http请求,进行边解密边播放。
3.KeyURI可以加token或者Cookie进行权限控制.