一、本节目标
在上一节中演示了如果打开码流并且获取音视频的相关信息。这一节来获取码流每一帧的信息。在开始之前,首先来了解一下 FFmpeg 的对码流的处理过程。
FFmeg 处理流程如下:
- 1、得到输入流,打开输入流
- 2、解封装格式->得到编码数据包 AvPacket
- 3、解码数据包->得到解码的原始数据 AvFrame
- 4、处理数据->例如滤镜处理,重采样,像素格式转化等
- 5、编码原始数据->得到编码后的数据
- 6、封装格式
- 7、得到输出文件
通过了解上面的步骤可以知道,我们本小节的目的就需要处理第1,2步即可。
那么我们需要得到每一帧的什么数据呢?
- 1、 确定是音频帧还是视频帧(暂时不考虑字幕) -> 将对应的数据交给指定的解码器处理。
- 2、 帧的数据以及大小 -> 获取帧的内容,例如音频重采样,视频像素格式转化。
- 3、 帧的时间戳 -> 可以用于音视频同步。
- 4、 是否为关键帧 -> 追帧优化
二、解封装
第1步在上一小节已经描述过了,现在直接跳到第2步。
在 FFmpeg 中使用AvPacket
结构体来记录每一帧数据。它是在解封装时调用av_read_frame
函数将当前帧数据保存到 AvPacket 中。