FFmpeg 命令:从入门到精通 | FFmpeg 解码流程
FFmpeg 命令:从入门到精通 | FFmpeg 解码流程
- FFmpeg 命令:从入门到精通 | FFmpeg 解码流程
- 流程图
- FFmpeg 解码的函数
- FFmpeg 解码的数据结构
- 补充小知识
FFmpeg 命令:从入门到精通 | FFmpeg 解码流程
本内容参考雷霄骅博士的 FFmpeg 教程。
流程图
FFmpeg 解码的流程图如下所示:
FFmpeg 解码的流程:
- 注册:
使用ffmpeg对应的库,都需要进行注册,可以注册子项也可以注册全部。 - 打开文件:
打开文件,根据文件名信息获取对应的ffmpeg全局上下文。 - 探测流信息:
一定要探测流信息,拿到流编码的编码格式,不探测流信息则其流编码器拿到的编码类型可能为空,后续进行数据转换的时候就无法知晓原始格式,导致错误。 - 查找对应的解码器:
依据流的格式查找解码器,软解码还是硬解码是在此处决定的,但是特别注意是否支持硬件,需要自己查找本地的硬件解码器对应的标识,并查询其是否支持。普遍操作是,枚举支持文件后缀解码的所有解码器进行查找,查找到了就是可以硬解了(此处,不做过多的讨论,对应硬解码后续会有文章进行进一步研究)。(注意:解码时查找解码器,编码时查找编码器,两者函数不同,不要弄错了,否则后续能打开但是数据是错的) - 打开解码器:
打开获取到的解码器。 - 申请缩放数据格式转换结构体:
此处特别注意,基本上解码的数据都是yuv系列格式,但是我们显示的数据是rgb等相关颜色空间的数据,所以此处转换结构体就是进行转换前到转换后的描述,给后续转换函数提供转码依据,是很关键并且非常常用的结构体。 - 申请缓存区:
申请一个缓存区outBuffer,fill到我们目标帧数据的data上,比如rgb数据,QAVFrame的data上存是有指定格式的数据,且存储有规则,而fill到outBuffer(自己申请的目标格式一帧缓存区),则是我们需要的数据格式存储顺序。
举个例子,解码转换后的数据为rgb888,实际直接用data数据是错误的,但是用outBuffer就是对的,所以此处应该是ffmpeg的fill函数做了一些转换。
进入循环解码: - 获取一帧packet:
拿取封装的一个packet,判断packet数据的类型进行解码拿到存储的编码数据 - 数据转换:
使用转换函数结合转换结构体对编码的数据进行转换,那拿到需要的目标宽度、高度和指定存储格式的原始数据。 - 自行处理:
拿到了原始数据自行处理。不断循环,直到拿取pakcet函数成功,但是无法得到一帧数据,则代表文件解码已经完成。帧率需要自己控制循环,此处只是循环拿取,可加延迟等。 - 释放QAVPacket:
此处要单独列出是因为,其实很多网上和开发者的代码在进入循环解码前进行了av_new_packet,循环中未av_free_packet,造成内存溢出;或者,在进入循环解码前进行了av_new_packet,循环中进行av_free_pakcet,那么一次new对应无数次free,在编码器上是不符合前后一一对应规范的。查看源代码,其实可以发现av_read_frame时,自动进行了av_new_packet(),那么其实对于packet,只需要进行一次av_packet_alloc()即可,解码完后av_free_packet。
执行完后,返回执行“步骤8:获取一帧packet”,一次循环结束。 - 释放转换结构体:
全部解码完成后,安装申请顺序,进行对应资源的释放。 - 关闭解码/编码器:
关闭之前打开的解码/编码器。 - 关闭上下文:
关闭文件上下文后,要对之前申请的变量按照申请的顺序,依次释放。
FFmpeg 解码的函数
- av_register_all():注册所有组件。
- avformat_open_input():打开输入视频文件。
- avformat_find_stream_info():获取视频文件信息。
- avcodec_find_decoder():查找解码器。
- avcodec_open2():打开解码器。
- av_read_frame():从输入文件读取一帧压缩数据。
- avcodec_decode_video2():解码一帧压缩数据。
- avcodec_close():关闭解码器。
- avformat_close_input():关闭输入视频文件。
FFmpeg 解码的数据结构
FFmpeg 解码的数据结构如下所示:
FFmpeg 数据结构:
- AVFormatContext:封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息。
- AVInputFormat:每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。
- AVStream:视频文件中每个视频(音频)流对应一个该结构体。
- AVCodecContext:编码器上下文结构体,保存了视频(音频)编解码相关信息。
- AVCodec:每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。
- AVPacket:存储一帧压缩编码数据。
- AVFrame:存储一帧解码后像素(采样)数据。
FFmpeg 数据结构分析:
AVFormatContext:
- iformat:输入视频的AVInputFormat
- nb_streams :输入视频的AVStream 个数
- streams :输入视频的AVStream []数组
- duration :输入视频的时长(以微秒为单位)
- bit_rate :输入视频的码率
AVInputFormat:
- name:封装格式名称
- long_name:封装格式的长名称
- extensions:封装格式的扩展名
- id:封装格式ID
- 一些封装格式处理的接口函数
AVStream:
- id:序号
- codec:该流对应的AVCodecContext
- time_base:该流的时基
- r_frame_rate:该流的帧率
AVCodecContext:
- codec:编解码器的AVCodec
- width, height:图像的宽高(只针对视频)
- pix_fmt:像素格式(只针对视频)
- sample_rate:采样率(只针对音频)
- channels:声道数(只针对音频)
- sample_fmt:采样格式(只针对音频)
AVCodec:
- name:编解码器名称
- long_name:编解码器长名称
- type:编解码器类型
- id:编解码器ID
- 一些编解码的接口函数
AVPacket:
- pts:显示时间戳
- dts :解码时间戳
- data :压缩编码数据
- size :压缩编码数据大小
- stream_index :所属的AVStream
AVFrame:
- data:解码后的图像像素数据(音频采样数据)。
- linesize:对视频来说是图像中一行像素的大小;对音频来说是整个音频帧的大小。
- width, height:图像的宽高(只针对视频)。
- key_frame:是否为关键帧(只针对视频) 。
- pict_type:帧类型(只针对视频) 。例如I,P,B。
补充小知识
解码后的数据为什么要经过sws_scale()函数处理?
解码后YUV格式的视频像素数据保存在AVFrame的data[0]、data[1]、data[2]中。但是这些像素值并不是连续存储的,每行有效像素之后存储了一些无效像素。以亮度Y数据为例,data[0]中一共包含了linesize[0]*height个数据。但是出于优化等方面的考虑,linesize[0]实际上并不等于宽度width,而是一个比宽度大一些的值。因此需要使用sws_scale()进行转换。转换后去除了无效数据,width和linesize[0] 取值相等。
相关文章:
FFmpeg 命令:从入门到精通 | FFmpeg 解码流程
FFmpeg 命令:从入门到精通 | FFmpeg 解码流程 FFmpeg 命令:从入门到精通 | FFmpeg 解码流程流程图FFmpeg 解码的函数FFmpeg 解码的数据结构补充小知识 FFmpeg 命令:从入门到精通 | FFmpeg 解码流程 本内容参考雷霄骅博士的 FFmpeg 教程。 流…...
连接虚拟机工具推荐
连接虚拟机工具推荐 连接虚拟机的工具有很多种,以下是一些常用的推荐: PuTTY:这是一个非常常用的SSH和telnet客户端,适用于Windows系统。它允许你在本地机器上通过命令行接口远程登录到虚拟机。 SecureCRT:这是一个支…...
万字详解HTTP协议面试必备技能
目录 一、HTTP 是什么 二、理解 "应用层协议" 2.1理解 HTTP 协议的工作过程 2.2HTTP 协议格式 2.3抓包工具的使用 2.4抓包工具的原理 2.5抓包结果 2.5.1HTTP请求 2.5.2HTTP响应 2.6协议格式总结 三、HTTP 请求 (Request) 3.1认识 URL 3.1.1URL 基本格式 …...
Debian跳过grub页面
nano /etc/default/grub将GRUB_TIMEOUT的值改为0 将GRUB_CMDLINE_LINUX_DEFAULT的值改为"quiet splash" 如果要禁用开局日志的话,将GRUB_CMDLINE_LINUX_DEFAULT的值改为"quiet splash loglevel0" update-grub...
【已解决】RuntimeError Java gateway process exited before sending its port number
RuntimeError: Java gateway process exited before sending its port number 问题 思路 🎯方法一 在代码前加入如下代码(如图): import os os.environ[‘JAVA_HOME’] “/usr/local/jdk1.8.0_221” # 记得把地址改成自己的 …...
数据结构与算法-循环链表、双向链表
我们这里接着上一篇单链表继续往下深入学习循环链表、双向链表。 链表 🎈3.循环链表🔭3.1循环链表的概念🔭3.2循环链表的基本操作🔎3.2.1创建空表🔎3.2.2插入操作🔎3.2.3删除操作 🎈4.双向链表&…...
javascript中依次输出元素并不断循环实现echarts柱图动画效果
循环来遍历数组并输出其中的元素 在JavaScript中,你可以使用循环来遍历数组并输出其中的元素。如果你想要依次输出6个元素并不断循环,可以使用如下的代码: let arr [/* 你的数组 */];for (let i 0; i < arr.length; i) {console.log(a…...
互联网Java工程师面试题·Memcached篇·第一弹
目录 1、Memcached 是什么,有什么作用? 1.1 memcached 服务在企业集群架构中有哪些应用场景? 1.1.1 作为数据库的前端缓存应用 1.1.2 作业集群的 session 会话共享存储 2、Memcached 服务分布式集群如何实现? 3、Memcach…...
git 详解-提升篇
git 冷门使用 承接上一篇 《git 进阶篇》,简单讲解 git 冷门使用方法。 码农常规使用工具 git 偶尔也有非常规操作。例如:提交代码时同事已经更新,但又不想回退本地补丁;或者已经提交补丁需要变更提交日志信息。 作者࿱…...
RPA的安全风险及应对策略
RPA已经深度革新了工作流程,大大提升效率并减少了人为错误,使企业运营更加高效。据预测,至2030年,全球RPA市场将以39.9%的复合年增长率持续发展,这显示了RPA对企业生产力的巨大推动力。 RPA能够承担人类的繁琐工作&am…...
数据结构与算法--贪心算法
数据结构与算法-贪心算法 1 贪心算法的概念 2 贪心算法的套路 3 贪心算法常用技巧 4 会议问题 5 字典序问题 1 贪心算法的概念 在某一标准下,优先考虑最满足标准的样本,最后考虑不满足标准的样本,最终得到一个答案的算法,叫做贪心算法 也就是说 不是从整体上加以考虑,所…...
【Unity3D】UGUI物体世界坐标转屏幕坐标问题
如题: UGUI物体世界坐标转屏幕坐标问题,获取UI(UGUI)屏幕坐标问题等相关问题 思路:必须使用Canvas身上的Camera,进行Camera.WorldToScreenPoint(UI物体的世界坐标Vector3),会返回一个Vector3(x,y,z),我们要…...
代码随想录二刷day51
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣309. 买卖股票的最佳时机含冷冻期二、力扣714. 买卖股票的最佳时机含手续费 前言 一、力扣309. 买卖股票的最佳时机含冷冻期 class Solution {public …...
接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)
近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的,测试人员会希望很快能得到结果反馈,然而接口的数量一般都很多,而且会越来越…...
[Python入门教程]01 Python开发环境搭建
Python开发环境搭建 本文介绍python开发环境的安装,使用anaconda做环境管理,VS code写代码。搭建开发环境是学习的第一步,本文将详细介绍anaconda和vs code的安装过程,并测试安装结果。 视频教程链接:https://www.bil…...
第四章:最新版零基础学习 PYTHON 教程(第二节 - Python 数据类型—Python 字符串、列表、元组、迭代)
在在上一节文章中,我们了解了 Python 的基础知识。现在,我们继续了解更多 Python 概念。 Python 中的字符串: 字符串是字符序列,可以是字母、数字和特殊字符的组合。在Python中可以使用单引号、双引号甚至三引号来声明它。这些引号不是字符串的一部分,它们仅定义字符串…...
react框架与vue框架的区别
React和Vue都是前端开发中常用的框架,它们有一些不同的特性和优点。下面是它们的主要区别: 数据流和数据绑定:React是一种单向数据流的框架,而Vue则是双向数据绑定的框架。这意味着在React中,数据从组件的state属性流…...
C++_pen_静态与常量
成员 常成员、常对象(C推荐使用 const 而不用#define,mutable) const 数据成员只在某个对象生存周期内是常量,而对于整个类而言却是可变的(static除外) 1.常数据成员(构造函数初始化表赋值) c…...
ToDoList使用自定义事件传值
MyTop与MyFooter与App之间传递数据涉及到的就是子给父传递数据,MyList和MyItem与App涉及到爷孙传递数据。 之前的MyTop是使用props接收App传值,然后再在methods里面调用,现在使用自定义事件来处理子组件和父组件之间传递数据。 图是之前的…...
基于SSM的家庭财务管理系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
OpenHarmony Trace的使用
背景: 近期很多开发者反馈OpenHarmony三方库Imageknife有性能问题:连续拖动很多张图片时,界面有明显的卡顿现象。 因为对这个三方库的源码并不了解,因此需要了解目前Imageknife渲染花费了多少时间,最初想的是只有通过…...
文件上传笔记
一、上传的简单绕过: 1、若是上传的文件只在前端的代码中进行了过滤: (1)可以直接在开发者工具中删除相关代码: (2)也可以通过 burpsuite 绕过: 上传时,先提前修改 php 文件的后缀…...
计算机网络 第三章数据链路层
参考视频:计算机网络 文章目录 1、数据链路层概述2、链路层基本概念:节点3、链路层基本概念:链路与数据链路、帧4、封装成帧:字符计数法和字符填充法5、封装成帧:零比特填充法6、封装成帧:违规编码法7、差…...
浅析如何在抖音快速通过新手期并积累粉丝
抖音是一款非常受欢迎的短视频分享平台,它提供了一个快速成名和积累粉丝的机会。对于新手来说,通过四川不若与众总结的以下几个步骤可以帮助你快速通过抖音的新手期。 首先,确定你的内容定位。在抖音上,有各种各样的内容类型&…...
英文论文实例赏析——如何写前言?
写作与实验、统计一样重要 研究生的学习往往会遵循这样的过程:实验——数据分析——写作。虽然写作是最后进行的,但写作的学习这应该和实验的学习、数据分析的学习保持同步,因为写作与统计和实验技能一样,是科研工具箱的必…...
springBoot -md
法1 Editor.md https://blog.csdn.net/weixin_42039228/article/details/123472875 CREATE TABLE article ( id int(10) NOT NULL AUTO_INCREMENT COMMENT int文章的唯一ID, author varchar(50) NOT NULL COMMENT 作者, title varchar(100) NOT NULL COMMENT 标题, content l…...
从0开始学go第五天
gin框架返回JSON package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/json", func(c *gin.Context) {//用map序列化//方法一:用map,后面用接口类型// data : map[string…...
大厂技术面试中的手撕代码应该如何准备?
文章目录 手撕代码是什么为什么要考察手撕代码如何准备手撕代码手撕代码注意事项华为OD算法/大厂面试高频题算法练习冲刺训练 不管是秋招还是社招,互联网大厂的技术面试中的手撕代码这一部分总是绕不过去的一关。不只是后端开发和算法岗,现在就连前端、运…...
阿里影业+大麦,开启大文娱新纪元?
被“精心呵护”长达十年后,阿里大文娱在今年终于踏上了关键节点。 3月份,阿里“16N”组织大变革后,大文娱集团独自上路。8月,“分家”后的第一份财报显示,阿里大文娱集团成功大幅扭亏,实现了首次季度经调整…...
springboot整合mybatis入门程序
1.准备工作(创建springboot工程、数据库表user、实体类User) 创建数据表: create table user(id int unsigned primary key auto_increment comment ID,name varchar(100) comment 姓名,age tinyint unsigned comment 年龄,gender tinyint unsigned comment 性别, 1…...
网站配色/买卖交易网
我写此文是想正式地阐述我心中 React 的心智模型。目的是解释为什么我们会这样设计 React,同时你也可以根据这些论点反推出 React。 不可否认,此文中的部分论据或前提尚存争议,而且部分示例的设计可能存在 bug 或疏忽。这只是正式确定它的最…...
做网站需要几个程序/建设网站的网络公司
最近我参与了公司“鸿鹄云商”研发,一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案?以下是我结合公司的产品做的总结,希望可以帮助到大家! 1. 涉及平台 平台管理、商家端(PC端、手机端&am…...
院校网站建设/新闻发布最新新闻
1. 类型别名:为已有类型另外命名 1.1) typedef 已有类型名 新类型名表 例: typedef double Area, Volume; typedef int Natural;Natural i1,i2; Area a; Volume v;1.2) using 新类型名 已有类型名; 例: using A…...
长沙企业网站建设优度/今日新闻最新头条10条
作者|Michael Chau 编译|VK 来源|Towards Data Science 大家都知道Scikit-Learn——它是数据科学家基本都知道的产品,提供了几十种易于使用的机器学习算法。它还提供了两种现成的技术来解决超参数调整问题:网格搜索(GridSearchCV)…...
一个网站可以做多少地区词/自媒体营销的策略和方法
文章目录[点击展开](?)[] KSFramework KEngine SLua Framework KSFramework KSFramework是一个整合KEngine、SLua的Unity 5开发框架,并为程序、美术、策划、运营提供辅助工具集。 热重载是KSFramework的开发重点——在不重启游戏的前提下,重载代码、配…...
太原seo代理商/哈尔滨推广优化公司
最近脑子比较乱,一直昏昏沉沉的。昨天加班,突然想吃葡萄。我(可能,其实我忘了。)跟我对面的同事嘀咕了一句: 我让阿姨去买点葡萄。然后就一溜小跑的到阿姨房间跑去。回来后。我:喂,*…...