前段时间因为工做须要作了一个视频直播/智能家居类的应用。算是对iOS音视频专栏中流媒体处理作了一次小结。这里想把整个开发流程纪录下来,一方面是和你们共同探讨学习,另外一方面也能够方便本身之后查漏补缺。前端
整个开发没有借助任何第三方框架,全部流媒体协议都是一行行敲上去的,为何呢?呵呵 授之以鱼不如授之以渔!后端
下面开始先了解下整个软件的架构。服务器
前端咱们在IOS audio&video 专栏中已经介绍的很是详细了,包括摄像头、音视频的各类处理都作了详细的分析。后端咱们也在IOS audio&video 专栏的FFmpeg中、高级使用中也作了详细的介绍,这里也再也不讨论。下面就网络部分作详细的分析。网络
(1)RTCP架构
RTCP:RTP Control Protocol,实时传输控制协议,通常和RTP配合使用,主要用于数据传输的监视,控制功能。同时RTCP是基于UDP传输的。RTCP传输的这些信息很是重要,主要包括:时间戳(用于同步)、序列号(用于丢包和重排序检测)、以及负载格式(用于说明数据的编码格式)。简单归纳一下,就是用于QoS反馈和同步媒体流。与RTP比较而言,其带宽一半占用只有RTP的5%左右。很是小。app
根据不一样的使用状态,RTCP分为下面几种状况:框架
直播、智能家居类项目只要用到发送端报告,这里咱们会在后面的代码中详细分析。ide
(2)RTP学习
Real-time Transport Protocol,实时传输协议,通常用于多媒体数据的传输。音视频主要经过这个协议传输,它是创建在UDP协议上的,效率更高但容许丢包。因此在媒体重组时须要作很多工做。RTP协议包格式以下:网站
(3)SDP
咱们先来看看抓包的网络请求过程:
服务器响应数据。咱们关心的部分:RTSP
response=RTSP/1.0 200 OK
CSeq: 1
Content-base: rtsp://192.168.36.168/
Date: 2015年7月29日 GMT+8下午2:52:00
Content-Type:application/sdp
Content-Length:424
SDP部分:
v=0
o=-1804289383 1804289383 IN IP4 192.168.36.168
s=Livestream from iOS
c=INIP4 0.0.0.0
t=00
a=control:*
m=video0 RTP/AVP 96
b=TIAS:85528
a=maxprate:9.0000
a=control:streamid=1
a=rtpmap:96H264/90000
a=mimetype:string;"video/H264"
a=framesize:96720-480
a=Width:integer;720
a=Height:integer;480i
a=fmtp:96packetization-mode=1;profile-level-id=64001e;sprop-parameter-sets=Z2QAHqxWwLQ9pqAgICBA,KO4CPLA=
能够很清晰的看到RTSP协议是包含两部分的,第一部分为rtsp传输协议,另外一部分是SDP协议。SDP准确的说其实不能算是传输层协议,而要规划到会话层协议部分。SDP(SessionDescription Protocol)是服务器端生成的描述媒体文件的编码信息以及所在服务器的连接等信息的文件,客户端经过它来设置播放软件的参数。
(4)RTSP
有了以上的分析,咱们基本了解了整个结构,那么还剩下最后一部分,RTSP协议。实时流传输协议,是TCP/IP协议体系中的一个应用层协议。和Http协议相似。至于协议的具体结构咱们放在后面和代码一块儿讲。
下面看看一个RTSP流媒体交互的简单过程:这是一个比较典型的请求过程:
1. Client->Server:OPTION request //询问S有哪些方法可用
1. Server->Client:OPTION response //S回应信息中包括提供的全部可用方法
2. Client->Server:DESCRIBE request //要求获得S提供的媒体初始化描述信息
2. Server->Client:DESCRIBE response //S回应媒体初始化描述信息,主要是sdp
3. Client->Server:SETUP request //设置会话的属性,以及传输模式,提醒S创建会话
3. Server->Client:SETUP response //S创建会话,返回会话标识符,以及会话相关信息
4. Client->Server:PLAY request //C请求播放
4. Server->Client:PLAY response //S回应该请求的信息
Server->Client:发送流媒体数据
5. Client->Server:TEARDOWN request //C请求关闭会话
5. Server->Client:TEARDOWN response //S回应该请求