怎样以少于1000行代码写一个视频播放器-将电影文件中的视频帧存储为BMP图片
源代码:tutorial01.cpp
编译好的libav库:libav.zip
1 概述
电影文件都包含一些基本组件。首先,电影文件本身称之为一个容器(container),容器的类型决定了文件中信息的组织方式。例如:AVI和Quicktime就是容器类型。其次,电影文件由一个流(streams)集合组成,例如:电影文件通常都包含一个音频流和一个视频流(流是指一个数据元素序列,其数据元素随着时间推移而变得可用。)。流中的数据元素称之为帧(frames)。每个流都被一个不同种类的编解码器(codec)所编码。编解码器(codec)定义了实际的数据是如何被编码(COded)和解码(DECoded)的,因此得名为CODEC。例如DivX和MP3就是编解码器(codecs)。从流中读取得到包(packets)。包由数据片段组成,我们可以将之解码成应用程序可以直接操作的原始帧。出于教学的目的,本教程中的采用的电影文件,其视频流中的每个包都包含一个完整的帧(译者注:H264中的每个包就不包含一个完整的帧),音频流中的每个包则可包含多个帧。
从基本层面上来讲,处理视频流和音频流的步骤非常简单:
1 从video.avi中打开视频流(video_stream)
2 从视频流中将包(packet)读取到帧(frame)中
3 如果帧不完整,则转到第二步
4 对帧进行处理
5 转到第二步
尽管有一些应用程序会对帧进行复杂的处理,但是使用libav处理多媒体就如上面的流程那么简单。因此在本教程中,我们首先打开一个电影文件,然后从中读取视频流,最后再将每一帧输出成一个BMP文件。
2 打开电影文件
首先,让我们先看看如何打开一个电影文件。使用libav,你首先需要初始化libav库。