FFmpeg 的常用API

news2024/12/26 18:26:37

FFmpeg 的常用API

附录:FFmpeg库介绍

介绍
libavcodec音视频编解码核心库
编码 (avcodec_send_frame, avcodec_receive_packet)。
解码 (avcodec_send_packet, avcodec_receive_frame)。
libavformat提供了音视频流的解析和封装功能,多种多媒体封装格式(如 MP4、MKV、FLV、TS、AVI 等)。
分配和初始化上下文 (avformat_alloc_context, avformat_alloc_output_context2)。
解析媒体流 (avformat_open_input)。
写入媒体流 (avformat_write_header, av_write_frame, av_write_trailer)。
libavutil提供多种辅助工具。
libswscale处理图像的缩放和色彩格式转换。像素格式转换(从 RGB 转换为 YUV420)。图像的尺寸缩放(如调整视频分辨率)。
转换像素格式 (sws_scale)。
分配和初始化上下文 (sws_getContext)。
libswresample处理音频的重采样和格式转换
初始化重采样上下文 (swr_alloc_set_opts, swr_init)。
音频格式转换 (swr_convert)。
libavdevice处理设备输入输出。
提供多媒体输入设备的支持(如摄像头、麦克风)。
libpostproc提供视频后处理功能。
主要用于视频质量增强(如去块效应、降噪处理)。配合视频解码器使用,改善解码后的视频质量。

附录1:参考文献

ffmpeg视频编解码流程:https://www.cnblogs.com/fxw1/p/17229792.html

常用API:https://www.cnblogs.com/linuxAndMcu/p/12041359.html

FFmpeg各版本区别:https://juejin.cn/post/7261245655128424509

附录2:编解码流程图

新版本ffmpeg4.0:

image-20241226094141999

老版本ffmpeg3.0:

img

一、通用API

1.1 av_register_all()

初始化 libavformat 和注册所有的复用器muxer、解复用器demuxer和协议。(ffmpeg4.0已正式废弃)

void av_register_all(void);

1.2 avcodec_find_encoderavcodec_find_decoder

查找具有匹配编解码器ID的已注册编/解码器,位于 libavcodec\avcodec.h

// 函数的参数是一个编码器的ID,返回查找到的编码器(没有找到就返回NULL)。
AVCodec *avcodec_find_encoder(enum AVCodecID id);

// 函数的参数是一个解码器的ID,返回查找到的解码器(没有找到就返回NULL)。
AVCodec *avcodec_find_decoder(enum AVCodecID id);

1.3 avcodec_open2()

**初始化一个视音频编解码器的 AVCodecContext以使用给定的AVCodec。**声明位于 libavcodec\utils.c

int avcodec_open2(AVCodecContext *avctx, 
                  const AVCodec *codec, 
                  AVDictionary **options);
  • avctx:需要初始化的 AVCodecContext。
  • codec:输入的AVCodec。
  • options:一些选项。例如使用libx264编码的时候,“preset”,“tune”等都可以通过该参数设置。

1.4 avcodec_close()

关闭给定的avcodeContext并释放与之关联的所有数据,声明位于 libavcodec\utils.c

int avcodec_close(AVCodecContext *avctx);

二、解码相关API

2.1 avformat_open_input()

打开输入流和读取头信息,流必须使用avformat_close_input()关闭

int avformat_open_input(AVFormatContext **ps,
                        const char *url,
                        AVInputFormat *fmt, 
                        AVDictionary **options);
  • ps:用户提供的AVFormatContext(由avformat_alloc_context分配)的指针。
  • url:打开的视音频流的 URL。
  • fmt:如果!=NULL,则此参数强制使用特定的输入格式。否则将自动检测格式。
  • options:包含AVFormatContext和demuxer私有选项的字典;一般情况下可以设置为 NULL。

2.2 avformat_find_stream_info()

**读取检查媒体文件的数据包以获取具体的流信息,**如媒体存入的编码格式。

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)  
  • ic:媒体文件的上下文
  • options:字典,配置选项

2.3 av_read_frame

读取码流中的音频若干帧或者视频一帧

例如,解码视频的时候,每解码一个视频帧,需要先调用 av_read_frame() 获得一帧视频的压缩数据,然后才能对该数据进行解码。

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

2.4 avformat_close_input()

对应2.1;关闭打开的流。并释放AVFormatContext的所有内容并将*s设置为空

void avformat_close_input(AVFormatContext **s)  

三、编码相关API

3.1 avformat_alloc_output_context2

用于分配并初始化一个输出媒体格式的上下文 (AVFormatContext) (通常是第一个调用的函数)

int avformat_alloc_output_context2(AVFormatContext **ctx, 
                                   AVOutputFormat *oformat, 
                                   const char *format_name, 
                                   const char *filename);
  • ctx:指向输出上下文指针的指针,用于存储分配的 AVFormatContext

  • oformat:指定输出格式(AVOutputFormat),可以为 NULL。如果为 NULL,则根据 format_namefilename 自动推断格式。

  • format_name:指定输出格式的名称(如 "mp4""mkv" 等),用于明确输出文件的封装格式。可以为 NULL

  • filename:输出文件的名称。此参数会用于推断格式(如果 oformatformat_name 都为 NULL)。

3.2 avformat_write_header()

为输出文件写入文件头,准备文件封装格式所需的元数据。

int avformat_write_header(AVFormatContext *s, AVDictionary **options);
  • s (AVFormatContext):指向输出上下文 (AVFormatContext) 的指针,必须是用 avformat_alloc_output_context2 创建的,并且已经设置好音视频流 (AVStream)。

  • options (AVDictionary**):用于传递格式化选项的字典指针,可以为 NULL

    • 设置编码参数(如比特率 bit_rate)。

    • 设置容器格式选项(如 movflags)。

    • 需要在调用完成后手动释放(通过 av_dict_free)。

3.3 av_write_frame()

用于将单个媒体包(AVPacket)写入输出文件。它是音视频数据封装的重要步骤,直接处理编解码后的数据帧。

int av_write_frame(AVFormatContext *s, AVPacket *pkt)

s (AVFormatContext*)
指向输出上下文的指针,通常由 avformat_alloc_output_context2 创建并初始化。

pkt (AVPacket*)
包含需要写入的媒体数据的包(AVPacket)。它应该包含目标流的索引 (stream_index)、解码后的时间戳(PTS/DTS)、以及数据缓冲区。

3.4 av_write_trailer()

用于输出文件尾

int av_write_trailer(AVFormatContext *s)

四、图像处理API

4.1 sws_getContext()

用于初始化一个缩放上下文 (SwsContext),以便进行视频像素格式的转换或尺寸缩放

struct SwsContext *sws_getContext(
    int srcW, int srcH, enum AVPixelFormat srcFormat,
    int dstW, int dstH, enum AVPixelFormat dstFormat,
    int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param
);
  • srcWsrcH:输入图像的宽度和高度。srcFormat:输入图像的像素格式(AVPixelFormat 枚举值,例如 AV_PIX_FMT_YUV420P)。

  • dstWdstH:输出图像的宽度和高度。dstFormat:输出图像的像素格式(例如 AV_PIX_FMT_RGB24)。

  • flags:用于控制缩放的算法。可以是以下值之一或它们的组合:

    • SWS_FAST_BILINEAR:快速双线性缩放。

    • SWS_BILINEAR:双线性缩放。

    • SWS_BICUBIC:双三次插值缩放(质量高)。

    • SWS_LANCZOS:Lanczos重采样(质量最高)。

  • srcFilterdstFilter:分别为输入和输出图像使用的滤波器。通常为 NULL

  • param:滤波器相关参数,通常为 NULL

4.2 sws_scale()

libswscale 库中的关键函数,用于在图像转换和缩放过程中执行实际的像素格式转换和尺寸调整操作。它在 sws_getContext 初始化的上下文中完成图像数据处理

int sws_scale(struct SwsContext *c,
                                  const uint8_t * const srcSlice[],
                                  const int srcStride[], int srcSliceY,
                                  int srcSliceH, uint8_t *const dst[],
                                  const int dstStride[]) )

c (struct SwsContext):指向由 sws_getContext 返回的上下文结构体,定义了转换和缩放的参数。

srcSlice (const uint8_t *const[]):输入图像的每个平面的指针数组(通常是 AVFrame->data)。

srcStride (const int[]):输入图像每行的字节数数组,对应每个数据平面(通常是 AVFrame->linesize)。

srcSliceY (int):输入图像处理的起始行号,通常为 0。

srcSliceH (int):输入图像处理的行数(高度),例如 AVFrame->height

dst (uint8_t *const[]):输出图像的每个平面的指针数组,存储转换后的数据。

dstStride (const int[]):输出图像每行的字节数数组,对应每个数据平面。

4.3 sws_freeContext()

释放一个 SwsContext

void sws_freeContext(struct SwsContext *swsContext)

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

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

相关文章

trap命令

信号 linux信号是由一个整数构成的异步消息,可以由某个进程发给其他的进程,也可以在用户按下特定键发生某种异常事件时,由系统发给某个进程 信号列表 kill -l trap -l 在使用信号名时,需要省略SIG前缀 trap trap命令用于指定…

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】

🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

Llama 3 模型系列解析(一)

目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练(Over-training) 3. 计算训练预算 4. 如何逐步估算和确定最优模型? 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…

【多时段】含sop的配电网重构【含分布式电源】【已更新视频讲解】

1 主要内容 之前分享了很多配电网重构的程序,每个程序针对场景限定性比较大,程序初学者修改起来难度较大,本次分享一个基础程序,针对含sop的配电网重构模型,含风电和光伏,优化了33节点网络电压合理性&…

使用 Elastic AI Assistant 简化威胁情报报告

作者:来自 Tommy Bumford 了解 SRE 不断扩展的角色以及所需的新技能:成本管理和 AI。 通过 AI 驱动的报告为分析师提供支持 在不断发展的网络安全领域,威胁分析师不断被新的威胁情报 (threat intelligence - TI) 数据淹没。挑战不仅在于理解…

64.基于SpringBoot + Vue实现的前后端分离-新闻资讯系统(项目 + 论文)

项目介绍 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,文章信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

word无法创建工作文件,检查临时环境变量。

word无法创建工作文件,检查临时环境变量。 word preview版本,关联打开文件出现报错。word无法创建工作文件,检查临时环境变量。 打开注册表,删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …

人工智能ACA(七)——计算机视觉基础

一、自然语言处理基本介绍 1. 自然语言处理的定义 1-1 自然语言 人类使用的在社会生活中自然形成的语言 1-2 自然语言处理 目标是让计算机能够理解、解析、生成和处理人类的自然语言 包含自然语言理解和自然语言生成两部分组成 2. 自然语言处理的发展趋势 3.自然语言处理…

(带源码)宠物主题商场系统 计算机项目 P10083

项目说明 本号所发布的项目均由我部署运行验证,可保证项目系统正常运行,以及提供完整源码。 如需要远程部署/定制/讲解系统,可以联系我。定制项目未经同意不会上传! 项目源码获取方式放在文章末尾处 注:项目仅供学…

编程考古-传奇的开始Delphi(中)

发布会 这是 Delphi 发布的邀请: 许多曾经风靡一时的开发工具已逐渐淡出人们的视野,被历史的洪流所淹没。然而,Delphi不仅没有被遗忘,反而持续保持着其独特的魅力和广泛的用户基础。这不仅彰显了Delphi在快速变化的技术领域中的持…

山景BP1048增加AT指令,实现单片机串口控制播放音乐(一)

1、设计目的 山景提供的SDK是蓝牙音箱demo,用户使用ADC按键或者IR遥控器,进行人机交互。然而现实很多场景,需要和单片机通信,不管是ADC按键或者IR接口都不适合和单片机通信。这里设计个AT指令用来和BP1048通信。AT指令如下图所示…

IntelliJ IDEA Docker集成

一、概述 Docker是一种用于在隔离和可复制环境中部署和运行可执行文件的工具。这可能很有用,例如,在与生产相同的环境中测试代码。 IntelliJ IDEA集成了Docker功能,并为创建Docker映像、运行Docker容器、管理Docker Compose应用程序、使用公…

43. Three.js案例-绘制100个立方体

43. Three.js案例-绘制100个立方体 实现效果 知识点 WebGLRenderer(WebGL渲染器) WebGLRenderer是Three.js中最常用的渲染器之一,用于将3D场景渲染到网页上。 构造器 WebGLRenderer(parameters : Object) 参数类型描述parametersObject…

Linux------进程处理(system库函数)

视频&#xff1a; 【尚硅谷嵌入式Linux应用层开发&#xff0c;linux网络编程&#xff0c;linux进程线程&#xff0c;linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p34&vd_source342079de7c07f82982956aad8662b467 #include <stdlib.h> #include <…

自然语言处理与知识图谱的融合与应用

目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…

【数据库初阶】数据库基础知识

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们&#xff0c;大家好&#xff01;在这篇文章中&#xff0c;我们将深入浅出地为大家讲解 数据库…

【LeetCode】726、原子的数量

【LeetCode】726、原子的数量 文章目录 一、递归: 嵌套类问题1.1 递归: 嵌套类问题 二、多语言解法 一、递归: 嵌套类问题 1.1 递归: 嵌套类问题 遇到 ( 括号, 则递归计算子问题 遇到大写字母, 或遇到 ( 括号, 则清算历史, 并开始新的记录 记录由两部分组成: 大写字母开头的 …

财经英语期末考试复习

文章目录 第一篇第二篇第三篇第四篇思路梳理作文撰写 第一篇 李宁是中国运动服装和鞋类行业的领导者,这源于其创始人,同名体操冠军李宁的愿景. Ling-Ning is the Chinese leader in athletic apparel and footwear, rooted in the vision of its founder and namesake,the cha…

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集VA-I-FGSM介绍相关定义算法流程 VAI-FGSM代码实现VAI-FGSM算法实现攻击效果 代码汇总vaifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对…

20241225在ubuntu20.04.5下监控SSD

20241225在ubuntu20.04.5下监控SSD 2024/12/25 20:29 参考资料&#xff1a; 百度&#xff1a;ubuntu查看ssd寿命 方法 1&#xff1a;使用「磁盘」工具监测 SSD 健康状态 sudo apt install gnome-disk-utility 方法 2&#xff1a;使用 smartctl 工具检查 SSD 健康状态 Ubuntu 和…