FFmpeg-chapter7-使用 FFmpeg 解码视频(原理篇)
解码流程如下图
流程:首先,通过 avcodec_alloc_context3(nullptr)
分配一个 AVCodecContext
结构体,然后使用 avcodec_parameters_to_context
将参数复制到上下文中,接着通过 avcodec_find_decoder
查找指定的解码器,并使用 avcodec_open2
打开解码器。
接下来,使用 av_read_frame
从输入流中读取帧,如果读取到帧,则使用 avcodec_send_packet
将帧发送到解码器。然后,通过 avcodec_receive_packet
接收解码后的帧,如果接收到帧,则进一步处理。
如果没有接收到帧,则继续读取下一帧。
最后,当所有帧处理完毕后,使用 avcodec_close
关闭解码器,并使用 avcodec_free_context
释放上下文内存。
具体函数:
-
avcodec_alloc_context3(nullptr)
-
作用:分配一个 AVCodecContext 结构体,用于存储解码器的上下文信息。
-
返回值:返回一个指向 AVCodecContext 的指针
codecContext
。
-
-
avcodec_parameters_to_context
-
作用:将 AVCodecParameters 中的参数复制到 AVCodecContext 中,以便解码器能够正确地初始化。
-
参数:通常是从 AVFormatContext(如从文件读取)中获取的参数。
-
-
avcodec_find_decoder
-
作用:查找指定的解码器。
-
返回值:返回一个指向 AVCodec 的指针
codec
。
-
-
avcodec_open2
-
作用:打开解码器,初始化解码器上下文。
-
参数:需要传递 AVCodecContext 和 AVCodec。
-
-
av_read_frame
-
作用:从输入流中读取一个视频帧(或音频帧)。
-
返回值:成功返回 0,失败返回负值。
-
-
判断是否读取到帧
-
作用:检查是否成功读取到帧。
-
是:继续处理。
-
否:跳转到
avcodec_send_packet(nullptr)
。
-
-
avcodec_send_packet
-
作用:将读取到的 AVPacket 发送到解码器。
-
参数:AVPacket。
-
-
avcodec_receive_packet
-
作用:从解码器中接收解码后的 AVPacket。
-
返回值:成功返回 0,失败返回负值。
-
-
判断是否取到帧
-
作用:检查是否成功接收到帧。
-
是:继续处理。
-
否:跳转到
avcodec_receive_frame
。
-
-
avcodec_receive_frame
-
作用:从解码器中接收解码后的 AVFrame。
-
返回值:成功返回 0,失败返回负值。
-
-
判断是否取到帧
-
作用:检查是否成功接收到帧。
-
是:继续处理。
-
否:跳转到
avcodec_close
。
-
-
avcodec_close
-
作用:关闭解码器。
-
-
avcodec_free_context
-
作用:释放 AVCodecContext 的内存。
-
流程图的逻辑
-
初始化解码器:从分配上下文到打开解码器。
-
读取帧:从输入流中读取帧,并发送到解码器。
-
接收解码后的帧:从解码器中接收解码后的帧。
-
循环处理:直到所有帧都被处理完毕。
-
关闭解码器:释放资源。