解码流程如下图
流程:首先,通过 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 的内存。
流程图的逻辑
初始化解码器:从分配上下文到打开解码器。
读取帧:从输入流中读取帧,并发送到解码器。
接收解码后的帧:从解码器中接收解码后的帧。
循环处理:直到所有帧都被处理完毕。
关闭解码器:释放资源。