FFmpeg-chapter7和chapter8-使用 FFmpeg 解码视频(原理篇和实站篇)

server/2025/3/9 20:55:01/

解码流程如下图

流程:首先,通过 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 释放上下文内存。

具体函数:

  1. avcodec_alloc_context3(nullptr)

    • 作用:分配一个 AVCodecContext 结构体,用于存储解码器的上下文信息。

    • 返回值:返回一个指向 AVCodecContext 的指针 codecContext

  2. avcodec_parameters_to_context

    • 作用:将 AVCodecParameters 中的参数复制到 AVCodecContext 中,以便解码器能够正确地初始化。

    • 参数:通常是从 AVFormatContext(如从文件读取)中获取的参数。

  3. avcodec_find_decoder

    • 作用:查找指定的解码器。

    • 返回值:返回一个指向 AVCodec 的指针 codec

  4. avcodec_open2

    • 作用:打开解码器,初始化解码器上下文。

    • 参数:需要传递 AVCodecContext 和 AVCodec。

  5. av_read_frame

    • 作用:从输入流中读取一个视频帧(或音频帧)。

    • 返回值:成功返回 0,失败返回负值。

  6. 判断是否读取到帧

    • 作用:检查是否成功读取到帧。

    • :继续处理。

    • :跳转到 avcodec_send_packet(nullptr)

  7. avcodec_send_packet

    • 作用:将读取到的 AVPacket 发送到解码器。

    • 参数:AVPacket。

  8. avcodec_receive_packet

    • 作用:从解码器中接收解码后的 AVPacket。

    • 返回值:成功返回 0,失败返回负值。

  9. 判断是否取到帧

    • 作用:检查是否成功接收到帧。

    • :继续处理。

    • :跳转到 avcodec_receive_frame

  10. avcodec_receive_frame

    • 作用:从解码器中接收解码后的 AVFrame。

    • 返回值:成功返回 0,失败返回负值。

  11. 判断是否取到帧

    • 作用:检查是否成功接收到帧。

    • :继续处理。

    • :跳转到 avcodec_close

  12. avcodec_close

    • 作用:关闭解码器。

  13. avcodec_free_context

    • 作用:释放 AVCodecContext 的内存。

流程图的逻辑

  • 初始化解码器:从分配上下文到打开解码器。

  • 读取帧:从输入流中读取帧,并发送到解码器。

  • 接收解码后的帧:从解码器中接收解码后的帧。

  • 循环处理:直到所有帧都被处理完毕。

  • 关闭解码器:释放资源。

具体代码在这里:https://github.com/StudyWinter/MMAVPlayer/tree/main/chapter8


http://www.ppmy.cn/server/173758.html

相关文章

Uniapp使用wxml-to-canvas进行动态页面转图片

参考文章链接:https://www.cnblogs.com/liangtao999/p/16719534.html 官方的链接:https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/extended/component-plus/wxml-to-canvas.html 一、引入组件: 1、方法一&#…

文献阅读 | Nature Methods | SCENIC: 单细胞调控网络推断和聚类

文献介绍 文献题目: SCENIC: 单细胞调控网络推断和聚类 研究团队: Stein Aerts(比利时鲁汶大学) 发表时间: 2017-10-09 发表期刊: Nature Methods 影响因子: 25.0(2017年&#xff09…

【通义万相】蓝耘智算 | 开源视频生成新纪元:通义万相2.1模型部署与测评

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…

从李佳琦团队看新型用工:灵活就业如何重构组织架构?

2022年“双11”期间,李佳琦直播间累计销售额突破115亿元(来源:新腕数据《2022双11直播电商战报》),其背后团队规模约400人,但全职员工仅占35%,其余65%为外包选品团队、兼职客服、第三方MCN机构人…

XML布局文件与常用View组件

XML布局文件与常用View组件 一、基础知识 1.1 XML布局简介 Android应用的用户界面是由View和ViewGroup对象的层次结构组成的。每个ViewGroup都是一个可以包含View对象的容器。XML布局文件提供了一种类似HTML的方式来描述这种视图层次结构。 1.2 常用布局属性 <!-- 常用…

AI学习有感

和前辈聊天&#xff0c;谈到了现在的ai技术&#xff0c;这里对那天的谈话进行总结&#xff1a; AI是无状态的 我们在使用ai时有时候会有一个错觉&#xff0c;认为和ai聊天久了&#xff0c;ai就会像人与人之间交流一样&#xff0c;会保留一种对聊天对象的认知状态&#xff0c;这…

GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题

LiveGBS GB28181流媒体服务在接收视频的时候默认是使用30000-30249&#xff0c; webrtc流播放端口区间默认是UDP的30250-30500区间。有些网络环境不方便开放这么大的端口区间&#xff0c;下面介绍下如何修改配置这个区间。 从页面上修改这个区间&#xff0c;端口区间尽量设置大…

EXCEL自动化13 | 批量重命名工作簿中的工作表

目录 一. 重命名工作表1. 修改单个文件的工作表2. 修改单个文件的多个工作表3. 替换文件中的所有工作表名二. 批量重命名多个文件的工作表如下图所示,文件夹下有6个excel文件(工作簿)。打开任意一个工作簿,可看到其中有工作表,如 Sheet 1 。 要将6个工作簿中的工作表 “S…