当前位置: 首页 > 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…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...