流媒体传输连接类型之session client, server, pub, sub, push, pull

  • 连接建立方向角度
  • ClientSession, ServerSession
  • 音视频数据发送方向角度
  • PushSession, PullSession, PubSession, SubSession
  • 为什么要给它们命名
  • lal功能点

流媒体传输,通常指持续性在网络上传输流式音视频数据。

一条传输数据的网络通道,由两端组成,下面我们对不同情况下的两端做定义。

连接建立方向角度

从连接建立方向角度,分为主动发起端,和被动处理端。

比如over TCP的连接:

  • 调用connect,连接对方的称为主动发起端
  • 调用accept,处理连接的称为被动处理端

很多时候,我们会把

  • 主动发起端称为client客户端
  • 被动处理端称为server服务端

注意,这种client,server的划分是一种特定含义的划分。client客户端并不仅仅是指PC、APP、Web等运行在C端的程序,也可以是在一个服务器上的服务,比如服务A使用connect连接另外一个服务器上的服务B。

ClientSession, ServerSession

从连接建立方向角度,主动发起端称为client session,被动处理端称为server session:

1
2
3
4
             connect       accept
+-----------------+ +-----------------+
| ClientSession | ----> | ServerSession |
+-----------------+ +-----------------+

音视频数据发送方向角度

除了连接建立方向角度,另一个角度是数据发送方向角度:

  • 数据发送端
  • 数据接收端

注意,由于连接建立方向和数据发送方向可能一致也可能不一致,所以又分为4种角色:

PushSession, PullSession, PubSession, SubSession

A连接B,A向B发送数据:

1
2
A | --connect--> | B
| --av data--> |

上面这种情况:

  • A属于ClientSession,我们称之为PushSession
  • B属于ServerSession,我们称之为PubSession

另一种情况,A连接B,B向A发送数据:

1
2
A | --connect--> | B
| <--av data-- |

上面这种情况:

  • A属于ClientSession,我们称之为PullSession
  • B属于ServerSession,我们称之为SubSession

可以看到,PubSessionPullSession属于接收(输入)音视频数据,SubSessionPushSession属于发送(输出)音视频数据。

注,Pub/Sub是Publish/Subscribe的缩写

注意,此处说的数据都是指音视频数据。而不是连接建立后,业务层协议中握手、发布、订阅等信令数据。

为什么要给它们命名

为了方便沟通。

比如说一个流媒体模块支持rtmp推流。那么究竟是说它可以处理别人给它推rtmp流,还是说它可以将流用rtmp格式推送给别人?有了以上命名,第一种情况对应rtmp.PubSession,第二种情况对应rtmp.PushSession。

比如说一个流媒体模块支持rtmp推流,rtsp拉流。那么究竟是说别人将rtmp流推给它,然后另外一个人从它这拉rtsp流;还是说它主动从别人那拉rtsp流,然后再将流转换成rtmp格式推送出去呢?有了以上命名,第一种情况对应rtmp.PubSession加rtsp.SubSession,第二种情况对应rtmp.PullSession加rtmp.PushSession。

lal功能点

目前不少开源流媒体库/服务器都声称支持rtmp/httpflv/hls/rtsp/webrtc等一系列协议。但老实说,用户很难第一眼就看出是否满足自己的业务需求。

有了以上命名,就可以比较清晰的描述一个流媒体服务器的功能了。

比如lal开源流媒体服务器,在v0.14.0版本的README中有如下表格:

app/lalserver支持的协议:

-sub rtmpsub httpflvsub hlssub rtsprelay push rtmp
pub rtmp-
pub rtsp-
relay pull rtmp-.

从第一行(非表头)可以看出:

  • lal支持接收rtmp推流
    • 并支持使用rtmp/httpflv/hls协议上lal拉(刚才所说推上来的rtmp)流
    • 但是遗憾的是,v0.14.0版本不支持使用rtsp协议上lal拉流
    • 最后一列relay push rtmp,表示lal支持将接收到的rtmp流,再使用rtmp将流推送出去。relay是中继的意思。该功能和多服务器节点级联功能相关。

第二行含义和第一行类似,只不过变成了支持接收rtsp推流。

第三行relay pull rtmp,表示lal可以从另外一个节点拉取rtmp流至本地,并转换成rtmp/httpflv/hls供别人拉流。行内一般称为回源。

另外,lal还提供了一些独立的客户端小程序(示例代码),也有表格进行功能说明。并且还有关于不同传输容器格式中对不同编码格式的支持。详情参见lal README

本文完,作者yoko,尊重劳动人民成果,转载请注明原文出处: https://pengrl.com/p/20080/

0%