互联网直播是一种基于RTMP协议的业务。RTMP协议是一种基于TCP的协议。在实际的业务模型中,又分为客户端和服务端。客户端主要是利用RTMP协议进行数据包的发送,一般称之为推流。服务端主要用来接收客户端发送过来的RTMP协议数据包,并转发出去供订阅的客户播放,订阅直播播放的客户从服务端给出的一个地址请求数据,请求的过程也是基于RTMP的协议,这个过程称之为拉流。通常的情况下,直播的业务模型是一路推流到服务器,然后可能会有多路观看的拉流请求,即1:N的模型。
RTMP协议中,服务端的监听端口默认为 1935 ,在某些情况下,必须设置防火墙允许TCP协议的数据穿透这个端口。
常规的推流端主要有如下几种:
手机,Android和iOS平台的手机是互联网直播中的主要推流客户端。一般适用于移动直播的场景下的业务,比如手游直播,秀场直播,户外直播等。
PC端推流软件,比如OBS( https://obsproject.com ),这个软件是跨平台的RTMP推流软件,支持Windows,Linux和Mac系统。一般适用于PC端的推流业务,比如网游直播,客户端游戏直播等。
摄像设备,比如监控设备或者是网络摄像机,这部分设备推出来的流各种各样,用途广泛。一般适用于会议直播,运动赛事现场直播等。
七牛云直播提供了Android和iOS平台的推流客户端和播放器,并自带美颜功能,方便大家开发各种直播APP。另外七牛云直播的服务器支持标准的RTMP协议,任何遵循RTMP协议的推流设备都可以使用七牛云直播服务。
首先,我们了解下,七牛云直播服务的业务模型。
流管理服务端SDK
首先七牛云直播提供了服务端的SDK方便客户和七牛云直播之间进行流的管理等工作。目前已经封装好的SDK有如下几种,Go, NodeJS, Ruby, Python, PHP, Java,C#,其他的语言,如果有需求可以自行使用开放的API进行封装,所有的API都基于HTTP协议。
常规业务流程
在上面的业务模型图中,推流客户端在进行推流之前,必须通过客户自己的业务服务器来获取流的信息,而这个流的信息是客户的业务服务器利用服务端SDK和七牛云直播服务进行交互得到的。
常规的业务场景下,用户在注册客户自己的直播服务之后,客户业务服务器可以利用服务端SDK发送请求到七牛云直播服务器,创建一个流,然后保存下该流ID和用户的对应关系。
客户端在推流之前,会去客户的业务服务器获取推流信息,而这个信息就是用户所对应的流的信息,可以通过服务端SDK获取。
推流SDK使用
客户可以使用PC端推流软件,第三方推流应用或者是利用七牛的推流SDK开发的推流应用来进行推流。七牛的推流SDK集成了音视频数据采集,美颜,推流等功能,方面客户用来开发自己的移动推流应用。
直播服务端处理
客户端利用七牛提供的推流SDK将流推送到七牛云直播服务器之后,服务端会转发RTMP协议的流给观众进行播放,也就是说观众可以以极短的延时播放推上来的数据。另外在流经过七牛云直播服务器之后,服务端还提供基于HTTP协议的FLV播放地址,观众同样可以播放这个地址。
直播数据落存储
除此之外,七牛云直播服务的最大特点就是直播流经过七牛独有的数据处理服务,自动进行流媒体切片,然后把切片数据存放到对象存储系统中。这个也是为了满足目前政策上的需要。自动落存储的切片都可以设置一个默认的过期时间,在过期之后,系统会自动删除应用空间中的数据,这个也是为了从客户角度考虑,节约存储空间,以节约成本。如果客户有永久存储切片数据的需求,可以利用服务端的SDK进行另存为操作,只需要指定起始时间和结束时间就可以保存这个时间段内的所有切片数据,并生成一个M3U8的播放地址,供客户提供回放使用。
直播回看服务
由于每个直播应用空间都设置了一个切片数据过期时间,而有些客户需要使用到直播回放的功能,这个时候,我们可以针对那些需要进行回放的数据,调用服务端的SDK中提供的saveas功能来将这段直播数据持久化下来,并提供一个m3u8的播放列表。
另外,如果客户希望得到的是诸如mp4之类的点播文件,还可以继续调用saveas接口,把m3u8的播放列表转换为单独的点播文件。
在我们正式开始接入直播服务之前,我们先了解下七牛云直播服务使用之前,需要了解的基本概念。
应用名(HUB)
七牛云直播服务开通的时候,都会要求提供一个HUB名称,这个名称是一个逻辑上的单位,是一组流的集合名称,你可以在这个HUB下面创建不受限制数量的流,另外每一个HUB其实后台都对应一个对象存储空间,用来存储切片数据。一般情况下,HUB的名称就是APP应用的名称,这样对应起来很直观。直播应用名的格式必须是4到100字符,英文数字以及-_组成。
直播自定义域名
七牛云直播服务开通的时候,都会要求提供一个自定义域名,然后创建应用成功之后会给出一组域名的CNAME目标要求设置。这里每个域名对应了一个场景的服务。
直播相关域名 | 描述 |
---|---|
pili-publish.example.com | RTMP直播推流域名 |
pili-live-rtmp.example.com | RTMP直播播放域名-直播观看 |
pili-live-hdl.example.com | HTTP FLV直播播放域名-直播观看 |
pili-live-hls.example.com | HTTP HLS直播播放域名-直播观看 |
pili-playback.example.com | HTTP HLS 流媒体M3U8访问域名-直播回看 |
pili-media.example.com | HTTP HLS 流媒体切片访问域名-直播回看 |
pili-vod.example.com | 直播转存MP4等点播文件的访问域名 |
pili-static.example.com | 直播流截图文件的访问域名 |
其中 example.com 就是必须提供的备案域名,它可以是一个二级域名或者主域名都可以。上面的域名根据需要进行CNAME设置。
直播服务端SDK功能
项目 | 方法 | 状态 |
---|---|---|
创建流 | hub->createStream() | 支持 |
获取推流信息 | hub->getStream(); stream->toJSONString() | 支持 |
获取流列表 | hub->listStream() | 支持 |
更新流信息 | stream->update() | 支持 |
禁用流 | stream->disable() | 支持 |
启用流 | stream->enable() | 支持 |
删除流 | stream->delete() | 支持 |
获取流状态 | stream->status() | 支持 |
获取RTMP推流地址 | stream->rtmpPublishUrl() | 支持 |
获取RTMP播放地址 | stream->rtmpLiveUrls() | 支持 |
获取HLS直播播放地址 | stream-> hlsLiveUrls() | 支持 |
获取FLV直播播放地址 | stream-> httpFlvLiveUrls | 支持 |
获取HLS回放地址 | stream->hlsPlaybackUrls() | 支持 |
获取流TS片段文件列表 | stream->segments() | 支持 |
将一段流另存为文件,如mp4 | stream->saveAs() | 支持 |
从流中截取图片 | stream->snapshot() | 支持 |
目前服务端的流管理SDK支持主流的编程语言:
客户端推流和播放SDK
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。