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

news/2024/7/10 20:17:16 标签: ffmpeg, 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 的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具;

API_29">二、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.niftyadmin.cn/n/5220115.html

相关文章

AIGC系列之:Variational Auto Encoder-VAE模块

目录 1.VAE 概述 2.概率分布 3.损失函数 4.重参数技巧 5.维度对 VAE 的影响 6.损失函数对VAE的影响 7.总结 VAE原始https://arxiv.org/abs/1312.6114 论文解读:https://mp.weixin.qq.com/MzI1MjQ2O 1.VAE 概述 变分自动编码器(Variational auto…

Mybatis反射工厂类DefaultReflectorFactory

DefaultReflectorFactory是反射工厂接口ReflectorFactory的默认实现,其主要是实现了对反射对象Reflector的创建和缓存。 有三个方法: // 判断是否开启缓存boolean isClassCacheEnabled();// 设置是否缓存void setClassCacheEnabled(boolean classCacheEn…

诺威信,浪潮云,微众区块链

目录 诺威信B隐私计算平台 浪潮云=星火连-澳优码 HyperChain 产品介绍 CA认证即电子认证服务

pytorch实现遥感建筑物提取

如何自动地从高分辨率遥感影像中提取建筑物等人工目标是高分辨率遥感影像处理与理解领域的一个热点与难点问题。本篇文章我们将学习如何使用pytorch实现遥感建筑物的智能提取。 智能提取的流程 基于深度学习的遥感建筑物智能提取,首先需要制作数据集,然后…

知虾数据分析软件:解密Shopee大数据,助力科学运营

在电商领域,市场竞争激烈,如何准确洞察市场动态、优化选品策略、了解竞争对手的运营情况成为了每个卖家迫切需要解决的问题。而知虾数据分析软件作为Shopee大数据采集及分析平台,以其强大的功能和精准的数据分析能力,为卖家们提供…

tabs切换,当点击tabItem时候,改变选中样式,以及content内容区域

效果图展示&#xff1a; html原生代码&#xff1a; <div><div class"buttons-row nav-select riskType" style"padding: 10px;"><div class"shoucang-title-box flex-start"><div class"shoucang-title-item active&q…

云平台系列:What is Serverless (FaaS、BaaS)

文章目录 前言IaaS 与 PaaS 和SaaSIaaS&#xff08;基础设施即服务&#xff09;PaaS&#xff08;平台即服务&#xff09;SaaS&#xff08;软件即服务&#xff09;聊聊 IaaS What is Serverless?FaaS&#xff08;函数即服务&#xff09;执行适应场景 BaaS&#xff08;后端即服务…

格雷希尔针对J2044燃油管测试专用快速接头都有哪些及各自的应用场合

J2044燃油管是汽车燃油系统中常见的管口&#xff0c;如&#xff1a;燃油泵、燃油滤清器、喷油嘴等部件中都有这样的管口&#xff0c;为了保证燃油系统的正常运行&#xff0c;这些零部件在出厂前就需要对其进行多种测试&#xff0c;在测试前需要对J2044燃油管管口进行密封用于连…