互联网直播是一种基于RTMP协议的业务。RTMP协议是一种基于TCP的协议。在实际的业务模型中,又分为客户端和服务端。客户端主要是利用RTMP协议进行数据包的发送,通常称之为推流。服务端主要用来接收客户端发送过来的RTMP协议数据包,并转发出去供订阅的客户播放,订阅直播播放的客户从服务端给出的一个地址请求数据,请求的过程也是基于RTMP的协议,这个过程称之为拉流。一般的状况下,直播的业务模型是一路推流到服务器,而后可能会有多路观看的拉流请求,即1:N的模型。php
RTMP协议中,服务端的监听端口默认为 1935 ,在某些状况下,必须设置防火墙容许TCP协议的数据穿透这个端口。java
常规的推流端主要有以下几种:node
手机,Android和iOS平台的手机是互联网直播中的主要推流客户端。通常适用于移动直播的场景下的业务,好比手游直播,秀场直播,户外直播等。python
PC端推流软件,好比OBS( https://obsproject.com ),这个软件是跨平台的RTMP推流软件,支持Windows,Linux和Mac系统。通常适用于PC端的推流业务,好比网游直播,客户端游戏直播等。git
摄像设备,好比监控设备或者是网络摄像机,这部分设备推出来的流各类各样,用途普遍。通常适用于会议直播,运动赛事现场直播等。github
七牛云直播提供了Android和iOS平台的推流客户端和播放器,并自带美颜功能,方便你们开发各类直播APP。另外七牛云直播的服务器支持标准的RTMP协议,任何遵循RTMP协议的推流设备均可以使用七牛云直播服务。编程
首先,咱们了解下,七牛云直播服务的业务模型。ruby
流管理服务端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