视频播放器原理

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:
解协议,解封装,解码视音频,视音频同步。
如果播放本地文件则不需要解协议,为以下几个步骤:
解封装,解码视音频,视音频同步。他们的过程如图所示。
视频播放器编解码解析步骤
RTMP-》H.264+AAC-》YUV420P+PCM-》解封装参数:音视频同步

解协议的作用:

各种流媒体协议(HTTP,RTMP,或是MMS等)的数据,解析为标准的相应的封装格式数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。

解封装的作用:

输入封装格式(例如MP4,MKV,RMVB,TS,FLV,AVI等)的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式数据的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。
例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流

解码的作用:

解码是整个系统中最重要也是最复杂的一个环节。视频/音频压缩编码数据,需要解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。
通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

音视频同步:

根据解封装模块处理过程中获取到的参数信息同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

流媒体协议: RTMP、RTP、FLV、HLS、GB28181

愿所有奋斗者都过得好!!!加油你可以的加油加油

RTMP协议

Real Time Messaging Protocol(实时消息传送协议协议),使用rtmp协议时需要按flash player返回的包进行解析:

  1. rtmp是工作在TCP之上的明文协议,默认使用1935端口
  2. rtmps是rtmp使用TLS/SSL连接
  3. rtmpe是adobe使用自己的加密机制对rtmp进行加密的,虽然加密机制是使用了行业标准,并且内部实现也是专有的,但rtmpe设计基本上错误的,它本身也不提供任何的安全性.
  4. rtmpt是RTMPT封装在HTTP请求之中,可穿越防火墙;
  5. rtmp包结构
    rtmp消息也是也包括消息头与消息体,而消息头又可以分为basic header,chunk header,timestamp
  6. 三次握手:客户端与服务器发送相同的三个chunk,客户端发送c0,c1,c2 chunk,服务端发送s0,s1,s2 chunk
HLS

HTTP Live Streaming(HLS),基于HTTP的流媒体传输协议,可实现流媒体的直播和点播。
实现HTTP Live Streaming直播,需要研究并实现以下技术关键点 >* 采集视频源和音频源的数据 >* 对原始数据进行H264编码和AAC编码 >* 视频和音频数据封装为MPEG-TS包 (连续的、很短时长的媒体文件)>* HLS分段生成策略及m3u8索引文件 >* HTTP传输协议。

GB28181

GB28181 是公共安全视频监控建设大规模、跨区域联网应用工作的重要技术支撑标准
GB28181 协议信令层面使用的是 SIP(Session Initiation Protocol)协议。
流媒体传输层面使用的是实时传输协议 RTP(Real-time Transport Protocol)
GB28181协议中具体通信协议结构图

  1. 注册REGISTER:
    SIP用户代理又可分为用户代理客户端UAC(User Agent Client)和用户代理服务端UAS(User Agent Server)。用户代理(User Agent),指的是一个SIP逻辑网络端点,用于创建、发送、接收SIP消息并管理一个SIP会话。
    SIP会话传输一些简单的经过报文的实时传输协议流,RTP/RTCP本身才是语音或视频的载体。在GB28181协议中,联网系统在进行视音频传输及控制时应建立两个传输通道: 会话通道和媒体流通道。
    注册流程

  2. 保活:
    默认心跳间隔60s,默认心跳超时次数3次。心跳接收方在心跳发送方上线状态下检测到心跳消息连续超时达到商定次数则认为心跳发送方离线; 心跳发送方在心跳接收方上线状态下检测到心跳消息响应消息连续超时达到商定次数则认为心跳接收方离线。
    保活命令流程

  3. 实时音视频播放INVITE、
    实时视音频点播采用SIP协议中的INVITE方法实现会话连接,采用RTP/RTCP协议(IETF RFC3550)实现媒体传输。点播需要上述的媒体流保活机制。
    SDP协议描述了会话所使用流媒体细节,端口,协议等;

客户端主动发起的实时视音频点播流程图

RTSP实时流式协议

RTSP是为了给流式过程增加更多的功能(暂停、继续、播放、快进、快退)而设计的协议。需要注意的是,RTSP本身不传输数据,音视频流数据是通过RTP传输的。
在这里插入图片描述

RTSP之TCP与UDP方式区别

TCP请求方式,不用另外建立音视频传输的Socket,而直接使用RTSP的Socket。
UDP请求方式,此方式需要多建立两个Socket,用于RTCP、RTP数据传送。
Transport项表明。

RTSP的请求方法

定义一系列方法来进行客户端与服务端通信。RTSP 的语法和 HTTP 的语法基本相同

typedef enum RtspReqMethod
{
	RTSP_REQ_METHOD_SETUP = 0,//SETUP命令用于配置数据交互的方法。(比如制定音视频的传输方式TCP UDP)
	RTSP_REQ_METHOD_DESCRIBE,//DESCRIBE命令用于请求指定的媒体流的SDP 描述信息(详细包括音视频流的帧率、编码类型等等媒体信息)
	RTSP_REQ_METHOD_REDIRECT,
	RTSP_REQ_METHOD_PLAY,//PLAY用于启动(当暂停时重启)交付数据给客户端. 
	RTSP_REQ_METHOD_PAUSE,//PAUSE 请求用于临时停止服务端的数据的交互
	RTSP_REQ_METHOD_SESSION,
	RTSP_REQ_METHOD_OPTIONS,//OPTIONS请求用于返回服务端支持的RTSP方法列表。也可以定时发送这个请求来保活相关的 RTSP 会话
	RTSP_REQ_METHOD_RECORD,
	RTSP_REQ_METHOD_TEARDOWN,//TEARDOWN请求用于终止来自服务端的数据的传输
	RTSP_REQ_METHOD_GET_PARAM,
	RTSP_REQ_METHOD_SET_PARAM,
	RTSP_REQ_METHOD_EXTENSION,
	RTSP_REQ_METHOD_MAX,
}RtspReqMethod_e;
RTSP的实例抓包分析

用wireshark抓取,Cseq只是记录回话的次数序号而已
OPTION返回服务端的RTSP方法列表
Cseq为2:记录回话的次数序号
Cseq为3:客户端用DESCRIB方法主动告诉服务器自己的信息,服务器回的是未认证Unauthorized,即未登录
请求SDP描述信息
Cseq为4:客户端用DESCRIB方法主动发送用户名及密码给服务端,用户名为字段username,密码则由nonce和 response加密组成,服务器成功认证的话会发送服务器的媒体信息
setup数据交换方法
Cseq为5,客户端用SETUP方法主动向服务端请求视频流(trackID=0)
Cseq为6,客户端用SETUP方法主动向服务端请求音频流(trackID=1)
Cseq为7,客户端用PLAY方法主动向服务端请求播放,服务端回应200 OK等信息后,开始向客户端推送RTP流

RTP音视频数据的载体

RTP(Real-Time Transport Protocol)实时运输协议,为实时应用提供端到端的运输服务,但不提供任何服务质量的保证,它有两种工作模式,两者的区别归纳如下:

  1. 使用udp传输需要为每一个连接设定本机的rtp和rtcp对应的两个端口用于rtp和rtcp的通讯,而tcp方式不需要。
  2. 在收包的过程中,TCP流式和UDP包式的不同。
    RTP协议:在音视频数据的头部加上RTP的数据头来区分识别音视频流数据,以确保客户端能正确解析数据而已。
typedef struct RtpHdr_s
{
 
#if (BYTE_ORDER == LITTLE_ENDIAN)
    /* byte 0 */
    u16 cc      :4;   /* CSRC count */
    u16 x       :1;   /* header extension flag */
    u16 p       :1;   /* padding flag */
    u16 version :2;   /* protocol version */
    /* byte 1 */
    u16 pt      :7;   /* payload type */
    u16 marker  :1;   /* marker bit */
#elif (BYTE_ORDER == BIG_ENDIAN)
    /* byte 0 */
    u16 version :2;   /* protocol version */
    u16 p       :1;   /* padding flag */
    u16 x       :1;   /* header extension flag */
    u16 cc      :4;   /* CSRC count */
    /*byte 1*/
    u16 marker  :1;   /* marker bit,是否结束,报文段必须小于MTU */
    u16 pt      :7;   /* payload type :音频?视频?*/
#else
    #error YOU MUST DEFINE BYTE_ORDER == LITTLE_ENDIAN OR BIG_ENDIAN !
#endif
    /* bytes 2, 3 */
    u16 seqno  :16;   /* sequence number */
    /* bytes 4-7 */
    int ts;            /* timestamp in ms */
    /* bytes 8-11 */
    int ssrc;          /* synchronization source */
}RtpHdr_t; 
流媒体传输协议用于确保音视频数据可以在网络上有效、可靠地传输。以下是一些常见的流媒体传输协议及其特点:

1. **RTMP (Real-Time Messaging Protocol)**:
   - RTMP 是由 Adobe Systems 开发的,用于 Flash 播放器和服务器之间音频、视频和数据传输的协议。
   - 它基于 TCP 协议,支持明文传输,并且有 RTMPT(封装在 HTTP 请求中,可穿越防火墙)和 RTMPS(类似 RTMPT,但使用 HTTPS 连接)两种变种。
   - RTMP 协议支持点播和直播,允许视频流拖动播放,不依赖于关键帧。
   - RTMP 协议通常使用端口 1935。

2. **RTP (Real-time Transport Protocol)**:
   - RTP 是一种网络传输协议,用于通过 IP 网络传输音频和视频等多媒体数据。
   - 它通常运行在 UDP 之上,提供时间戳和序列号,以支持同步播放和数据包顺序。
   - RTP 与 RTCP (RTP Control Protocol) 结合使用,RTCP 监控服务质量并传送会话参与者的相关信息。

3. **FLV (Flash Video)**:
   - FLV 是一种流行的开放格式,用于压缩和传输视频和音频数据。
   - 它通常与 RTMP 协议结合使用,因为 Adobe Flash Player 原生支持 FLV 格式。
   - FLV 格式简单,易于在网络上传输和播放。

4. **HLS (HTTP Live Streaming)**:
   - HLS 是由苹果公司开发的流媒体传输协议,基于 HTTP 协议。
   - 它将视频分割成多个小块,每块对应一个较短的媒体文件,并通过 M3U8 播放列表文件组织这些文件。
   - HLS 支持自适应比特率流,允许客户端根据网络条件选择不同质量的视频流。

5. **GB28181**:
   - GB28181 是中国的国家标准,定义了视频监控设备之间的联网通信协议。
   - 它支持设备注册、信令交互、媒体传输等功能,常用于公共安全视频监控联网系统。

从搜索结果中,我们可以看到对 RTMP 协议的详细解析,包括其消息块的组成、传输方式和数据类型。RTMP 协议的消息块由 Chunk Header 和 Chunk Data 组成,基础数据头保存了 Chunk stream ID 和 Chunk Type。RTMP 协议的消息类型多样,包括协议控制类消息和用户控制消息等。

此外,RTP 协议作为流媒体传输的一个重要部分,与 RTCP 一起使用,提供了传输层协议的功能,允许多媒体数据在网络上进行实时传输。

HLS 协议则通过 HTTP 协议进行分段传输,适用于跨平台的流媒体服务,而 GB28181 协议则更侧重于视频监控领域的设备互联和管理。

每种协议都有其特定的应用场景和优势,选择合适的流媒体传输协议可以提高传输效率和用户体验。

封装格式(容器):
编解码:
转码
帧(Frame)
帧率(Frame rate)
分辨率
比特率(码率)
采样率
采样位数
声道数
有损压缩和无损压缩
帧内压缩和帧间压缩
对称编码和不对称编码
音频编码
声音数字化三要素
音频编码标准
视频编码
色彩空间
彩色三要素

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐