当前位置: 首页 > news >正文

FFmpeg-chapter3-读取视频流(原理篇)

ffmpeg网站:About FFmpeg

1 库介绍

(1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。

(2)libavcodec是一个包含音频/视频编解码器的解码器和编码器的库。

(3)libavformat是一个包含多媒体容器格式的拆装器和拆装器的库。

(4)libavdevice是一个包含输入和输出设备的库,用于抓取和呈现许多常见的多媒体输入/输出软件框架,包括Video4Linux、Video4Linux2、VfW和ALSA。

(5)libavfilter是一个包含媒体过滤器的库。 libswscale是一个执行高度优化的图像缩放和色彩空间/像素格式转换操作的库。

(6)libswresample是一个执行高度优化的音频重采样,重矩阵和样本格式转换操作的库。

2 实现步骤

上面是主要用到的函数

(1)av_register_all(): 注册 FFmpeg 支持的所有解码器、编码器、格式等;

(2)avformat_network_init(): 初始化网络支持(如果需要从网络流中读取数据);

调用一次即可

(3)avformat_alloc_context(): 分配一个 AVFormatContext,它是 FFmpeg 中用于管理多媒体文件或流的核心结构。返回值是一个指向 AVFormatContext 的指针。

(4)avformat_open_input(): 打开一个输入文件或流,并将其信息加载到 AVFormatContext 中。这一步会解析文件格式(如 MP4、AVI 等),并为后续的流处理做准备。

(5)avformat_find_stream_info(): 获取输入文件或流的详细信息,包括音视频流的编码格式、帧率、分辨率等。这一步会填充 AVFormatContext 中的 AVStream 信息。

(6)av_read_frame(): 从输入文件或流中读取一帧数据。每次调用 av_read_frame() 会返回一个 AVPacket,它包含了一帧的编码数据。如果读取成功,继续处理帧数据;如果读取失败或到达文件末尾,则停止。

(7)AVPacket: 包含编码的帧数据(如压缩的视频或音频数据)。AVFrame: 包含解码后的帧数据(如解压缩后的视频或音频数据)。AVPacket 需要通过解码器(如 avcodec_send_packet()avcodec_receive_frame())解码为 AVFrame

(8)avformat_close_input(): 关闭输入文件或流,并释放相关资源。这一步会释放 AVFormatContext 中的所有流信息。

(9)avformat_free_context(): 释放 AVFormatContext 及其占用的内存。

总结:

(1)初始化 FFmpeg 环境。

(2)创建并初始化 AVFormatContext

(3)打开输入文件或流,获取流信息。

(4)循环读取帧数据(AVPacket),并通过解码器解码为 AVFrame

(5)处理解码后的帧数据(如播放、保存等)。

(6)关闭输入流并释放资源。

3 代码

使用VS新建cmake工程实现上述步骤。

参考:

ffmpeg 4.22库文件:GitCode - 全球开发者的开源社区,开源代码托管平台

详细参考:MMAVPlayer/chapter3 at main · StudyWinter/MMAVPlayer · GitHub

http://www.lryc.cn/news/544462.html

相关文章:

  • 机器视觉线阵相机分时频闪选型/机器视觉线阵相机分时频闪选型
  • 「Selenium+Python自动化从0到1②|2025浏览器操控7大核心API实战(附高效避坑模板))」
  • 矩阵系列 题解
  • 活动报名:Voice Agent 技术现状及应用展望丨 3.8 北京
  • 【卡牌——二分】
  • 《第十五部分》STM32之FLASH闪存(终结篇)
  • 属性的设置
  • 本地部署Deepseek+Cherry Studio
  • CMU15445(2023fall) Project #2 - Extendible Hash Index 匠心分析
  • 【VSCode】VSCode下载安装与配置极简描述
  • 【前端基础】Day 5 CSS浮动
  • 处理DeepSeek返回的markdown文本
  • 互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书
  • Node.js定义以及性能优化
  • 浅谈流媒体协议以及视频编解码
  • 在 Windows 上配置 Ollama 服务并开放局域网访问
  • 【六祎 - Note】消息队列的演变,架构图;备忘录; IBM MQ,RabbitMQ,Kafka,Pulsar
  • 常见AI写作工具介绍(ChatGPT 4o、DeepClaude、Claude 3.5 Sonnet 、DeepSeek R1等)
  • WPF中对滚动条进行平滑滚动
  • 深入xtquant:Python量化交易的桥梁与核心
  • Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存
  • 网络变压器的主要电性参数与测试方法(2)
  • SpringSecurity基于JWT实现Token的处理
  • TCP的三次握手与四次挥手:建立与终止连接的关键步骤
  • 某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案
  • 登录次数限制
  • java jar包内的jar包如何打补丁
  • 面试(进阶) —虚拟列表在什么场景使用,如何实现?
  • 深入了解 NAT 模式:网络地址转换的奥秘
  • Android Studio 新版本Gradle发布本地Maven仓库示例