头文件是有引用顺序的,否则编译失败。
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>打开视频流
获取视频流信息
查找视频流
视频流初始化和释放
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);AVCodec *avcodec_find_decoder(enum AVCodecID id);AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);int avcodec_parameters_to_context(AVCodecContext *codec_ctx, const AVCodecParameters *par);int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);packet 申请和释放
AVFrame *av_frame_alloc(void);AVPacket *av_packet_alloc(void);frame 申请和释放
帧解码
色彩空间转换
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);int av_read_frame(AVFormatContext *s, AVPacket *pkt);从视频流中获取一帧数据包
0:成功
<0:失败或文件结束
int av_write_frame(AVFormatContext *s, AVPacket *pkt);int avcodec_send_packet(
AVCodecContext *avctx, // 编解码器上下文
const AVPacket *avpkt // 输入的数据包(可能为 NULL 刷新解码器)
);将 压缩数据包(AVPacket) 发送给 解码器(或编码器),用于解码或编码操作。
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);int av_frame_get_buffer(AVFrame *frame, int align);分配缓冲区,align:内存对齐
int sws_scale(struct SwsContext *c, // 上下文
const uint8_t *const srcSlice[], //输入图像各个平面的数据指针数组,比如 YUV 三个平面
const int srcStride[],// 输入图像每个平面一行数据的字节数(步长)
int srcSliceY,//输入图像从第几行开始转换(通常为0)
int srcSliceH,// 输入图像从 srcSliceY 开始的行数,也就是高度
uint8_t *const dst[],// 输出图像各个平面的数据指针数组
const int dstStride[]);// 输出图像每个平面一行数据的字节数(步长)void av_packet_unref(AVPacket *pkt);释放数据
数据格式转换
int av_image_copy_to_buffer(
uint8_t *dst, // 目标缓冲区
int dst_size, // 目标缓冲区大小
const uint8_t *const src_data[4], // 源图像数据(YUV/RGB 平面)
const int src_linesize[4], // 源图像每个平面的行字节数
enum AVPixelFormat pix_fmt, // 像素格式(如 AV_PIX_FMT_YUV420P)
int width, // 图像宽度
int height, // 图像高度
int align // 内存对齐(通常为 1 或 32)
);将图像数据从 AVFrame 的平面格式复制到连续的内存缓冲区(如 uint8_t[] 或文件缓冲区)。