FFmpeg-chapter7和chapter8-使用 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 释放上下文内存。

具体函数:

  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

相关推荐
hans汉斯11 小时前
《软件工程与应用》期刊推荐&10月版面征稿中
图像处理·人工智能·深度学习·算法·音视频·软件工程
AI服务老曹14 小时前
AI视频分析API常见问题和排查清单
人工智能·音视频
程序员老陆15 小时前
Qt的QThread::usleep和FFmpeg的libavutil模块的av_usleep哪个精度高一些?
开发语言·qt·ffmpeg·音视频
咖啡星人k16 小时前
MiniMax H3 正式开源!统一全模态视频生成,2K+15秒+原生立体声,一文看懂架构与玩法
音视频
怪奇云呼军16 小时前
从声音特征到 CRM 回流:闪电智能 Voice Agent 沟通策略自适应系统 v1 实战
android·人工智能·python·音视频·语音识别
程序员老陆20 小时前
如何使用FFmpeg6的API进行HLS开发呢?
ffmpeg·音视频·hls
The moon forgets20 小时前
Qwen团队提出Ego2Robot, 第一人称视频助力具身VLA训练新数据
人工智能·机器学习·音视频
AI服务老曹1 天前
AI视频分析API完整流程:设备、算法与告警接口接入指南
人工智能·算法·音视频
AImoon11.11 天前
MiniMax H3开源引发视频赛道变局,客易云关注AI模型从生成工具迈向生产力工具
人工智能·音视频
乐橙开放平台1 天前
一周上线校园透明化:listDeviceDetailsByPage 台账 + getKitToken + ImouPlayer 多路墙
后端·物联网·安全·音视频·智能家居