当前位置: 首页 > news >正文

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,欢迎交流!


相关文章:

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

文章目录 前言一、FFmpeg 核心开发库二、FFmpeg 重要数据结构与 API1、简介2、FFmpeg 解码流程①、FFmpeg2.x 解码流程②、FFmpeg4.x 解码流程 3、FFMpeg 中比较重要的函数以及数据结构①、数据结构②、初始化函数③、音视频解码函数④、文件操作⑤、其他函数 三、FFmpeg 流程1…...

训练 CNN 对 CIFAR-10 数据中的图像进行分类

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …...

香港科技大学广州|智能制造学域博士招生宣讲会—天津大学专场

时间:2023年12月07日(星期四)15:30 地点:天津大学卫津路校区26楼B112 报名链接:https://www.wjx.top/vm/mmukLPC.aspx# 宣讲嘉宾: 汤凯教授 学域主任 https://facultyprofiles.hkust-gz.edu.cn/faculty-p…...

滑动窗口练习(二)— 子数组中满足max -min <= sum的个数

题目 给定一个整型数组arr&#xff0c;和一个整数num 某个arr中的子数组sub&#xff0c;如果想达标&#xff0c;必须满足&#xff1a; sub中最大值 – sub中最小值 < num&#xff0c; 返回arr中达标子数组的数量 暴力对数器 暴力对数器方法主要是用来和另一个方法互相校验正…...

用xlwings新建一个excel并同时生成多个sheet

新建一个excel并同时生成多个sheet&#xff0c;要实现如下效果&#xff1a; 一般要使用数据透视表来快速实现。 今天记录用xlwings新建一个excel并同时生成多个sheet。 import xlwings as xw # 打开excel,参数visible表示处理过程是否可视,add_book表示是否打开新的Excel程序…...

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

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

Redux在React中的使用

Redux在React中的使用 1.构建方式 采用reduxjs/toolkitreact-redux的方式 安装方式 npm install reduxjs/toolkit react-redux2.使用 ①创建目录 创建store文件夹&#xff0c;然后创建index和对应的模块&#xff0c;如上图所示 ②编写counterStore.js 文章以counterStore…...

Go 数字类型

一、数字类型 1、Golang 数据类型介绍 Go 语言中数据类型分为&#xff1a;基本数据类型和复合数据类型基本数据类型有&#xff1a; 整型、浮点型、布尔型、字符串复合数据类型有&#xff1a; 数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;、接口 2、…...

时间序列预测 — Informer实现多变量负荷预测(PyTorch)

目录 1 实验数据集 2 如何运行自己的数据集 3 报错分析 1 实验数据集 实验数据集采用数据集4&#xff1a;2016年电工数学建模竞赛负荷预测数据集&#xff08;下载链接&#xff09;&#xff0c;数据集包含日期、最高温度℃ 、最低温度℃、平均温度℃ 、相对湿度(平均) 、降雨…...

2023年金融信创行业研究报告

第一章 行业概况 1.1 定义 金融信创是指在金融行业中应用的信息技术&#xff0c;特别是那些涉及到金融IT基础设施、基础软件、应用软件和信息安全等方面的技术和产品。这一概念源于更广泛的“信创 (信息技术应用创新)”&#xff0c;即通过中国国产信息技术替换海外信息技术&a…...

51单片机按键控制LED灯亮灭的N个玩法

51单片机按键控制LED灯亮灭的N个玩法 1.概述 这篇文章介绍按键的使用&#xff0c;以及通过控制LED灯的小实验&#xff0c;发现按键中存在的问题&#xff0c;然后思考并解决这些问题。达到熟练使用按键控制元器件。 2.搭建硬件环境 1.硬件准备 名称型号数量单片机STC12C205…...

推荐6款本周 yyds 的开源项目

&#x1f525;&#x1f525;&#x1f525;本周GitHub项目圈选: 主要包含 链接管理、视频总结、有道音色情感合成、中文文本格式校正、GPT爬虫、深度学习推理 等热点项目。 1、Dub 一个开源的链接管理工具&#xff0c;可自定义域名将繁杂的长链接生成短链接&#xff0c;便于保…...

【Git】git 更换远程仓库地址三种方法总结分享

因为公司更改了 gitlab 的网段地址&#xff0c;发现全部项目都需要重新更改远程仓库的地址了&#xff0c;所以做了个记录&#xff0c;说不定以后还会用到呢。 一、不删除远程仓库修改&#xff08;最方便&#xff09; # 查看远端地址 git remote -v # 查看远端仓库名 git rem…...

springboot 返回problem+json

spring所有配置都在WebMvcAutoConfiguration中 其中有 ProblemDetailsExceptionHandler 容器中的一个组件 -ControllerAdvice用来集中处理异常的 -点进ResponseEntityExceptionHandler 包含这些异常&#xff0c;如果出现以下异常&#xff0c;会被springboot支持以RFC 7807规…...

AI动画制作 StableDiffusion

1.brew -v 2.安装爬虫项目包所必需的python和git等系列系统支持部件 brew install cmake protobuf rust python@3.10 git wget pod --version brew link --overwrite cocoapods 3.从github网站克隆stable-diffusion-webui爬虫项目包至本地 ssh-add /Users/haijunyan/.ssh/id_r…...

【开源】基于Vue和SpringBoot的木马文件检测系统

项目编号&#xff1a; S 041 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S041&#xff0c;文末获取源码。} 项目编号&#xff1a;S041&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木…...

5 动态规划解分割等和子串

来源&#xff1a;LeetCode第416题 难度&#xff1a;中等 描述&#xff1a;给你一个只包含正整数的非空数组nums,请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等 分析&#xff1a;相当于从nums数组中选取一些元素&#xff0c;使得他们的和为…...

file_get_contents() 函数详解与使用

概述 在PHP中&#xff0c;file_get_contents() 函数是一个强大的工具&#xff0c;它既可以用于读取本地文件的内容&#xff0c;也可以用于发起 HTTP 请求获取远程资源。本文将详细介绍 file_get_contents() 函数的两种主要用途&#xff0c;并探讨如何充分利用这个函数。 1. 文…...

某医生用 ChatGPT 在 4 个月内狂写 16 篇论文,其中 5 篇已发表,揭密ChatGPT进行论文润色与改写的秘籍

如果写过学术论文&#xff0c;想必会有这样的感受&#xff1a; 绞尽脑汁、茶饭不思、夜不能寐、废寝忘食、夜以继日&#xff0c;赶出一篇论文&#xff0c;然后还被导师点评&#xff0c;“写得就是一坨&#xff01;” 可是&#xff0c;却有人4个月产出了16篇论文&#xff0c;成功…...

进程等待讲解

今日为大家分享有关进程等待的知识&#xff01;希望读完本文&#xff0c;大家能有一定的收获&#xff01; 正文开始&#xff01; 进程等待的引进 既然我们今天要讲进程等待这个概念&#xff01;那么只有我们把下面这三个方面搞明白&#xff0c;才能真正的了解进程等待&#x…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...