FFmpeg 框架分析

news2025/4/15 8:27:08

1 概述

按照DirectShow 对播放器模块的划分,一个完整的播放器应该需要获得以下四个模块支持:

Source Filter : 数据源,可以是本地文件fopen, 也可以是网络文件,http,rtp,rtmp 等等

Demux Fliter: 解复用,下载的数据是带容器封装的,需要Demux Filter 解析头部信息,分离音频,视频流,然后送到对应的解码器。

Decoder Fliter :对音频,视频流进行解码输出。

Render Filter:显示模块,这个FFMPEG 并没有去集成,它也是采用SDL render.

敲黑板:FFMPEG是一个多媒体的框架!!! 对用户而言,它统一了不同IO 协议,不同封装格式,不同编解码格式的接口, 用户在使用时只用关注自己业务逻辑就行,下面我们将根据以上4个模块来拆解FFMPEG 架构。

2 Source Filter

在FFMPEG 中,Source Filter 可以分三层,最底层是local file , http,rtp 等具体的文件协议,第二层是URLContext ,它的成员URLProtocol 则指向具体协议的open/read. 第三层AVIOContext 在URLContext 基础上加了buff 管理。

对应到FFMPEG 具体的类,可表示为: AVIOContext < URLContext < URLProtocol ,分别对应的文件为:aviobuf.c, avio.c ,file.c 。 URLProtocol 指向的是具体的协议,比如本地文件,在File.c 里面有这样一个定义:

const URLProtocol ff_pipe_protocol = {
    .name                = "pipe",
    .url_open            = pipe_open,
    .url_read            = file_read,
    .url_write           = file_write,
    .url_get_file_handle = file_get_handle,
    .url_check           = file_check,
    .priv_data_size      = sizeof(FileContext),
    .priv_data_class     = &pipe_class,
    .default_whitelist   = "crypto"
};

这会在初始化的时候根据不同的URL去指定,当上层调用open /read 函数时候,对应本地文件来说对应file_open/file_write,其实就是C 库支持的fopen/fread.

URLProtocol,它根据URL 指向具体的文件协议,使用者无需区分具体的文件协议,因为这里统一了文件协议API. 如下图,展现加载过程,url_protocols[i]包含具体文件协议的函数,然后匹配对应为文件协议。

AVIOContext 则是实现对读取的数据进行Buff 管理。

问AVIOContext, URLContext, URLProtocol, FileContext 之间的关系?

答:它们关系如下图所示,URLProtocol,FileContext 都是URLContext 的成员,分别对应*prot, *priv_data. URLProtocol 统一了各个IO 协议的接口,FILEContext是本地文件协议的上下文。URLContext 是AVIOContext 成员(URLContext = AVIOConetx->opaque->h), 而AVIOContext 相对于URLContext加了buff 管理,其他IO 协议也可以类比。

3 Demux Fliter

Demux Fliter 可分为两层,底层是FLVContext,AVIContext 等等这些具体的文件封装,善上层是AVFormatContext, 它的成员struct AVInputFormat *iformat; 则指向具体的封装文件,统一了API,使用者无需区分具体的格式的文件。层次关系如下图所示:

4 Decoder Fliter

Decoder Fliter 实现解码功能, 也是播放器的核心和难点。 它可以分为两层,最底层是具体的编码格式,如H264,VP8,VP9等等,上层是AVCodecContext,它的成员AVCodec *codec; 则指向了具体的编解码格式,统一了编解码的API 接口,使用者调用统一的API即可,无需区分具体的编解码格式。其层次关系如下图所示:

5 Render Filter

解码后的数据就可以送到喇叭或者屏幕上输出了,FFMPEG 并没有集成render 模块,采用的是SDL 去输出声音和图像。

粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

相关文章

Java | Leetcode Java题解之第18题四数之和

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> quadruplets new ArrayList<List<Integer>>();if (nums null || nums.length < 4) {return…

循环单链表算法库

学习贺老师数据结构 数据结构之自建算法库——循环单链表_循环单链表 csdn-CSDN博客​​​​​​ 整理总结出的循环单链表算法库 v1.0 : 基本实现功能 v2.0(2024.4.6): 修复Delete_SpecificLocate_CyclicList()删除节点函数bug,添加验证删除节点是否超范围判断 目录 1.主要功能…

CSS设置文本

目录 概述&#xff1a; text-aling: text-decoration: text-transform: text-indent: line-height: letter-spacing: word-spacing: text-shadow: vertical-align: white-space: direction: 概述&#xff1a; 在CSS中我们可以设置文本的属性&#xff0c;就像Word文…

测开面经(Git经典题目,Git入门)

1. GitHub是什么 a. Git是一个分布式版本控制系统&#xff0c;作用是跟踪、管理和协调软件开发项目中的代码更改。 b. 提供了一种有效的方式来管理代码的版本历史&#xff0c;以及多人协作开发的能力。 2. Git的作用有哪些 a. 版本控制&#xff1a;Git可以记录每次代码更改的…

Linux的学习之路:8、Linux调试器-gdb使用

摘要 本章主要是说一下gdb的使用&#xff0c;以及把使用指令放入放个指令手册。 目录 摘要 一、背景 二、使用 1、产生debug文件 2、进入gdb 3、使用指令 三、思维导图 一、背景 Linux调试器gdb的背景主要涉及到Linux程序发布方式和调试需求。 在Linux中&#xff0c…

加速杂交水稻走向世界 政协委员建议在湖南设立一“协会”一“中心”

中新网北京3月8日电 (刘曼)针对中国杂交水稻海外“飘香”的现象&#xff0c;全国政协委员、湖南省政协副主席、民盟湖南省委会主委何寄华建议&#xff0c;在湖南建立杂交水稻国际合作交流协会、设立杂交水稻国际科技合作技术转移中心&#xff0c;支持杂交水稻走向世界。 全国政…

mysql主从复制Slave_SQL_Running: No

1、SHOW SLAVE STATUS \G; Slave_SQL_Running: No 解决方案&#xff1a; 重新同步主库和从库的数据 1、从库先停掉slave stop slave; 2、在主库查看此时的日志文件和位置 show master status; 3、在从库中执行 change master to master_host192.168.2.177,master_userslave…

【MATLAB源码-第187期】基于matlab的人工蜂群优化算法(ABC)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Artificial Bee Colony&#xff08;ABC&#xff09;算法是一种模仿蜜蜂觅食行为的优化算法&#xff0c;它通过模拟蜜蜂群体的社会结构和行为来解决数学优化问题。本文将详细介绍ABC算法的基本原理、算法流程、以及在实际应用…

C语言进阶课程学习记录 - 字符串与常见问题分析

C语言进阶课程学习记录 - 字符串与字符串问题分析 字符串实验-字符串定义实验-字符串作为字符数组使用实验-字符串长度判断小结 字符串问题分析实验-snprintf实验-字符数组,strlen,sizeof实验-字符串相等比较实验-循环右移 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&…

浅入浅出之nginx

目录 工作流程正向代理概念 反向代理概念 nginx反向代理配置文件介绍解释作用 参考文章Nginx 常用指令和操作启动 Nginx测试配置文件快速关闭 Nginx优雅关闭 Nginx重载配置文件查看版本查看编译时的参数查看进程配置用户访问日志配置错误日志设置 web 根目录配置 server 块配置…

3.反转链表

1.题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&…

matplotlib手动调用默认配色

matplotlib 画图有个默认配色方案&#xff0c;在画不同图时会保持一致。如&#xff1a; import numpy as np import matplotlib.pyplot as plt# 图 1 数据 x np.arange(12).astype(np.float32) 1 y1 np.log(x) y2 1 / x y3 np.sin(x) # 图 2 数据 a np.random.randn(200…

光威神策PRO PCIe 5.0 SSD发布,国产固态硬盘进入10G俱乐部

全球半导体供应链的紧张局势和闪存资源的短缺让许多行业都面临着不小的压力 &#xff0c; 连带的也让消费者难以获取物美价廉的闪存产品 。但是&#xff0c;总有一些企业能够逆流而上&#xff0c; 像是 光威科技这家国产存储品牌&#xff0c; 最近就给国内消费者 带来了一个惊喜…

递归、搜索与回溯算法:⼆叉树中的深搜

⼆叉树中的深搜 深度优先遍历&#xff08;DFS&#xff0c;全称为 Depth First Traversal&#xff09;&#xff0c;是我们树或者图这样的数据结构中常⽤的 ⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分⽀&#xff0c;直到⼀条路径上的所有节点都被遍历 完毕&#xff…

工业数据采集平台:从起源到崛起的辉煌历程

关键词&#xff1a;工业数据采集平台, 工业数据采集, 工业数据采集分析,智能化 在当今数字化的时代&#xff0c;工业领域也在经历着深刻的变革。而工业数据采集平台的发展历程&#xff0c;正是这场变革中的重要篇章。 回首过去&#xff0c;工业数据采集曾是一个繁琐而复杂的过…

C++ AVL树底层实现原理

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C知识分享⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言 AVL 树 1.1 AVL树的概念 1.2 AVL树…

职场成长秘籍:如何利用团队例会提升自己

在职场中&#xff0c;团队例会是一个重要的沟通和协作平台。通过团队例会&#xff0c;我们可以了解项目进展、分享工作经验、解决问题和制定工作计划。那么&#xff0c;如何利用团队例会提升自己&#xff0c;实现职场成长呢&#xff1f;本文将为您揭晓答案。 一、积极发言&…

编程新手必看,python中循环语句学习(14)

介绍&#xff1a; Python3中的循环语句主要有两种&#xff1a;for循环和while循环。 for循环&#xff1a;用于遍历序列&#xff08;如列表、元组、字符串等&#xff09;中的元素&#xff0c;执行相应的代码块。在每次循环中&#xff0c;序列中的一个元素被赋值给一个变量&#…

暴力枚举法

虽然暴力枚举法有时候效率低&#xff0c;时间复杂度高&#xff0c;但是在面对小规模数据集的时候&#xff0c;暴力枚举法往往是很好的思维利器。 B: 01 串的熵&#xff08;5分&#xff09; 问题描述 #include <iostream> #include <cmath> #include <algorithm…

数据治理项目——深铁集团数据治理规划

目录 一、前言 二、数据治理内容与主要措施 2.1 实施背景 2.2 主要举措 2.2.1 制定数据战略目标 2.2.2 绘制数据治理蓝图 2.2.3 绘制数据治理制度 2.2.4 梳理数据资产目录 三、 应用效果 3.1 数据资产可视化管理 3.2 数据标准治理 3.3 集团大数据平台优化建设 一、…