图解系列 图解直播推拉流流程

常用开源流媒体服务器为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放行请求。

  • 源站为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进行权限控制.

猜你喜欢

转载自blog.csdn.net/abu935009066/article/details/132760720