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

news/2025/3/31 11:03:00/

文章目录

    • 流程
      • 推流流程
        • 扩展
      • 拉流流程
    • 文件加密
      • 流程

常用开源流媒体服务器为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进行权限控制.


http://www.ppmy.cn/news/1101227.html

相关文章

DNS(域名解析系统)

含义 当我们在上网要访问莫个服务器的时候&#xff0c;就需要知道服务器的IP地址&#xff0c;但IP地址是一串数字&#xff0c;虽然这串数字用点分十进制已经清晰不少了&#xff0c;但还是不利于人们记忆和传播&#xff0c;于是人们使用单词来代替IP地址&#xff08;例如baidu&a…

AJAX学习笔记9 搜索联想自动补全

AJAX学习笔记8 跨域问题及解决方案_biubiubiu0706的博客-CSDN博客 其实就一个功能 搜索联想 自动补全 键盘按下事件keydown 键盘弹起事件keyup 做模糊查询 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

3D目标检测数据集 KITTI(标签格式解析、点云转图像、点云转BEV)

本文介绍在3D目标检测中&#xff0c;理解和使用KITTI 数据集&#xff0c;包括KITTI 的基本情况、下载数据集、标签格式解析、点云转图像、点云转BEV。 目录 1、KITTI数据集中3D框可视化的效果 2、先看个视频&#xff0c;了解KITTI 的基本情况 3、来到KITTI官网&#xff0c;下…

AI绘画:StableDiffusion实操教程-诛仙-碧瑶(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff1a;从入门到精通 ” 不久前&#xff0c;我与大家分享了StableDiffusion的全面教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff…

计算机专业毕业设计项目推荐01-生产管理系统(JavaSpringBoot+原生Js+Mysql)

生产管理系统&#xff08;JavaSpringBoot原生JsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以…

多态语法,析构多态

目录 多态的构成条件 虚函数重写&#xff1a; 多态的构成条件 多态是在不同继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的行为。比如 Student 继承了 Person 。 Person 对象买票全价&#xff0c; Student 对象买票半价。 继承中要 构成多态两个条件 …

OpenCV 08(图像滤波器 算子)

一、 索贝尔(sobel)算子 边缘是像素值发生跃迁的位置&#xff0c;是图像的显著特征之一&#xff0c;在图像特征提取&#xff0c;对象检测&#xff0c;模式识别等方面都有重要的作用。 人眼如何识别图像边缘? 比如有一幅图,图里面有一条线,左边很亮,右边很暗,那人眼就很容易…

Gartner发布中国科技报告:数据编织和大模型技术崭露头角

近日&#xff0c;全球知名科技研究和咨询机构Gartner发布了关于中国数据分析与人工智能技术的最新报告。报告指出&#xff0c;中国正迎来数据分析与人工智能领域的蓬勃发展&#xff0c;预计到2026年&#xff0c;将有超过30%的白领工作岗位重新定义&#xff0c;生成式人工智能技…