1、目录
#################################################
#################################################
2、视频解码知识
#################################################
#################################################
3、VC下FFmpeg开发环境的搭建
测试:因为ffmpeg本身是基于C的,C++调用C时需要添加extern"C",告诉C++这里面调用的是C语言,#define _STDC_CONSTANT_MACROS是ffmpeg规定在C++里面必须加的。
FFmpeg库
#################################################
#################################################
4、FFmpeg解码的函数(流程)
(4.1)解码函数
av_register_all()注册所有组件
avformat_open_input()打开视频流
avformat_find_stream_info()查找视频流信息(宽、高、解码器的类型)
avcodec_find_decoder()找出对应视频的解码器(H264,MPEG2)
avcodec_open2()打开解码器
循环:
每调用一次读取一帧压缩的视频数据(H.264码流),判断是否读到或读到文件末尾就结束退出。能读到会读到AVPacket(结构体)(装的是H.264视频流数据),解码器也就是avco
dec_decode_video2这个函数,生成AVFrame(装的是YUV数据),
(4.2)解码流程
#################################################
#################################################
5、FFmpeg解码的数据结构
(5.1)AV是音频(Audio )和视频(Video )的简称
(5.2)avformatcontext是视频封装格式的上下文,包含视频最外层的信息(处理封装格式)
(5.3)avinputformat结构体指明了文件用什么封装格式(flv,mkv等)。avstream[0]是视频流,avcodeccontext专门处理编解码,avcodec指明了编码器时什么类型的。
avstream[1]是音频流
(5.4)avpacket是解码前存储一帧视频数据的结构体,avframe是解码完后保存的数据结构体
#################################################
#################################################
6、数据结构分析跟封装格式相关的
编解码相关的
AVPacket是装H.264数据的,而AVFrame是装YUV数据的。
#################################################
#################################################
7、补充小知识
8、练习
9、代码补充
解码前的文件(通过av_read_frame函数从码流中读取一帧H.264的压缩数据,存在packet里面)判断是否为 视频流,把packet的data写入文件里面
输出yuv数据中的y数据
输出yuv数据(U和V宽和高是Y的1/2)
保存参数到文件中(fprintf函数)