大致流程
-
初始化操作:根据源数据和目标数据的宽高以及像素格式,初始化SwsContext结构体
-
解码操作:对demux出来的数据包进行解码
-
后处理操作:若解码成功,则将源图像数据转换成目标图像数据
解码相关API函数
-
avcodec_decode_video2:将大小为 avpkt->size 的视频帧从 avpkt->data 解码为图片。某些解码器可能支持单个 AVPacket包含多个帧,但解码器将只解码第一帧。
int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
int *got_picture_ptr, const AVPacket *avpkt);
AVCodecContext:描述该音频解码器上下文的结构体
AVFrame:用于存储解码的数据
int * got_frame_ptr:如果当前无法解码帧,则返回0;否则返回非0
AVPacket:待解码的数据包
返回值:负数表示出现错误,否则为解码时消耗AVPacket的字节数
图像后处理相关API函数
sws_getContext:分配并返回一个 SwsContext,可使用sws_scale() 执行缩放/转换操作。
struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
int dstW, int dstH, enum AVPixelFormat dstFormat,
int flags, SwsFilter *srcFilter,
SwsFilter *dstFilter, const double *param);
srcW,srcH,srcFormat:源数据宽高及格式
dstW,dstH,dstFormat:目标数据宽高及格式
flags:指定用于重新缩放的算法和选项,如SWS_FAST_BILINEAR,SWS_BICUBIC
srcFilter,dstFilter:源/目标图像的滤波器信息
param:特定缩放算法需要的参数
sws_scale:对源图像进行转换操作后生成到目的地址中
int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
const int srcStride[], int srcSliceY, int srcSliceH,
uint8_t *const dst[], const int dstStride[]);
c:图像后处理结构体SwsContext
srcSlice:源切片平面的指针数组
srcStride:源切片平面的步幅(每行数据的字节数)数组
srcSliceY:要处理的切片在源图像中的位置,即切片第一行在图像中的数量(从零开始计数)
srcSliceH:源切片的高度,即切片中的行数
dst:输出图像的切片平面的指针数组
dstStride:输出图像的切片平面的步幅(每行数据的字节数)数组
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓