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

从到的木马免杀之旅(过卡巴)

开发个什么Skill呢&#xff1f; 通过 Skill&#xff0c;我们可以将某些能力进行模块化封装&#xff0c;从而实现特定的工作流编排、专家领域知识沉淀以及各类工具的集成。 这里我打算来一次“套娃式”的实践&#xff1a;创建一个用于自动生成 Skill 的 Skill&#xff0c;一是用…...

从工厂老师傅到代码新手:我用VisionPro+C#给老旧视觉检测设备做了个“智能升级”

从工厂老师傅到代码新手&#xff1a;我用VisionProC#给老旧视觉检测设备做了个“智能升级” 在工业自动化车间里&#xff0c;那些服役多年的视觉检测设备就像经验丰富的老师傅——它们可能外壳陈旧、操作界面简陋&#xff0c;但核心算法依然精准可靠。我作为设备维护工程师&…...

DeepSeek-R1蒸馏模型入门:1.5B版本本地部署完整教程

DeepSeek-R1蒸馏模型入门&#xff1a;1.5B版本本地部署完整教程 1. 引言 1.1 为什么选择DeepSeek-R1 1.5B版本 DeepSeek-R1 1.5B版本是专为本地CPU环境优化的轻量级推理模型&#xff0c;它通过知识蒸馏技术保留了原版70B参数模型的核心推理能力&#xff0c;同时将参数量压缩…...

OpenClaw+Phi-3-vision低成本自动化:自部署多模态模型替代云服务

OpenClawPhi-3-vision低成本自动化&#xff1a;自部署多模态模型替代云服务 1. 为什么选择本地多模态模型 去年我接手了一个自动化内容处理的项目&#xff0c;需要频繁调用多模态API分析图片和文档。当看到第三个月的账单时&#xff0c;我意识到必须寻找替代方案——云服务按…...

SEO_如何通过内容SEO有效获取精准流量?

如何通过内容SEO有效获取精准流量&#xff1f; 在互联网时代&#xff0c;获取精准流量是每个网站和博客主人的首要目标之一。通过内容SEO&#xff0c;我们可以有效地提高网站在搜索引擎上的排名&#xff0c;吸引更多的访客。如何通过内容SEO有效获取精准流量呢&#xff1f;本文…...

OpenClaw二次开发:为Qwen3.5-9B增加区域截图分析

OpenClaw二次开发&#xff1a;为Qwen3.5-9B增加区域截图分析 1. 为什么需要区域截图分析功能 上周我需要处理一个重复性工作——每天从几十张监控截图中提取特定区域的文字信息。现有的全屏截图大模型分析方案存在三个明显痛点&#xff1a; 无效信息干扰&#xff1a;全屏截图…...

MMC整流器平均值模型simulink仿真,19电平,采用交流电流内环,直流电压外环控制,双二...

MMC整流器平均值模型simulink仿真&#xff0c;19电平&#xff0c;采用交流电流内环&#xff0c;直流电压外环控制&#xff0c;双二阶广义积分器锁相环&#xff0c;PI解耦环流抑制器&#xff0c;调制方式为最近电平逼近调制&#xff0c;完美运行。 波形一二为直流侧电压电流&…...

模拟函数memmove

#include <stdio.h>//怎么实现是从前往后拷贝&#xff0c;还是从后往前拷贝 #include <assert.h>//拷贝函数&#xff0c;核心是可以处理内存重叠的情况 //定义 void *my_memmove(void *dest,const void *source,size_t n) {//准备工作 // assert(dest ! NULL); // …...

告别“黑盒”:用Grad-CAM可视化Attention机制,看HSI分类模型到底关注了啥

深度解析高光谱分类中的注意力机制&#xff1a;从理论到可视化实践 当我们面对一张高光谱图像时&#xff0c;人类视觉系统会本能地聚焦于最显著的特征——可能是植被的健康状况、水体的污染程度&#xff0c;或是建筑物的材质差异。但当我们训练一个深度学习模型来完成同样的分类…...

嵌入式开发自动化实践与效率提升

1. 嵌入式开发中的重复工作困境作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我深知这个行业的痛点——那些看似简单却消耗大量精力的重复性工作。从版本构建到代码移植&#xff0c;从环境配置到测试验证&#xff0c;这些工作就像影子一样伴随着每个开发者的日常。刚入…...