FFmepg 核心开发库及重要数据结构与API

文章目录

  • 前言
  • 一、FFmpeg 核心开发库
  • 二、FFmpeg 重要数据结构与 API
    • 1、简介
    • 2、FFmpeg 解码流程
      • ①、FFmpeg2.x 解码流程
      • ②、FFmpeg4.x 解码流程
    • 3、FFMpeg 中比较重要的函数以及数据结构
      • ①、数据结构
      • ②、初始化函数
      • ③、音视频解码函数
      • ④、文件操作
      • ⑤、其他函数
  • 三、FFmpeg 流程
    • 1、FFmpeg 主要框架
    • 2、文件处理基本流程(转码流程)
      • ①、解复用(Demux)
      • ②、解码(Decode)


前言

本文介绍 FFmpeg 骨架:“八大金刚” 核心开发库,重要数据结构与 API
在这里插入图片描述


一、FFmpeg 核心开发库

  • libavformat(重要)
    • avformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含 demuxers 和 muxer 库;
  • libavcodec(重要)
    • avcodec:用于各种类型声音/图像编解码
  • libavutil
    • avutil:包含一些公共的工具函数;
  • libswscale(重要)
    • swscale:用于视频场景比例缩放、 色彩映射转换;
  • libpostproc
    • postproc:用于后期效果处理;
  • libavdevice
    • avdevice:和多媒体设备交互的类库,使用这个库可以读取电脑(或者其他设备上)的多媒体设备的数据,或者输出数据到指定的多媒体设备上;
  • libswresmaple(重要)
    • swresample :主要包括高度优化的音频重采样、rematrixing 和样本格式转换操作;
  • libavfilter
    • avfilter: 过滤器(Filter),在多媒体处理中,filter 的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具;

二、FFmpeg 重要数据结构与 API

1、简介

FFmpeg 中结构体很多,其中下图所涉及的结构体需要熟记:
在这里插入图片描述
上图后者是前者的数据成员,Format Layer 除了 AVInputFormat 外还有一个 AVOutputFormat

AVFormatContext 是一个贯穿始终的数据结构,很多函数都用到它作为参数,是输入输出相关信息的一个容器。

最关键的结构体可以分为以下几类:

  • 解协议(http,rtsp,rtmp,mms,hls,file,tcp,udp,…)
    • AVIOContextURLContextURLProtocol 主要存储视音频使用的协议的类型以及状态。URLProtocol 存储输入视音频使用的封装格式。每种协议都对应一个 URLProtocol 结构。(注意:FFMPEG 中文件也被当做一种协议“file” )
  • 解封装(flv,avi,rmvb,mp4)
    • AVFormatContext 主要存储视音频封装格式中包含的信息;AVInputFormat 存储输入音视频使用的封装格式。 每种视音频封装格式都对应一个 AVInputFormat 结构。
    • AVInputFormatAVOutputFormat,同一时间只能存在一个。当播放视频时 AVInputFormat 生效,录制视频时则 AVOutputFormat 生效;
  • 解码
    • AVStream 是继 AVFormatContext 之后第二个贯穿始终的数据结构,它保存于数据流相关的编解码器、数据段等信息,还包含“流” 这个概念中的一些信息;
    • 每个 AVStream 存储一个视频/音频流的相关数据;
    • 每个AVStream 对应一个 AVCodecContext,存储该视频/音频流使用解码方式的相关数据;
    • 每个 AVCodecContext 中对应一个 AVCodec,包含该视频/音频对应的解码器;
    • 每种解码器都对应一个 AVCodec 结构。AVCodec 记录了所要使用的 Codec 的信息并有 5 个函数: init, encoder, close, decode, flush 来完成编解码工作。
  • 存数据
    • 视频的话,每个结构一般是存一帧;音频可能有好几帧 ;
    • 解码前数据:AVPacket
    • 解码后数据:AVFrame

2、FFmpeg 解码流程

①、FFmpeg2.x 解码流程

在这里插入图片描述

  • av_register_all(); //注册所有文件格式和编解码库
  • avformat_network_init(); //打开网络视频流
  • av_open_input_file(); //读取文件头部把信息保存到 AVFormatContext 结构体
  • av_find_stream_info(); //为 pFormatCtx->streams 填充上正确的信息
  • CODEC_TYPE_VIDEO; //通过判断得到视频流类型
  • avcodec_find_decoder(); //查找解码器
  • avcodec_open(); //打开编解码器
  • avcodec_alloc_frame(); //分配空间保存帧数据
  • av_read_frame(); //不断从流中提取帧数据
  • avcodec_decode_video(); //解码视频流
  • avcodec_close(); //关闭解码器
  • avformat_close_input_file(); //关闭输入文件

②、FFmpeg4.x 解码流程

在这里插入图片描述

3、FFMpeg 中比较重要的函数以及数据结构

①、数据结构

  • AVFormatContext
  • AVOutputFormat
  • AVInputFormat
  • AVCodecContext
  • AVCodec
  • AVFrame
  • AVPacket
  • AVPicture
  • AVStream

②、初始化函数

  • av_register_all()
  • avcodec_open()
  • avcodec_close()
  • av_open_input_file()
  • av_find_input_format()
  • av_find_stream_info()
  • av_close_input_file()

③、音视频解码函数

  • avcodec_find_decoder()
  • avcodec_alloc_frame()
  • avpicture_get_size()
  • avpicture_fill()
  • img_convert()
  • avcodec_alloc_context()
  • avcodec_decode_video()
  • av_free_packet()
  • av_free()

④、文件操作

  • avnew_steam()
  • av_read_frame()
  • av_write_frame()
  • dump_format()

⑤、其他函数

  • avpicture_deinterlace()
  • ImgReSampleContext()

三、FFmpeg 流程

1、FFmpeg 主要框架

在这里插入图片描述

2、文件处理基本流程(转码流程)

在这里插入图片描述

  • demuxer:解复用;即将音视频分离出来,上图中的视频流是 AVC(H264)格式,音频流是 AAC 格式;
  • decoder:解码器;
  • filter: 帧处理,这里将原始 19201080 转换为 1280720;
  • encoder:编码器,这里是 H265 的视频格式;
  • muxer:复用,将音频和视频进行重新封装。

ffmpeg 对一个媒体文件进行解码的主要流程是:
在这里插入图片描述

解码流程图

①、解复用(Demux)

视频文件的音频和视频都是分开进行压缩的,因为音频和视频的压缩算法不一样,所以解码也不一样,所以需要对音频和视频分别进行解码。虽然音频和视频是分别进行压缩的,但是为了传输过程的方便,降压所过的音频和视频捆绑在一起进行传输。所以解复用这一步就是将文件中捆绑的音频流和视频流分开来以方便后面分别对它们进行解码。
在这里插入图片描述

②、解码(Decode)

一个音视频文件肯定是经过某种格式压缩的(h264、h265 等),也就是通常所说的音视频编码,编码是为了减少数据量,否则的话对于音视频数据的存储和网络传输将是很难完成的,所以我们必须对音视频文件进行尽可能的压缩。
在这里插入图片描述


我的qq:2442391036,欢迎交流!


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

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

相关文章

【学习笔记】插值之拉格朗日插值(Lagrange)

0 插值介绍 插值法是广泛应用于理论研究和工程实际的重要数值方法。用提供的部分离散的函数值来进行理论分析和设计都是极不方便的,因此希望能够用一个既能反映原函数特征,又便于计算的简单函数去近似原函数。 1 低次拉格朗日插值 定理:设…

福利来了| 200多款精选简历模板免费领,让你30秒内征服HR!

找工作是不是让你很头大?尤其是写简历,真的好痛苦啊!我在网上找了好久,都没有找到合适的简历模板,自己做又不知道从哪里下手。 不过现在好了,有一个超级福利送给大家!200多款精选简历模板免费领…

codeformer,是如何对数据进行降级处理的?是如何模糊人脸图像的?

答案&#xff1a;https://github.com/sczhou/CodeFormer/blob/8392d0334956108ab53d9439c4b9fc9c4af0d66d/basicsr/data/ffhq_blind_dataset.py#L90 运动模糊&#xff1a; # motion blurif self.use_motion_kernel and random.random() < self.motion_kernel_prob:m_i ran…

使用HTML+CSS+JS网页设计与制作,酷炫动效科技农业网页

使用HTMLCSSJS网页设计与制作&#xff0c;酷炫动效科技农业网页。 可以用于家乡介绍、科技农业、图片画廊展示等个人网站的设计与制作。农业网站、家乡网站、农产品网站、旅游网站。 网站亮点 1、视觉设计&#xff1a;排版布局极简设计&#xff0c;优质的视觉体验等。 2、动…

手摸手Element-ui路由VueRoute

后端WebAPI准备 https://router.vuejs.org/zh/guide/ https://v3.router.vuejs.org/zh/installation.html <template><el-table:data"tableData"style"width: 100%":row-class-name"tableRowClassName"><!-- <el-table-colum…

【华为OD】统一考试B\C卷真题:100%通过: 分班 C/C++源码实现

目录 题目描述&#xff1a; 示例1 C源码实现&#xff1a; 题目描述&#xff1a; 幼儿园两个班的小朋友在排队时混在了一起&#xff0c;每位小朋友都知道自己是否与前面一位小朋友是否同班&#xff0c;请你帮忙把同班的小朋友找出来。 小朋友的编号为整数&#xff0c;与前一…

3-全功能pytest测试框架-allure2

3-全功能pytest测试框架-allure2 一:Allure介绍1> Allure 优势2> Allure 安装二:allure demo1> 脚本demo2> 查看result三:allure装饰器1> 装饰器一览表2> 装饰器概述1. epic、feature、story3> @allure.title()4> @allure.testcase()5> @allure.…

【linux挂载windows,密码含特殊字符,使用证书方式挂载】

1、设置Windows端共享文件目录 暂定设置共享目录为为&#xff1a;D:\shared 2、Linux客户端挂载 安装samba服务 查看是否安装&#xff1a;rpm -qa | grep samba samba4-libs-4.0.0-58.el6.rc4.x86_64 samba4-4.0.0-58.el6.rc4.x86_64 samba4-client-4.0.0-58.el6.rc4.x86_64 s…

Vue框架学习笔记——侦听(监视)属性watch:天气案例+immediate+deep深度监听

文章目录 前文提要天气案例描述样例代码呈现效果&#xff1a;事件的响应中可以写一些简单的语句&#xff08;不推荐&#xff09; 侦听&#xff08;监视&#xff09;属性watch结合天气案例的第一种写法&#xff08;New Vue&#xff09;immediate&#xff1a; 侦听&#xff08;监…

为什么要用 Redis 而不用 map/guava 做缓存? Redis为什么这么快 Redis有哪些数据类型 Redis的应用场景

文章目录 为什么要用 Redis 而不用 map/guava 做缓存?Redis为什么这么快Redis有哪些数据类型Redis的应用场景总结一计数器缓存会话缓存全页缓存&#xff08;FPC&#xff09;查找表消息队列(发布/订阅功能)分布式锁实现 总结二 简单的聊聊Redis常见的一些疑问点&#xff1a;具体…

Spring Security 6.1.x 系列(5)—— Servlet 认证体系结构介绍

一、前言 本章主要学习Spring Security中基于Servlet 的认证体系结构&#xff0c;为后续认证执行流程源码分析打好基础。 二、身份认证机制 Spring Security提供个多种认证方式登录系统&#xff0c;包括&#xff1a; Username and Password&#xff1a;使用用户名/密码 方式…

MATLAB中FFT频谱分析使用详解

文章目录 语法说明语法一&#xff1a;Y fft(X)fft(X)返回X长度的傅里叶变换 语法二&#xff1a;Y fft(X,N)如果 X的长度小于 N&#xff0c;则为 X补上尾零以达到长度 N(FFT插值)双边谱转换为单边谱 如果 X 的长度大于 N&#xff0c;则对 X 进行截断以达到长度 N。 语法三&…

Postman如何使用(四):接口测试

一.接口 1.程序内部接口&#xff1a;方法与方法之间&#xff0c;模块与模块之间的交互&#xff0c;程序内部抛出的接口&#xff0c;比如bbs系统&#xff0c;有登录模块&#xff0c;发帖模块等等&#xff0c;那你要发帖就必须先登录&#xff0c;那么这两个模块就得有交互&#…

Nginx(九) aio sendfile directio 组合使用测试(2)

测试7&#xff1a;开启directio2m、sendfile&#xff0c;关闭aio&#xff0c;请求/vendor.js {"time_iso8601":"2023-11-26T22:47:3508:00","request_uri":"/vendor.js","status":"200","bytes_sent":…

什么是数据增强,为什么会让模型更健壮?

在做一些图像分类训练任务时&#xff0c;我们经常会遇到一个很尴尬的情况&#xff0c;那就是&#xff1a; 明明训练数据集中有很多可爱猫咪的照片&#xff0c;但是当我们给训练好的模型输入一张戴着头盔的猫咪进行测试时&#xff0c;模型就不认识了&#xff0c;或者说识别精度…

Makefile讲解

CC g CFLAGS -stdc11 -Wall -pthread LDFLAGS SRCS ../main.cpp socketCan_FW_Download.cpp OBJS $(SRCS:.cpp.o)acandev: $(OBJS)$(CC) $(CFLAGS) $(OBJS) -o acandev $(LDFLAGS)%.o: %.cpp$(CC) $(CFLAGS) -c $< -o $clean:rm -f $(OBJS) acandev解释下上面Makefile中…

栈和队列OJ题目——C语言

目录 LeetCode 20、有效的括号 题目描述&#xff1a; 思路解析&#xff1a; 解题代码&#xff1a; 通过代码&#xff1a; LeetCode 225、用队列实现栈 题目描述&#xff1a; 思路解析&#xff1a; 解题代码&#xff1a; 通过代码&#xff1a; LeetCode 232、用栈…

Harmony入门-HelloWorld

HarmonyOS 已经出来一些时间了。也有了OpenHarmony&#xff0c;作为HarmonyOS抽离的基础架构OpenHarmony&#xff0c;贡献给开源了&#xff0c;后续独立出来&#xff0c;那可真是就要独立生态啦&#xff0c;咱们顺水行舟&#xff0c;学习学习。 1.IDE 安装 https://hmxt.org/d…

MySQL学习day03

一、SQL图形化界面工具 常用比较常用的图形化界面有sqlyog、mavicat、datagrip datagrip工具使用相当方便&#xff0c;功能比前面两种都要强大。 DataGrip工具的安装和使用请查看这篇文档&#xff1a;DataGrip 安装教程 DML-介绍 DML全称是Data Manipulation Language(数据…

Ubuntu22.04下打包发布Qt5.15应用程序的方法

Qt应用编译时选择release方式编译 目的:debug方式编译依赖的文件会多一些,同时文件大小还会很大。 Notice: 所有操作都是在当前用户下,如果是root账户,需要注意加上sudo,否则会因为权限问题提取依赖文件失败。 准备 在Ubuntu当前用户目录下创建一个目录gary@gary-host:…