ffmpeg中的 avcodec_receive_frame 函数内部是如何运作的?

188 阅读2分钟

avcodec_receive_frame 函数是 FFmpeg 中用于接收解码后的音视频帧的函数。它的主要作用是从解码器(AVCodecContext)中获取解码后的音视频帧数据。以下是 avcodec_receive_frame 函数的简要运作流程:

  1. 参数检查: 首先,函数会检查传递给它的参数的有效性,确保传入的 AVCodecContext 不为空。
  2. 帧的准备: 如果解码器中有之前已经解码好的帧数据可用,那么这些帧数据将被准备好供函数调用者使用。 如果之前的解码尚未完成,函数将等待解码器输出可用的帧。
  3. 帧的获取: 如果帧已准备好,函数将获取帧数据。这涉及到将解码器的输出缓冲区中的数据复制到调用者提供的 AVFrame 结构体中。
  4. 错误处理: 如果在获取帧的过程中发生错误,函数将返回负值,以表示错误的类型。可能的错误类型包括但不限于未准备好的帧、解码器已被关闭、内存分配失败等。
  5. 返回帧数据: 如果一切正常,函数将返回 0,表示成功获取帧数据。

easy demo

// 假设 avCodecContext 是一个已经初始化的 AVCodecContext
AVFrame *decodedFrame = av_frame_alloc();

// 调用 avcodec_receive_frame 获取解码后的帧数据
int ret = avcodec_receive_frame(avCodecContext, decodedFrame);

if (ret == 0) {
    // 解码成功,可以使用 decodedFrame 中的数据进行后续处理
} else if (ret == AVERROR(EAGAIN)) {
    // 没有准备好的帧可用,可能需要继续调用 avcodec_receive_frame
} else if (ret == AVERROR_EOF) {
    // 已经到达文件末尾
} else {
    // 其他错误处理
}

// 释放已分配的帧数据
av_frame_free(&decodedFrame);

but

  • 在实际应用中,使用 avcodec_receive_frame 需要与 avcodec_send_packet 配合使用,avcodec_send_packet 用于向解码器发送压缩后的音视频数据进行解码。这两个函数共同实现了音视频的解码过程。