AVCodec

AVCodec 是 FFmpeg 中用于表示一个编解码器(encoder 或 decoder)的结构体。编解码器是用于对音频、视频、字幕等媒体数据进行编码或解码的核心组件。AVCodec 结构体包含了编解码器的基本信息和功能指针,FFmpeg 通过这个结构体来管理和操作各种编解码器。

AVCodec 结构体的基本介绍

  • 用途AVCodec 结构体用于描述 FFmpeg 支持的每一个编解码器(如 H.264 解码器、MP3 编码器等)。它既可以表示一个解码器,也可以表示一个编码器。
  • 位置AVCodec 结构体定义在 libavcodec/avcodec.h 头文件中。

如何使用 AVCodec

AVCodec 结构体通常不会直接使用,而是与 AVCodecContext 一起配合使用。下面是一个简单的使用流程:

  1. 查找编解码器

    • 使用 avcodec_find_decoder()avcodec_find_encoder() 函数查找你需要的编解码器,并获取相应的 AVCodec 指针。

      1
      2
      3
      4
      5
      AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264);
      if (!codec) {
      std::cerr << "Decoder not found!" << std::endl;
      return -1;
      }
  2. 分配上下文

    • 使用 avcodec_alloc_context3() 为找到的编解码器分配一个上下文(AVCodecContext)。

      1
      AVCodecContext *context = avcodec_alloc_context3(codec);
  3. 打开编解码器

    • 使用 avcodec_open2() 打开编解码器,将其与上下文关联。

      1
      2
      3
      4
      if (avcodec_open2(context, codec, NULL) < 0) {
      std::cerr << "Could not open codec!" << std::endl;
      return -1;
      }
  4. 进行编码或解码

    • 使用 avcodec_send_packet()avcodec_receive_frame()(用于解码)或 avcodec_send_frame()avcodec_receive_packet()(用于编码)来处理数据。

总结

AVCodec 是 FFmpeg 中核心的结构体,用于描述和管理各种编解码器。它包含了有关编解码器的所有必要信息,并通过函数指针与实际的编码或解码操作相关联。用户通常通过查找、分配上下文、打开编解码器来使用它,然后进行实际的数据处理。

ACodecContext

AVCodecContext 是 FFmpeg 中用于管理和配置编解码器的核心结构体。它保存了与特定编解码器相关的所有状态、参数和设置,是编码和解码操作的上下文环境。无论是处理音频、视频,还是其他媒体类型,AVCodecContext 都是必须的。

AVCodecContext 的主要作用

  • 配置编解码器AVCodecContext 保存了编解码器的配置参数,如比特率、分辨率、帧率、采样率、通道数等。通过设置这些参数,你可以控制编码或解码的具体行为。
  • 保存状态:在实际的编码或解码过程中,AVCodecContext 还保存了编解码器的运行状态,例如当前处理的位置、内部缓冲区的内容等。
  • 处理流程的核心:每次调用 avcodec_send_frame()avcodec_receive_packet()avcodec_send_packet()avcodec_receive_frame() 时,AVCodecContext 是函数的主要参数,因为它提供了所有操作所需的上下文。

如何使用 AVCodecContext

  1. 分配和初始化

    • 你可以使用 avcodec_alloc_context3(codec) 来分配并初始化一个 AVCodecContextcodec 是一个指向 AVCodec 的指针,表示你想使用的具体编解码器。

      1
      2
      3
      4
      AVCodecContext *context = avcodec_alloc_context3(codec);
      if (!context) {
      // 处理错误:分配失败
      }
  2. 设置参数

    • 分配并初始化上下文后,你可以设置必要的参数,例如比特率、分辨率、像素格式等。

      1
      2
      3
      4
      5
      context->bit_rate = 400000;  // 设置比特率为 400kbps
      context->width = 1280; // 设置视频宽度
      context->height = 720; // 设置视频高度
      context->time_base = (AVRational){1, 25}; // 设置时间基数
      context->pix_fmt = AV_PIX_FMT_YUV420P; // 设置像素格式
  3. 打开编解码器

    • 使用 avcodec_open2() 打开编解码器并将其与上下文关联。

      1
      2
      3
      if (avcodec_open2(context, codec, NULL) < 0) {
      // 处理错误:无法打开编解码器
      }
  4. 处理数据

    • 一旦打开了编解码器,你可以通过 avcodec_send_packet()avcodec_receive_frame()(解码)或 avcodec_send_frame()avcodec_receive_packet()(编码)来处理数据。
  5. 释放资源

    • 编解码操作完成后,使用 avcodec_free_context() 来释放 AVCodecContext 及其分配的所有资源。

      1
      avcodec_free_context(&context);

总结

AVCodecContext 是 FFmpeg 编解码操作中的关键结构体,保存了编解码器的所有必要信息和状态。通过配置 AVCodecContext,你可以精细控制编码和解码的行为,并管理整个编解码过程中的数据流。它与 AVCodec 和其他核心结构体一起,构成了 FFmpeg 强大的多媒体处理框架。