学习总结——player(播放器)相关知识

声明:

        前声明一下,本文属于个人学习总结,同时也是对自己最近学习的回顾,由于在较短的时间里我不可能对player有这么深刻的了解,所以如果您发现那里有错误了,请您指正。同时建议对player有兴趣的同学可以看一下雷神的CSDN博客,我看的很多内容是从他那里了解到的。他的博客地址为:https://blog.csdn.net/leixiaohua1020/article/details/15811977

player简介:

1. 解协议

        我们在很多的时候会用到player,例如我们播放一个视频,听一首歌,以及看一些动态的图片,这些都离不开player。那好我想问一下大家播放的视频或者歌是从哪里来的那?或者我们看到的视频以及歌是从网上直接播放的还是使用本地播放器播放的网络视频,还可能是我们在本地播放本地的视频。而不管是以哪种形式播放视频都应该知道这种视频是一种以什么格式存放的,我们称之为容器,即存放视频(这里的视频是广义的视频,既包含视频也包含音频)的东西。而通过网络形式观看的视频我们在获得他的文件格式之前还要先确定这个网络是采用一种什么样的协议来传输这个视频文件的,而从网络文件到视频文件的这个过程我们称之为解协议(可能有些人会惊讶:还要解协议啊,对我的回答是要的)。在网络中信息的传递是以包的形式来传播的,而在对于信息,每多一层协议他的外面就多一层协议相关的层。我们称这个过程为加包,而对于接收方在收到网络信息后会对其进行解协议的操作,并从中提取发送方要发送的信息。这里我们从网络中获得视频文件同样要经历上面的过程。同时由于网络中有很多种网络传输的协议而不同的文件协议需要与之对应的方式解协议。而在代码中则可以表示为:每种协议对应一种URLProtocol结构体,通过找与网络文件向对应的URLProtocol结构体来实现对网络文件的解协议。

2. es,pes,ps,ts

        在MPEG-2系统中,信息复合/分离的过程称为系统复接/分接,由视频,音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流(TS:TransportStream)。
据传输媒体的质量不同,MPEG-2中定义了两种复合信息流:传送流(TS)和节目流(PS:ProgramStream)
TS流与PS流的区别在于TS流的包结构是固定长度的,而PS流的包结构是可变长度的。
PS包与TS包在结构上的这种差异,导致了它们对传输误码具有不同的抵抗能力,因而应用的环境也有所不同。TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。而PS包由于长度是变化的,一旦某一 PS包的同步信息丢失,接收机无法确定下一包的同步位置,就会造成失步,导致严重的信息丢失。因此,在信道环境较为恶劣,传输误码较高时,一般采用TS 码流;而在信道环境较好,传输误码较低时,一般采用PS码流。
由于TS码流具有较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS码流。

        在数字电视系统中,模拟视音频信号按照MPEG-2的标准,经过抽样、量化及压缩编码形成基本码流ES,基本码流ES是不分段的连续码流。把基本码流分割成段,并加上相应的头文件打包形成的打包基本码流PES,PES包和包之间可以是不连续的。在传输时将PES包再分段打成有固定长度188B 的传送码流TS或可变长度的节目流包(PS包)。PES只是PS转换为TS或TS转换为PS的中间步骤或桥梁,时MPEG-2数据流互换的逻辑结构。TS 和PS这两种码流分别适应于不同的场合应用,节目流PS适合在相对出错较少的环境下使用,其长度是变化的,而传送流TS能够把多个节目在基于一个或多个时间标识的基础上构成一个流,传送流适合于出错较多的场合下使用。用数据包传输的优点是:网络中信息可占用不同的连接线路和简单暂存。通过数据包交织把多个数据流复用成一个新的数据流。便于解码器按照相应顺序对数据包进行灵活的整理,从而,为数据流同步和复用奠定了基础。MPEG-2的结构可分为压缩层和系统层,其中ES属于压缩层,PES和TS/PS属于系统层。
在PES层,主要是在PES包头信息中加入PTS(显示时间标签)和DTS(解码时间标签)用于视频、音频同步。而在TS流中,TS包头加入了PCR(节目时钟参考),用于解码器的系统时钟恢复。在节目流PS包头中加入SCR,它的作用与PCR域相似。

 

3.解封装

        通过上面我们知道在网络传输中常用的是TS,而我在捕捉信息时也捕捉到的是mpegts。所以在下面的文章中我将以TS流为主向大家讲解。而通过上面的解协议之后就得到了视频文件(这里讲的视频文件同样是广义的),这里的视频文件包括我们常用的MP4,flv,以及AVI等不同格式的文件,而我们称这些不同的视频文件为容器,而在这些容器中一定的规格排放着音频文件和视频文件(狭义的视频文件)以及一些与视频播放相关的信息。

        而解封装这一步我们要做的就是从这些容器中将音频相关的信息和视频相关的信息提取出来,由于各种封装格式不同,所以会用不同的解封装方式,所以在程序中每一种封装格式对应一个AVInputFormat结构体,在该结构体中存放着解封装的函数。而解完封装的视音频信息会以一种流的形式与一种特定的AVStream结构体相对应。而通过将容器中的内容提取并保存到流中的方式称之为解封装。

        在上面我们说到了流,这里对流做一个解释流(stream):指时间轴上的一段连续数据,如一段声音数据,一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器

4.视频音频压缩

        上面我们说到了在流中数据可以是压缩的也可以是非压缩的,那么压缩和非压缩的数据有什么样的差别那?其实最主要的还是体积。就像我们生活中的压缩饼干一样,经过压缩的数据虽然体积减少了,但是有些重要的信息并不会减少。这就是为什么我们要对数据进行压缩了。那么压缩后的数据到底可以缩小到压缩前的多少那?是可以达到1%的。这也是为什么要对数据进行压缩了。而由于在一个视音频文件中视频文件的体积占了主要的,所以对于音频文件的体积压缩就不是那么重要了。但是音频数据压缩还是有的,例如我们常听到的MP3。

        对于音视频压缩的算法,我其实并不了解,所以在这里就不多说了,但是在程序中我们经常会碰到像dts或者pts一些与视频相关的参数,所以关于这两个参数我还是讲解下。

5.I帧,p帧,b帧,以及dts和pts

以下相关内容转载自:理解音视频 PTS 和 DTS

I 帧(Intra coded frames):I 帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。I 帧使用帧内压缩,不使用运动补偿,由于 I 帧不依赖其它帧,所以是随机存取的入点,同时是解码的基准帧。I 帧主要用于接收机的初始化和信道的获取,以及节目的切换和插入,I 帧图像的压缩倍数相对较低。I 帧图像是周期性出现在图像序列中的,出现频率可由编码器选择。
P 帧(Predicted frames):P 帧和 B 帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P 帧图像中可以包含帧内编码的部分,即 P 帧中的每一个宏块可以是前向预测,也可以是帧内编码。
B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测,可以大大提高压缩倍数。值得注意的是,由于 B 帧图像采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。

        也就是说,一个 I 帧可以不依赖其他帧就解码出一幅完整的图像,而 P 帧、B 帧不行。P 帧需要依赖视频流中排在它前面的帧才能解码出图像。B 帧则需要依赖视频流中排在它前面或后面的帧才能解码出图像。

        这就带来一个问题:在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就需要我们来了解另外两个概念:DTS 和 PTS。

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
        需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。

        当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。

        比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。

        上面说了视频帧、DTS、PTS 相关的概念。我们都知道在一个媒体流中,除了视频以外,通常还包括音频。音频的播放,也有 DTS、PTS 的概念,但是音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的。

        音频视频混合在一起播放,就呈现了我们常常看到的广义的视频。在音视频一起播放的时候,我们通常需要面临一个问题:怎么去同步它们,以免出现画不对声的情况。

        要实现音视频同步,通常需要选择一个参考时钟,参考时钟上的时间是线性递增的,编码音视频流时依据参考时钟上的时间给每帧数据打上时间戳。在播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。这里的说的时间戳就是我们前面说的 PTS。实践中,我们可以选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。

6.解码

        我们通过上面的操作得到了音视频的流信息,而对于要将他们播放出来的我们下面要做的就是从上面这个流中提取一帧的数据出来,也就是提取出一张照片。当然这个时候从流中提取出来的信息也是没有解码的。而从流中提取出来的一小段信息我们会放在一个AVPacket的结构体中,在这个结构体中保存着一些一帧的信息。而对AVPacket中的信息解码出来的信息我们会放在一个叫做AVFrame的结构体中,而这个结构体中的数据是没有被压缩的,也就是说可以将这里面的信息发送到显示器就是显示出相应的图像来。

7.input --> probe --> demux  --> decode -->  output 

        而在FFmpeg中我们常用上面这五个步骤来实现对代码的分析,其实这个步骤与我上面 讲解的步骤是相对应的。

        对于input来说其实就是将文件打开并读入的过程, 不过这里需要注意的是读入并不是将整个文件全部的信息读入,而这里一般是读取文件的头部信息,因为很多的文件会在其头部放入很多的识别信息,而在后面放的很多就是真正的数据了,所以只要读出这里的信息我们就可以知道后面数据的大小格式一个重要的pts,dts等信息。

        而对上面的信息进行分析主要就是在probe中完成的,而有了上面的信息player就可以更好的找到对应的解协议,解封装以及解码的结构体。而当上面这些信息都找全的时候我们就可以对文件进行AV分离了。

        decode即解码。AV分离后就需要分别对视频和音频数据进行解码操作,而解完码的数据对于视频来说很多都是YUV或者RGB形式的,我们需要做的就是将其放到屏幕上。

参考文章:

ES TS PS 流

理解音视频 PTS 和 DTS

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值