avcodec_receive_frame 函数是 FFmpeg 中用于接收解码后的音视频帧的函数。它的主要作用是从解码器(AVCodecContext
)中获取解码后的音视频帧数据。以下是 avcodec_receive_frame
函数的简要运作流程:
- 参数检查: 首先,函数会检查传递给它的参数的有效性,确保传入的
AVCodecContext
不为空。
- 帧的准备: 如果解码器中有之前已经解码好的帧数据可用,那么这些帧数据将被准备好供函数调用者使用。 如果之前的解码尚未完成,函数将等待解码器输出可用的帧。
- 帧的获取: 如果帧已准备好,函数将获取帧数据。这涉及到将解码器的输出缓冲区中的数据复制到调用者提供的
AVFrame
结构体中。
- 错误处理: 如果在获取帧的过程中发生错误,函数将返回负值,以表示错误的类型。可能的错误类型包括但不限于未准备好的帧、解码器已被关闭、内存分配失败等。
- 返回帧数据: 如果一切正常,函数将返回 0,表示成功获取帧数据。
easy demo
AVFrame *decodedFrame = av_frame_alloc();
int ret = avcodec_receive_frame(avCodecContext, decodedFrame);
if (ret == 0) {
} else if (ret == AVERROR(EAGAIN)) {
} else if (ret == AVERROR_EOF) {
} else {
}
av_frame_free(&decodedFrame);
but
- 在实际应用中,使用
avcodec_receive_frame
需要与 avcodec_send_packet
配合使用,avcodec_send_packet
用于向解码器发送压缩后的音视频数据进行解码。这两个函数共同实现了音视频的解码过程。