FFMPEG 的跨平台视频播放器

发布时间 2023-06-14 12:00:03作者: hananoha

使用 ffmpeg api 进行视频解码的步骤

概括来说,视频解码的步骤包括:

  1. 创建解码器
  2. 解封装,从视频流中读取一个 packet
  3. 将 packet 送给解码器,解码器进行解码
  4. 从解码器中,取回解码后的数据

创建解码器

在 ffmpeg 中与解码器相关的结构体有两个:AVCodec 和 AVCodecContext。

AVCodec结构体包含了编解码器的特定信息,如编解码器的类型、名称、支持的像素格式或音频样本格式等。你可以使用 avcodec_find_decoder 从 ffmpeg 支持的编解码器中找到你需要的那个。


avcodec_find_decoder 函数的主要目的是根据给定编解码器ID(AVCodecID)找到合适的解码器。在实现逻辑中,它对FFmpeg支持的所有编解码器进行迭代,并比较它们的AVCodecID与所需的AVCodecID。

如果发现有无法找到某个 id,有可能是因为你使用的 ffmpeg 做了裁剪,不支持这种类型的 codec,这时候你可以在代码中打印一下当前 ffmpeg 支持的 codec 信息:


AVCodec 结构体仅仅是对某个编解码器的描述,要进行编解码还需要 AVCodecContext 参与。

在 FFmpeg 中,AVCodecContext 是一个结构体,它表示编解码器的上下文,主要负责存储与编解码器相关的配置信息和状态。AVCodecContext 的作用在于为音频、视频或字幕数据的编码和解码过程提供所需要的各种参数和数据。AVCodecContext 包含以下主要信息:

  1. 编解码器类型(音频、视频或字幕)
  2. 编解码器的 ID(用于标识特定的编解码器,例如 H.264,MP3 等)
  3. 时间基(用于计算时间戳)
  4. 帧率或采样率(视频或音频播放的速度)
  5. 比特率(编解码后的数据流的速率)
  6. 编码或解码期间使用的各种配置选项(如像素格式,音频通道数量,视频分辨率等)

要使用特定的 AVCodec 对象进行编解码,需要为其配置一个相应的 AVCodecContext,并设置相应的参数。然后使用 FFmpeg 提供的函数(如 avcodec_open2,avcodec_send_packet 等)对数据进行编解码。

因此,AVCodecContext 是连接原始数据、编解码器(AVCodec)和输出数据之间的桥梁。它帮助用户在输入和输出之间传递数据,并提供编解码过程所需的参数。

在代码中,使用 avcodec_alloc_context3 创建一个 AVCodecContext


接着,需要填充 AVCodecContext 中各种信息,一种简便的方式是使用 avcodec_parameters_to_context


最后一步,使用 avcodec_open2 打开编解码器并与 AVCodecContext 相关联。