我们拿到的视频文件(mp4、mkv等文件)是封装了音频流、视频流和字幕流(可能有也可能没有)的,要想播放这类视频文件第一步要做的是解封,得到相应的流,之后才是解码、重采样和播放。
解封装需要用到的结构体:
AVFormatContext 可以看作是用于解封装的上下文
结构体中几个主要变量包括:
AVIOContext *pb:输入数据的缓存
unsigned int nb_streams:视音频流的个数
AVStream **streams:视音频流
char filename[1024]:文件名
int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)
int bit_rate:比特率(单位bps,转换为kbps需要除以1000)
AVDictionary *metadata:元数据
解封装需要用到的函数:
首先需要打开输入文件并初始化解封转上下文:
int avformat_open_input(AVFormatContext **ps, const char *url,
const AVInputFormat *fmt, AVDictionary **options);
配套的是视频播放结束后需要关闭输入文件并释放解封转上下文:
void avformat_close_input(AVFormatContext **s);
检索解封装上下文中的流信息
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
之后就可以从解封转上下文中读取AVPacket了
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
参考文章:
FFMPEG结构体分析:AVFormatContext_雷霄骅的博客-优快云博客_avformatcontext FFMPEG结构体分析:AVFormatContext