雷神FFMpeg源码学习笔记
读取编码并依据编码初始化内容结构
- 在开始编解码视频的时候首先第一步需要注册一个编解码器 :av_register_all();
avformat_open_input
来打开这个文件并给AVformartcontext
赋值 ,在其中会去查找当前缓存文件的格式avformat_open_input
来打开这个文件并给AVformartcontext
赋值 ,在其中会去查找当前缓存文件的格式avformat_find_stream_info
使用该方法给每个视频/音频流的AVStream
结构体进行赋值并得到,这个参数在里面实现了一定的解码过程- 在
AVstream
有值了以后我们需要拿到当前当前的avcodecContext
和其对应的AVcodeC
(使用avcodec_find_decoder
) avcodec_open2
,初始化一个视音频编解码器的AVCodecContext
,,调用AVCodeC
的初始化到具体的解码器AVCodeC init()
所以是在avcodec_open2
在开始真正的初始化avcodecContext
- 在得到了初始化的
AVcodecContext
之后我们就可以开始为解码之后的AVframe
分配空间(使用(unsigned char *)av_mallocz(av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecContex->width, pCodecContex->height, 1)))
av_image_fill_arrays()
:为AVframe
的像素点分配空间
sws_getContext
:使用源图像的高和宽得到目标图像的高和宽,flag 为设定图像拉伸的算法
每一帧的视频解码处理
av_read_frame
在解码之前来获取一帧的视频帧压缩数据 或者是多帧的音频帧压缩数据 及我们得到的只是AVpacketavcodec_decode_video2
使用该函数来解码得到的AVpacket
,输出一个下一帧的AVframe
函数- 使用
sws_scale
来对下一帧的AVframe
进行拉伸变化 ,输出想要得到的AVframe
- 释放上述的
AVformartcontext
,AVstream
,avcodecContext.
下面是代码的具体处理操作:
1.首先需要注册所有的编解码器
//1.注册所有的