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

FFmpeg-chapter3和chapter4-读取视频流(原理篇和实战篇)

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工程实现上述步骤:

(1)定义一个MMAVReader读取视频的类,在其构造函数中分配一个 AVFormatContext,析构函数中释放AVFormatContext 及其占用的内存;

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

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

(2)定义一个open函数打开视频流,并获取相关信息;定义一个close函数关闭视频流;

avformat_open_input(): 打开一个输入文件或流

avformat_find_stream_info(): 获取输入文件或流的详细信息

avformat_close_input(): 关闭输入文件或流

(3)定义一个read函数读取每一帧视频

av_read_frame(): 从输入文件或流中读取一帧数据。

(4) 具体代码在这里:MMAVPlayer/chapter3 at main · StudyWinter/MMAVPlayer · GitHub

这里重新封装了AVPacket和AVFormatContext

(5)主函数实现分配、打开、读取、关闭、释放流程。

参考:

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

相关文章:

FFmpeg-chapter3和chapter4-读取视频流(原理篇和实战篇)

ffmpeg网站:About FFmpeg 1 库介绍 (1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 (2)libavcodec是一个包含音频/视频编解码器的解码器和编…...

音频3A测试--AEC(回声消除)测试

一、测试前期准备 一台录制电脑:用于作为近段音源和收集远端处理后的数据; 一台测试设备B:用于测试AEC的设备; 一个高保真音响:用于播放设备B的讲话; 一台播放电脑:用于模拟设备A讲话,和模拟设备B讲话; 一台音频处理器(调音台):用于录制和播放数据; 测试使用转接线若…...

Unity插件-Mirror使用方法(一)Mirror介绍

目录 一、使用介绍 二、插件介绍 1、简述 2、核心功能与特点 基于组件的高层抽象 服务器-客户端架构 序列化与同步 可扩展性与灵活性 跨平台支持 社区与生态 3、典型应用场景 4、基本使用示例 安装 设置 NetworkManager 同步变量与 RPC 5、优缺点对比 6、为什…...

Markdown HTML 图像语法

插入图片 Markdown ![图片描述](图片链接)一般来说,直接复制粘贴过来就行了,部分网页/应用可以拖拽,没人会真敲图片的链接吧…… 示例图片: ![Creeper?](https://i-blog.csdnimg.cn/direct/f5031c8c4f15421c9882d7eb23540b8…...

操作系统启动——前置知识预备

文章目录 1. 理解冯诺依曼体系结构1.1 简单见一见冯诺依曼1.2 进一步认识1.3 为什么一定要有内存的存在? 2. 操作系统2.1 概念2.2 设计OS的目的2.3 OS的核心功能2.4 如何理解“管理”二字?(小故事版)2.5 系统调用和库函数概念 3. 进程简述3.1 基本概念3.…...

详细分析KeepAlive的基本知识 并缓存路由(附Demo)

目录 前言1. 基本知识2. Demo2.1 基本2.2 拓展2.3 终极 3. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本知识推荐阅读:KeepAlive知识点 从实战中学习,源自实战中vue路由的…...

AI数据分析:deepseek生成SQL

在当今数据驱动的时代,数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展,AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道,SQL 查询语…...

Kafka 消息 0 丢失的最佳实践

文章目录 Kafka 消息 0 丢失的最佳实践生产者端的最佳实践使用带有回调的 producer.send(msg, callback) 方法设置 acks all设置 retries 为一个较大的值启用幂等性与事务(Kafka 0.11)正确关闭生产者与 flush() 方法 Broker 端的最佳实践设置 unclean.l…...

vue3(笔记)3.0 Pinia状态管理数据.持久化插件.内置vue devtools调试工具

---pinia状态管理数据(vuex升级版) 官网镜像:(https://pinia.vuejs.org/zh/core-concepts/) 安装(手动): npm install pinia 导入pinia: 组合式写法的格式: 使用前需要导入: import {defineStore} from piniaactions:支持了同步和异步的方法(融合了mutations) 在组件中调…...

装饰器模式:灵活扩展对象功能的利器

一、从咖啡加料说起:什么是装饰器模式? 假设您走进咖啡馆点单: 基础款:美式咖啡(15元)加料需求:加牛奶(3元)、加焦糖(5元)、加奶油(…...

linux应用:errno、perror、open、fopen

errno errno 是一个全局变量,定义在 头文件中。当系统调用(如 open、read、write 等)或库函数执行失败时,会将一个错误码赋值给 errno。不同的错误码代表不同的错误类型,通过检查 errno 的值,可以判断具体…...

网络原理--HTTP协议

http中文名为超文本传输协议,所谓“超文本”就是指传输范围超出了能在UTF8等码表上找到的字符的范围,包含一些图片,特殊格式之类的。 HTTP的发展简介 从图中可以看出到现在已经发展出了HTTP3,但是市面上的主流还是以HTTP1.0为主。…...

编译可以在Android手机上运行的ffmpeg程序

下载代码 git clone gitgithub.com:FFmpeg/FFmpeg.git git checkout n7.0建立build目录 mkdir build cd build创建build.sh脚本 vim build.sh这段脚本的主要功能是配置和编译 FFmpeg,使其能够在 Android 平台上运行,通过设置不同的架构和 API 级别&am…...

华为hcia——Datacom实验指南——配置手工模式以太网链路聚合

什么是以太网链路聚合(Eth-trunk) 是一种将多个物理链路捆绑在一起,让设备以为是一条大链路,能够增加带宽,增加冗余度,提升可靠性,实现负载平衡。 传输方式有两种 基于数据流传输和基于数据包…...

【C语言6】数组和函数实践:扫雷游戏的简单实现

文章目录 一、扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析1.2.2 文件结构设计 二、扫雷游戏的代码实现三、扫雷游戏的扩展总结 一、扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续…...

LeetCode 热题 100----1.两数之和

LeetCode 热题 100----1.两数之和 题目描述 我的解法 语言:js 思路就是:用双重循环去找哪两个数字相加等于target,目前的时间复杂度为O(n2),之后右优化思路再更新。...

《模式和状态管理》知识总结三-EcuM与BswM模块的交互

前言 这篇文章主要搞清楚在模式管理中,BswM和EcuM各自的分工。距离学完模式管理也有几天时间了,写这篇文章算是复习一下。 EcuM及BswM交互总览 EcuM负责Ecu的上下电状态的处理,当Ecu处于正常运行状态的时候,EcuM会将Ecu的控制权…...

RK3568平台(网络篇)RTL8111网卡

RTL8111 是 Realtek 推出的一款高性能千兆以太网控制器芯片,广泛应用于 PCIE 网卡中。 其工作原理涉及 数据链路层 和 物理层 的协同工作,以下是其核心原理的详细说明: 一.网卡的基本功能 1.数据封装与解封装: 网卡负责将计算机中的数据封装成网络传输的帧(Frame),并…...

客户需求模糊或频繁变更怎么办

应对客户需求模糊或频繁变更的关键在于 明确沟通、敏捷应对、科学决策。其中,明确沟通尤为重要,因为通过有效沟通,不仅能迅速厘清客户真实需求,还能及时发现隐藏问题,降低项目风险,为后续调整提供有力数据支…...

动静态库-Linux 学习

在软件开发中,程序库是一组预先编写好的程序代码,它们存储了常用的函数、变量和数据结构等。这些库可以帮助开发者节省大量的时间和精力,避免重复编写相同的代码。当我们在 Linux 系统中开发程序时,经常会用到两种类型的程序库&am…...

DeepSeek 系列模型:论文精读《A Survey of DeepSeek Models》

引言:一篇快速了解 DeepSeek 系列的论文。我在翻译时加入了一些可以提高 “可读性” 的连词 ✅ NLP 研 2 选手的学习笔记 笔者简介:Wang Linyong,NPU,2023级,计算机技术 研究方向:文本生成、大语言模型 论文…...

Python解决“找出整形数组中占比超过一半的数”问题

这里写目录标题 问题描述测试样例解决思路代码法1法2 问题描述 小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1: 输入&…...

机器人学习模拟框架 robosuite (3) 机器人控制代码示例

Robosuite框架是一个用于机器人模拟和控制的强大工具,支持多种类型的机器人。 官方文档:Overview — robosuite 1.5 documentation 开源地址:https://github.com/ARISE-Initiative/robosuite 目录 1、通过键盘或SpaceMouse远程控制机器人…...

kakfa-3:ISR机制、HWLEO、生产者、消费者、核心参数负载均衡

1. kafka内核原理 1.1 ISR机制 光是依靠多副本机制能保证Kafka的高可用性,但是能保证数据不丢失吗?不行,因为如果leader宕机,但是leader的数据还没同步到follower上去,此时即使选举了follower作为新的leader&#xff…...

【微知】如何查看Mellanox网卡上的光模块的信息?(ethtool -m enp1s0f0 看型号、厂商、生产日期等)

背景 服务器上插入的光模块经常被忽略,往往这里是定位问题最根本的地方。如何通过命令查看? 命令 ethtool提供了-m参数,m是module-info的意思,他是从光模块的eeprom中读取数据。(应该是用i2c协议读取的)…...

yum源选要配置华为云的源,阿里云用不了的情况

curl -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo...

nginx accesslog 打印自定义header

比如我在请求的header中添加了一个path-match-type,那我现在nginx的accesslog 中打印出来,应该如何配置呢? rootnginx-59f5d66df6-jw5k8:/# cat /etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/erro…...

好数——前缀和思想(题目分享)

今天我的舍友去参加“传智杯”广东省的省赛,跟我说了这样一道题,他说他想不出来怎么去优化代码,怎么做都是套用两层for循环超时,下面我就根据题意,使用前缀和的算法去优化一下思路,题目本身是不难的&#x…...

MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革

随着人工智能、大模型等技术的蓬勃发展,生成式AI应用全面爆发。在此背景下,服务机器人作为大模型技术在端侧落地的关键场景,迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备,服务机器人需要应对复杂场景下的感知、决策和…...

【大模型基础_毛玉仁】0.概述

更多内容:XiaoJ的知识星球 【大模型基础_毛玉仁】 系列文章参考 系列文章 【大模型基础_毛玉仁】0.概述 【大模型基础_毛玉仁】1.1 基于统计方法的语言模型 更新中。。。。。。 参考 书籍:大模型基础_完整版.pdf Github:https://github.co…...