没志青年
发布于 2025-07-20 / 23 阅读
0

FFmpeg 基础

头文件是有引用顺序的,否则编译失败。

#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[] 或文件缓冲区)。

视频流处理

原始数据处理