通信协议

RTP/RTCP/RTSP

  • RTP是一个实时传输协议Real-time Transport Protocol或简写RTP)RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式

  • RTCP 实时传输控制协议(Real-time Transport Control Protocol或RTP Control Protocol或简写RTCP)是实时传输协议(RTP)的一个姐妹协议,RTCP为RTP媒体流提供信道外(out-of-band)控制。RTCP本身并不传输数据,但和RTP一起协作将多媒体数据打包和发送。RTCP定期在流多媒体会话参加者之间传输控制数据。RTCP的主要功能是为RTP所提供的服务质量(Quality of Service)提供反馈。

  • RTSP 实时流协议(ASCII)(Real Time Streaming Protocol,RTSP)是一种网络应用协议,专为娱乐和通信系统的使用,以控制流媒体 服务器。该协议用于创建和控制终端之间的媒体会话。媒体服务器的客户端发布VCR命令,例如播放,录制和暂停,以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录音)的媒体流。流数据本身的传输不是RTSP的任务。大多数RTSP服务器使用实时传输协议(RTP)和实时控制协议(RTCP)结合媒体流传输。

SIP

会话发起协议(Session Initiation Protocol,缩写SIP)是一个由IETF MMUSIC工作组开发的协议,作为标准被提议用于创建,修改和终止包括视频,语音,即时通信在线游戏虚拟现实等多种多媒体元素在内的交互式用户会话。2000年11月,SIP被正式批准成为3GPP信号协议之一,并成为IMS体系结构的一个永久单元。SIP与H.323一样,是用于VoIP最主要的信令协议之一。

RTSP/RTP over TCP

When you use RTSP/RTP over TCP, all command and media data will be sent through the RTSP port, normally, port 554. Also, when using
当使用TCP协议承载RTSP/RTP时,所有的命令和媒体数据都将通过RTSP端口,通常是554,进行发送。同时,数据将经过二元交织格式化之后才能发

RTSP/RTP over TCP, the data will be sent via binary interleave format.
送。

To use TCP communication, you need to request TCP connection during RTSP SETUP. You have to sent SETUP command with
要使用TCP连接,RTSP客户端需要在SETUP阶段请求TCP连接。SETUP命令中应该包括如下格式的Transport: Transport: RTP/AVP/TCP;interleaved=0-1 This will tell the server to send media data with TCP and interleave the data in channel 0 and 1. Given in the specification, data channel is even
上述Transport将告诉服务端使用TCP协议发送媒体数据,并且使用信道 0 和 1 对流数据以及控制信息进行交织。详细说来,使用偶数信道作为数据

number and control channel is odd (data_ch_num + 1). So, if you data channel is 0, your control channel will be 0 + 1 = 1.
传输信道,使用奇数信道作为控制信道(数据信道 + 1)。所以,如果你设定数据信道为 0 ,那控制信道应该是 0 + 1 = 1。

RTSP over HTTP

播放的时候依然用rtsp schema, rtsp://1.1.1.1:8000/filename

RTSP

RTSP交互

RTSP 实时流传输协议,它建立并控制一个或几个时间同步的连续流媒体,如音频和视频。
用于控制多个数据发送会话,提供了选择发送通道(如UDP、组播UDP与TCP等)的方式,并提供了选择基于RTP的发送机制的方法.简单的RTSP交互过程:
Player表示rtsp播放器,Server表示rtsp服务端

  1. 1.Player->Server:OPTION request //询问有哪些方法可用
  2. 1.Server->Player:OPTION response //回应信息中包括提供的所有可用方法
  3. 2.Player->Server:DESCRIBE request //要求得到Server提供的媒体初始化描述信息
  4. 2.Server->Player:DESCRIBE response //回应媒体初始化描述信息,主要是sdp
  5. 3.Player->Server:SETUP request //设置会话的属性,以及传输模式,提醒S建立会话
  6. 3.Server->Player:SETUP response //建立会话,返回会话标识符,以及会话相关信息
  7. 4.Player->Server:PLAY request //请求播放
  8. 4.Server->Player:PLAY response //回应该请求的信息
  9. Server->Player:发送流媒体数据
  10. 5.Player->Server:TEARDOWN request //请求关闭会话
  11. 5.Server->Player:TEARDOWN response //回应该请求

上述的过程是标准的rtsp流程,但实际的需求中并不一定
其中第3和4步是必需的!
第一步,只要服务器客户端约定好,有哪些方法可用,则option请求可以不要。
第二步,如果我们有其他途径得到媒体初始化描述信息(比如http请求等等),则我们也不需要通过rtsp中的describe请求来完成.

流媒体数据承载模式

  • UDP模式
    服务器针对该请求的媒体类型(音频或视频)来分配相应UDP端口以建立UDP通道来发送媒体数据。对每种媒体类型,服务器提供两个UDP端口(一般来说,偶数端口为RTP端口,奇数端口则为RTCP),
    其中一个用来发送RTP数据,另一个则用来发送和接收RTCP数据。

  • TCP模式
    服务器针对该请求的媒体类型(音频或视频)来建立Track通道,即分配不同的interleaved值。对于TCP传输,RTSP数据、RTP数据、RTCP数据都是通过同一个通道即刚开始建立的那个专门的RTSP通道来传输数据。服务器和客户端的RTP或RTCP数据发送之前带一个4字节的头,而RTSP数据则不需要。如接收到的数据的第一个字节不为“$”,则表示接收到的为RTSP数据。
    否则为RTP或RTCP数据。如为RTP或RTCP数据,则根据第二个字节的interleaved值来区分RTP和RTCP数据。一般来说,第二个字节interleaved值为偶数则为RTP数据,奇数为RTCP数据。
    最后两个字节DataLen则说明了后面所带的RTP/RTCP数据的长度.

  • HTTP over TCP协议
    客户向服务器发送一个HTTP GET信息,请求服务器打开一个从服务器到客户端的连接;然后客户端再发送一个HTTPPOST信息,请求服务器打开一个客户端到服务器端的连接,服务器端并不响应客户端的POST 请求,客户端会接着将RTSP数据作为当前POST请求的信息体发送出来。

视频编码

封装

MP4

音视频技术 - 图1

音视频技术 - 图2

Mp4文件格式的基本单位是atom
Mp4格式中涉及到PTS信息的atom包括:stts,ctts和elst。
Stts存储着一系列的参数对(sample_count, sample_time_delta)。每一个参数对给出了具相同时间间隔的连续的sample的个数和这些sample的时间间隔值。如下式所示将所有的时间间隔相加,可以得到该track的时间总长。

  1. duration = (sample_count1 * sample_time_delta1 + ... + sample_countN * sample_time_deltaN ) / timescale

对某mp4码流(文件名un.mp4)进行分析,可以得到只包含一个参数对,sample_count= 31063, sample_time_delta = 1001.时间单位是该文件的timescale。已知timescale= 1/24000,可以得到每帧图像(一个视频sanple包含一帧未解码的图像)的持续时间是1001*1/24000 =0.041783秒。即帧率为23.977.

Elst atom中存储着关于流的起始时间(start_time)的信息,结合stts中的内容就可以计算DTS。
对于文件中的第n个sample来说:

  1. DTS = sample_time_delta * n start_time

比如un.mp4中elst存储的start_time为2002,则第1个sample的DTS等于-2002,第2个sample的DTS等于-1001,第3个sample的DTS为0,…
如果mp4文件包含的视频流含有b帧,则需要ctts atom,Ctts atom的结构如下图所示:
音视频技术 - 图3
所以,对于没有b帧的mp4文件:PTS = DTS
对于有b帧的mp4文件:PTS = DTS + sample_offset

AVI

首先,AVI格式中是没有时间戳信息的。
这样的话,AVI格式的每1帧图像的DTS只能通过帧率来计算,而在有b帧的情况下PTS是无法得到。

MP4流化

由于MP4文件的音视频帧在文件中的物理位置不是顺序存放,而是以一种相对凌乱的状态存在,若在媒体数据播放的过程中,计算每帧偏移量难以做到高效率。因为计算偏移量是个相对繁琐的过程,要计算多级偏移和很多其他数据。为了解决这个问题,本文提出预处理的方案,即在得到文件元数据信息(metadata)的时候,先不和服务器通信并播放每帧数据,而是预先把每帧数据的大小和相对于媒体文件的偏移地址都计算出来。播放器可以用metadata来进行按照range来取播放数据,从而进行渲染播放
我们可以借助ffmpeg带的一个命令行工具 --qt-faststart , qt-faststart 会把文件的meta信息移到文件头部,这样转换后的MP4就可以边下载边播放。

编码

H264

NALU是H264的基本单元,多个NALU可能构成一个frame, 对于RTP一个RTP报可能值包含一个或者多个NALU

Tools

ffmpeg

生成报告

  1. ffprobe -report "xx.mp4"
  2. ffprobe -show_packets "xx.mp4"
  3. ffprobe -show_frames "xx.mp4"
  4. ffprobe -show_error "xx.mp4"

播流的重试机制

可以根据读取多少字节,或者多长时间,或者多少帧来决定获取流信息失败的条件,每次失败可以动态的增加这个判断条件