容器(container):就是文件格式,在视频文件进入处理后,我们会给这个视频文件一个抽象,这个抽象就是存放这种视频文件的容器,在FFMPEG中,用来抽象文件格式的容器就是AVFormatContext;


数据流(stream):数据流就是我们平时看到的多媒体数据流,它包含几种基本的数据流,包括:视频流、音频流、字幕流;按照我的理解,这三种基本的数据流在时间轴上交错放置,只有这样才能满足多媒体数据流边接收边播放;数据流在FFMPEG中的抽象为AVStream。


解复用器或者说分流器(demuxer):FFMPEG将要处理的多媒体文件看成多媒体数据流,先把多媒体数据流放入容器(AVFormatContext),然后将数据流送入解复用器(demuxer),demuxer在FFMPEG中的抽象为AVInputFormat,我更愿意把demuxer称为分流器,因为demuxer就是把交错的各种基本数据流识别然后分开处理,将分开的数据流分别送到视频、音频、字幕编解码器处理。


数据包(packet)当然分开的数据流在送往编解码器处理之前,要先放于缓存中,同时添加一些附属信息例如打上时间戳,以便后面处理,那么这个缓存空间就是数据包;由于数据流是在时间轴上交错放置,所以所有的视频、音频、字幕都被分割成一段一段的数据,这些一段段的数据从数据流中解析出来之后,就是存放在各自的packet,那么在这里要说明一下,单纯的视频数据包来说,一个视频数据包可以存放一个视频帧,对于单纯的音频帧来说,如果抽样率(sample-rate)是固定不变的,一个音频数据包可以存放几个音频帧,若是抽样率是可变的,则一个数据包就只能存放一个音频帧。


在H264中没有数据包的概念,估计是因为H264只对视频做处理,所以不用分流,也就不用分流之后的缓存。


数据帧(frame):终于到数据帧了,编解码器真正处理的数据就是数据帧,帧这个东西,就是为了方便处理图像信息抽象出来的概念,按照我自己的理解,就是原始的图像数据信息+很多附加的信息=帧;附加的信息就是便于后面编码的信息,例如帧的解码时间、帧的显示时间等,这些信息都是为了编解码和播放的方便添加上去的,当然帧的附加信息远多于这两个信息,有兴趣的可以去看AVFrame,这是帧在FFMPEG中抽象。


我们看到多媒体文件很大,就是因为这些附加信息也占据了很大的存储空间,此外还有协议等信息,当然没有这些附加信息,这原始的或压缩的数据流还真不好处理,例如怎么分辨上一帧与下一帧,这就要靠这些附加信息了。


图像(picture):FFMPEG中抽象出来分别是AVPictue,这才是真正图像像素信息。


H264中还有image的概念,不知道image和picture有啥区别,一直没打弄明白,有知道的请说一声。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐