ffmpeg 视频编码流程及主要API

一、编码流程

初始化组件
配置编码器参数
打开编码器
处理输入帧
编码循环
写入输出数据
收尾释放资源

二、核心步骤与API详解

1. 初始化与参数配置
  • 注册组件(旧版本需手动注册,新版本自动处理)
    avformat_network_init();  // 网络相关初始化(可选)
    
  • 查找编码器
    AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);  // 支持H.264/HEVC等
    
  • 创建编码器上下文
    AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
    codec_ctx->width = 1280;      // 分辨率
    codec_ctx->height = 720;
    codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;  // 像素格式
    codec_ctx->time_base = (AVRational){1, 25};  // 帧率25fps
    codec_ctx->bit_rate = 4000000;  // 码率4Mbps
    
2. 打开编码器
AVDictionary *param = NULL;
av_dict_set(&param, "preset", "slow", 0);      // 编码速度与质量平衡
av_dict_set(&param, "tune", "zerolatency", 0); // 零延迟模式
avcodec_open2(codec_ctx, codec, &param);       // 启动编码器
3. 帧处理与编码循环
  • 分配帧内存
    AVFrame *frame = av_frame_alloc();
    frame->width = codec_ctx->width;
    frame->height = codec_ctx->height;
    frame->format = codec_ctx->pix_fmt;
    av_frame_get_buffer(frame, 32);  // 内存对齐
    
  • 填充YUV数据
    // 手动填充或通过sws_scale转换输入数据
    
  • 编码循环
    AVPacket *pkt = av_packet_alloc();
    avcodec_send_frame(codec_ctx, frame);  // 发送帧到编码器
    while (avcodec_receive_packet(codec_ctx, pkt) == 0) {
        av_write_frame(fmt_ctx, pkt);      // 写入封装层
        av_packet_unref(pkt);              // 释放数据包
    }
    
4. 输出封装与收尾
  • 写入文件头/尾
    avformat_write_header(fmt_ctx, NULL);  // 写入封装头
    av_write_trailer(fmt_ctx);            // 写入文件尾
    
  • 资源释放
    avcodec_free_context(&codec_ctx);
    av_frame_free(&frame);
    av_packet_free(&pkt);
    

三、关键参数与优化

参数类型 作用 示例值
CRF 恒定质量模式(值越小质量越高) -crf 23(推荐18-28)
Preset 编码速度与压缩率平衡 -preset slow
GOP大小 关键帧间隔(影响随机访问和压缩率) -g 60
硬件加速 利用GPU加速编码 -c:v h264_nvenc

你可能感兴趣的:(FFMPEG,ffmpeg,音视频)