FFmpeg 的常用API

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 avcodec_send_packet()

新版FFMPEG4.0引入:主要用于将编码或解码的数据包(Packet)送入编解码器的输入队列

int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
  • avctx:指向 AVCodecContext 结构的指针,包含与编码器或解码器相关的配置信息。(如avcodec_open2初始化的编解码器)

  • avpkt:指向 AVPacket 结构的指针,表示要送入编解码器的输入数据包。(如av_read_frame的数据包)

2.5 avcodec_receive_frame()

新版FFMPEG4.0引入:用于从解码器获取解码后帧

int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
  • avctx:指向 AVCodecContext 结构的指针,它包含与解码器相关的上下文和配置信息。你必须在解码器初始化后(通过 avcodec_open2)提供此参数。

  • frame:指向 AVFrame 结构的指针,接收解码后的帧数据。AVFrame 是一个结构体,表示解码后的视频或音频数据。解码后的数据将存储在这个结构中。

为什么要使用 avcodec_send_packetavcodec_receive_frame

  • 分离输入和输出:使用这两个函数可以将输入和输出解耦,给解码器提供更大的灵活性。例如,在多线程环境中,你可以在一个线程中调用 avcodec_send_packet 发送数据包,而在另一个线程中调用 avcodec_receive_frame 获取解码结果。
  • 线程安全:新版的 API 提供了线程安全的机制,尤其适用于异步解码或编码任务。
  • 增强性能和灵活性:通过逐步处理数据,避免了直接处理整个解码过程所带来的性能瓶颈。

2.6 avformat_close_input()

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

void avformat_close_input(AVFormatContext **s)  

## 三、编码相关API### 3.1 `avformat_alloc_output_context2`> 用于**分配并初始化**一个输出媒体格式的上下文 (`AVFormatContext`)  (通常是第一个调用的函数)```c++
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.rhkb.cn/news/496870.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么要在PHY芯片和RJ45网口中间加网络变压器

在PHY芯片和RJ45网口之间加入网络变压器是出于以下几个重要的考虑: 1. 电气隔离:网络变压器提供了电气隔离功能,有效阻断了PHY芯片与RJ45之间直流分量的直接连接。这样可以防止可能的电源冲突,降低系统故障的风险,并保…

深度学习助力股市预测:LSTM、RNN和CNN模型实战解析

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:众所周知,传统的股票预测模型有着各种各样的局限性。但在我的最新研究中,探索了一些方法来高效预测股市走势,即CNN、RNN和LSTM这些深度学习…

sql字段值转字段

表alertlabel中记录变字段 如何用alertlabel表得到下面数据 实现的sql语句 select a.AlertID, (select Value from alertlabel where AlertIDa.AlertID and Labelhost) as host, (select Value from alertlabel where AlertIDa.AlertID and Labeljob) as job from (select …

【Flutter_Web】Flutter编译Web第三篇(网络请求篇):dio如何改造方法,变成web之后数据如何处理

前言 Flutter端在处理网络请求的时候,最常用的库当然是Dio了,那么在改造成web端的时候,最先处理的必然是网络请求,否则没有数据去处理驱动实图渲染。 官方链接 pub https://pub.dev/packages/diogithub https://github.com/c…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构:List、Set和Queue。本文将详细阐述这些数据类型的各自实现,并按照线程安全性进行分类,分别介绍非线程安全与线程安全的实现方…

OpenCV-Python实战(6)——图相运算

一、加法运算 1.1 cv2.add() res cv2.add(img1,img2,dstNone,maskNone,dtypeNone) img1、img2:要 add 的图像对象。(shape必须相同) mask:图像掩膜。灰度图(维度为2)。 dtype:图像数据类型…

41 stack类与queue类

目录 一、简介 (一)stack类 (二)queue类 二、使用与模拟实现 (一)stack类 1、使用 2、OJ题 (1)最小栈 (2)栈的弹出压入序列 (3&#xf…

运行StableDiffusionInpaintPipeline的Example时报错:OSError: Cannot load model runwayml/stable-diffusion-...

项目地址: https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/inpainthttps://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/inpaint在云服务器端运行下面给出的Example的时候出现报错: (myconda) rootwnyrpE:…

JDK高频面试题(包重点)

一、什么是JDK JDK(Java Development Kit)即 Java 开发工具包,是 Java 编程的基础与核心,由 Sun Microsystems(现归属于 Oracle 公司 )开发,主要作用如下: 1、提供编译环境 它包含了…

pikachu靶场搭建详细步骤

一、靶场下载 点我去下载 二、靶场安装 需要的环境: mysqlApaches(直接使用小皮面板Phpstudy:https://www.xp.cn/),启动他们 设置网站,把靶场的路径对应过来 对应数据库的信息 由于没有核对数据库的信…

第P4周:猴痘病识别

目录 前言一、我的环境二、代码实现1. 前期准备1.1 设置GPU1.2 导入数据1.3 划分数据集 2. 构建简单的CNN网络3. 训练模型3.1 设置超参数3.2 编写训练函数3.3 编写测试函数3.4 正式训练 4. 结果可视化4.1 Loss与Accuracy图4.2 指定图片进行预测 5. 保存并加载模型 三、学习体会…

ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制

文章目录 Pre概述什么是 composite aggregation?基本结构after 参数的作用问题背景:传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…

如何用WPS AI提高工作效率

对于每位职场人而言,与Word、Excel和PPT打交道几乎成为日常工作中不可或缺的一部分。在办公软件的选择上,国外以Office为代表,而在国内,WPS则是不可忽视的一大选择。当年一代天才程序员求伯君创造了WPS,后面雷军把它装…

深度学习中的并行策略概述:1 单GPU优化

深度学习中的并行策略概述:1 单GPU优化 1 Training Larger Models on a Single GPU 在讨论模型的“扩展”时,往往会想到在多个GPU或多台机器上进行模型训练。不过,即便是在单个GPU上,也存在多种方法来训练更大规模的模型并提升…

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试? 速度:Go速度很快,这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性:可以利用Go的内置并发性(goroutines)来并行化测试执行 简单:Go的简约语法允许您编写可读且可维护…

2、C#基于.net framework的应用开发实战编程 - 设计(二、三) - 编程手把手系列文章...

二、设计; 二.三、构建数据库; 此例子使用的是SQLite数据库,所以数据库工具用的SQLiteStudio x64,这个是SQLite专用的数据库设计管理工具,其它的数据库管理工具比如DBeaver的使用请见实战工具系列文章。 1、…

2011-2020年各省城镇职工基本医疗保险年末参保人数数据

2011-2020年各省城镇职工基本医疗保险年末参保人数数据 1、时间:2011-2020年 2、来源:国家统计局 3、指标:省份、时间、城镇职工基本医疗保险年末参保人数 4、范围:31省 5、指标解释:参保人数指报告期末按国家有关…

Github优质项目推荐(第九期)

文章目录 Github优质项目推荐(第九期)一、【tldraw】,37.1k stars - 在 React 中创建无限画布体验的库二、【zapret】,9.1k stars - 独立(无需第三方服务器)DPI 规避工具三、【uBlock】,48.3k s…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

KOI技术-事件驱动编程(前端)

1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的,那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,…