FFmpeg5.0源码阅读——FFmpeg大体框架

  摘要:前一段时间熟悉了下FFmpeg主流程源码实现,对FFmpeg的整体框架有了个大概的认识,因此在此做一个笔记,希望以比较容易理解的文字描述FFmpeg本身的结构,加深对FFmpeg的框架进行梳理加深理解,如果文章中有纰漏或者错误欢迎指出。本文描述了FFmpeg编解码框架的工程结构,基本构成以及大体的调用流程。因为FFmpeg的滤镜是相对独立的一个模块,因此在此不会进行描述。
  关键字:FFmpeg,Framework
  阅读须知:阅读本文前,你首先需要了解最基本的音视频处理相关的知识,对于这些知识你至少需要最基本的了解,比如知道什么是容器,什么是编解码器,以及大概的工作流程即可。
  FFmepg是一个用C语言实现的多媒体封装、解封转、编解码开源框架,支持了多种IO协议操作,媒体封装格式的封装与解封装以及编解码格式编解码器(包括硬解和软解)。任何软件都可以在FFmpeg的License范围内合理地基于FFmpeg进行开发。FFmpeg有两种开源协议:

  • GPL,该协议是具有传染性的,如果使用了GPL部分的代码(FFmpeg可以配置是否开关这部分代码)对应的软件也必须开源否则有法律风险;
  • LGPL,允许以动态发布的形式使用,即将FFmpeg编译为动态库使用,但是修改到了FFmpeg部分的代码,修改的部分也需要开源,一般商业软件都会采用这种方式来进行商业软件的开发。

  FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created. It supports the most obscure ancient formats up to the cutting edge. No matter if they were designed by some standards committee, the community or a corporation. It is also highly portable: FFmpeg compiles, runs, and passes our testing infrastructure FATE across Linux, Mac OS X, Microsoft Windows, the BSDs, Solaris, etc. under a wide variety of build environments, machine architectures, and configurations.

1 FFmpeg工程

  本小节简单描述下FFmpeg的工程结构相关的内容,以期对FFmpeg工程本身的基本构成有一个基本的认识。

1.1 FFmpeg工程结构

  FFmpeg本身的目录结构比较清晰,我们从目录名称中基本就能看出该目录下可能包含哪些文件具体用来干什么。

  • .:当前目录下存储的是一些编译和项目相关的配置文件,比如Makefile,License等;
  • compat:兼容文件;
  • doc:文档,以及一些FFmpeg使用的示例,如果学习FFmpeg的话强烈建议阅读示例;
  • ffbuild:编译相关的一些文件,比如依赖选项等等;
  • fftools:可以编译成可执行文件的一些工具实现,比如ffplay,ffmpeg,ffprobe等工具;
  • libavcodec:编解码核心,编解码相关的文件都存放在这里,比如h264dec.c等;
  • libavdevice:设备相关,比如DShow等;
  • libavfilter:滤镜特效处理;
  • libavformat:IO操作以及封装格式的封装和转封装等处理;
  • libavutil:工具库,比如一些基本的字符串操作,图像操作等;
  • libavpostproc:一些效果后处理相关的内容,一般通过filter处理;
  • libswresample:音频重采样处理;
  • libswscale:视频缩放、颜色空间转换以及色调映射等;
  • presets:编解码器的配置文件,参考FFmpeg-Present-files
  • tests:测试示例;
  • tools:一些简单的工具。

2 FFmpeg架构

2.1 FFmpeg的总体架构

在这里插入图片描述

  FFmpeg各个模块是互相独立的,都可以单独使用,比如解封装器只用来对媒体进行解封装或者封装拿到编码器的裸流,或者编解码器直接对裸流数据进行编解码,亦或者使用工具集对已经解码完的数据尽兴处理。
  编解码模块支持多种不同编解码器,所有的编解码器所使用的参数和当前编解码器相关的Context都是使用AVCodecContext描述。而FFmpeg中每个具体的解码器都有一个静态的AVCodec描述当前解码器如何解码,这个是有一套统一的接口来定义的。上层拿到AVCodecContextAVCodec就可以初始化解码器进行解码了,只不过使用FFmpeg提供的解码接口更加方便。FFmpeg并没有硬件解码器归类的AVCodec下面,而是在其下层另外规定了一套AVHWAccel,通过AVCodec来描述该硬件解码器。
  封装和解封装支持多种不同的媒体文件类型,FFmpeg中讲一个文件抽象为AVFormatContext,而内部分别将输入流和输出流分别抽象为AVInputFormat,AVOutputFormatAVInputFormat,AVOutputFormat用来描述当前媒体文件的相关参数以及对媒体文件进行封装和解封装,而具体的操作通过AVIO来进行。AVIO抽象了具体的文件IO操作,类似编解码器每种类型的输入流都有各自的描述,封装器和解封装器同理。
  工具集也是独立的,只是一些工具函数的集合。
  滤镜用来对裸数据进行一些特效上的处理。(本文不会过多讨论滤镜)

2.2 代码结构

  FFmpeg虽然是用C语言写的但是其基本的实现思想是按照OOP的思想实现的,每个具体的格式都有自己的Context和描述类然后通过函数指针来描述具体实例的实际实现,也就是上面描述的Context->Context->Context->....>Implementation这种形式,为了对当前处理的对象统一抽象就会有一个Context来描述。而每个Context都有一个AVClassopaue来描述当前结构的参数和独有的一些数据,通过这种方式保持了接口的统一的同时,又能兼顾差异性。
在这里插入图片描述

2.3 调用流程

  FFmpeg的核心就是封装/解封装和解码那一套,下面的流程图是一个大概,有一部分调用被省略了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Mvvm设计模式的详解与实战教程

一、介绍 在开发设计模式中,模式经历了多次迭代,从MVC到MVP,再到如今的MVVM。发现的过程其实很简单,就是为了项目更好的管理。 设计模式严格来说属于软件工程的范畴,但是如今在各大面试中或者开发中,设计模…

三方接口调用设计方案

在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题 在设计三方接口调用的方案时,需要考虑到安全性和可用性。以下是一种设计方案的概述&a…

C# 学习笔记--个人学习使用 <2>

C# 学习笔记 Chapter 2 比较硬的基础部分Section 1 委托Part 1 Action 与 func 委托的示例Part 2 自定义委托Part 3 委托的一般使用Part 4 委托的高级使用Part 5 适时地使用接口 Interface 取代一些对委托的使用 Section 2 事件Part 1 初步了解事件Part 2 事件的应用Part 3 事件…

【Luniux】解决Ubuntu外接显示器不显示的问题

Luniux】解决Ubuntu外接显示器不显示的问题 文章目录 Luniux】解决Ubuntu外接显示器不显示的问题1. 检查nvidia显卡驱动是否正常2. 更新驱动3. 检查显示器是否能检测到Reference 1. 检查nvidia显卡驱动是否正常 使用命令行 nvidia-smi来检查显卡驱动是否正常,如果…

持续集成与持续交付:现代软件测试的变革之路

引言 在数字化时代,软件开发的速度和复杂性都在不断增加。为了满足市场的需求,企业需要更快、更高效地交付高质量的软件产品。在这样的背景下,持续集成与持续交付(CI/CD)成为了软件开发和测试的核心实践。 软件开发的…

论文阅读 The Power of Tiling for Small Object Detection

The Power of Tiling for Small Object Detection Abstract 基于深度神经网络的技术在目标检测和分类方面表现出色。但这些网络在适应移动平台时可能会降低准确性,因为图像分辨率的增加使问题变得更加困难。在低功耗移动设备上实现实时小物体检测一直是监控应用的…

小研究 - Java虚拟机性能及关键技术分析

利用specJVM98和Java Grande Forum Benchmark suite Benchmark集合对SJVM、IntelORP,Kaffe3种Java虚拟机进行系统测试。在对测试结果进行系统分析的基础上,比较了不同JVM实现对性能的影响和JVM中关键模块对JVM性能的影响,并提出了提高JVM性能的一些展望。…

css之文字连续光影特效、动画、scss

文章目录 效果图htmlscsscss 效果图 html <div><span>C</span><span>O</span><span>L</span><span>O</span><span>R</span><span>F</span><span>U</span><span>L</span&…

WOFOST模型与PCSE模型应用

实现作物产量的准确估算对于农田生态系统响应全球变化、可持续发展、科学粮食政策制定、粮食安全维护都至关重要。传统的经验模型、光能利用率模型等估产模型原理简单&#xff0c;数据容易获取&#xff0c;但是作物生长发育非常复杂&#xff0c;中间涉及众多生理生化过程&#…

Java学数据结构(2)——树Tree 二叉树binary tree 二叉查找树 AVL树 树的遍历

目录 引出什么是树Tree&#xff1f;树的实现二叉树binary tree查找树ADT——二叉查找树Binary Search Tree1.contains方法2.findMax和findMin方法3.insert方法4.remove方法&#xff08;复杂&#xff09;二叉查找树的深度 AVL(Adelson-Velskii和Landis)树——平衡条件(balance c…

流处理详解

【今日】 目录 一 Stream接口简介 Optional类 Collectors类 二 数据过滤 1. filter()方法 2.distinct()方法 3.limit()方法 4.skip()方法 三 数据映射 四 数据查找 1. allMatch()方法 2. anyMatch()方法 3. noneMatch()方法 4. findFirst()方法 五 数据收集…

Day43|leetcode 1049.最后一块石头的重量II、494.目标和、474.一和零

leetcode 1049.最后一块石头的重量II 题目链接&#xff1a;1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 视频链接&#xff1a;动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩…

date_range()函数--Pandas

1. 函数功能 生成连续的日期时间序列 2. 函数语法 pandas.date_range(startNone, endNone, periodsNone, freqNone, tzNone, normalizeFalse, nameNone, inclusiveboth, *, unitNone, **kwargs)3. 函数参数 参数含义start可选参数&#xff0c;起始日期end可选参数&#xff…

01-Flask-简介及环境准备

Flask-简介及环境准备 前言简介特点Flask 与 Django 的比较环境准备 前言 本篇来介绍下Python的web框架–Flask。 简介 Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写&#xff0c;较其他同类型框架更为灵活、轻便且容易上手&#xff0c;小型团队在短时间内…

QtCreator指定Windows Kits版本

先说下事件起因&#xff1a;之前一直在用Qt5.12.6&#xff0b;vs2017在写程序&#xff0c;后面调研了一个开源库Qaterial&#xff0c;但是翻来覆去的编译都有问题&#xff0c;后面升级到了Qt5.15.2&#xff0b;vs2019来进行cmake的编译&#xff0c;搞定了Qaterial&#xff0c;但…

软考A计划-系统集成项目管理工程师-小抄手册(共25章节)-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

深度学习经典检测方法的概述

深度学习经典的检测方法 two-stage&#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 两阶段&#xff08;two-stage&#xff09;是指先通过一个区域提取网络&#xff08;region proposal network&#xff0c;RPN&#xff09;生成候选框&#xff0c;再通过…

SLAM十四讲学习笔记 第二期:部分课后实践代码

持续更新.... 前期准备第二讲实验一&#xff1a;简单输出 第五讲任务一&#xff1a;imageBasics&#xff08;Ubuntu配置opencv&#xff09;任务二&#xff1a;双目匹配点云&#xff08;Ubuntu配置pangolin&#xff09;检验部分我认为可以加深对CMake的理解 任务三&#xff1a;r…

pandas数据分析——groupby得到分组后的数据

groupbyagg分组聚合对数据字段进行合并拼接 Pandas怎样实现groupby聚合后字符串列的合并&#xff08;四十&#xff09; groupby得到分组后的数据 pandas—groupby如何得到分组里的数据 date_range补齐缺失日期 在处理时间序列的数据中&#xff0c;有时候会遇到有些日期的数…