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.mzph.cn/web/64374.shtml

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

相关文章

关于最新MySQL9.0.1版本zip自配(通用)版下载、安装、环境配置

一、下载 从MySQL官网进行下载MySQL最新版本,滑到页面最下面点击社区免费版,(不是企业版) 点击完成后选择自己想要下载的版本,选择下载zip压缩,不用debug和其他的东西。 下载完成后进入解压,注…

vulnhub靶场 Empire LupinOne

使用命令查看靶机ip,访问ip arp-scan -l 使用御剑扫描一下子域名,但是没有获取到什么有用的信息 这是一个Apache文档,没有什么用 紧接着我们尝试暴力破解,这里推荐使用ffuf工具暴力破解目录,kali自带的ffuf扫描速度贼快 参数解释…

Kubernetes# Helm工具使用

目录 概念 核心组件 Helm客户端 Tiller Chart Repository Release Helm安装 Helm使用 创建Helm Chart 定义Chart元数据 定义Template模板 定义values参数 打包和部署 Helm Chart 推送到远程仓库 Helm常用命令 概念 Helm 是一个 Kubernetes 的包管理工具&#…

Yocto 项目中的交叉编译:原理与实例

Yocto 项目是一个强大的工具集,它专注于为嵌入式系统生成定制的 Linux 发行版。交叉编译在 Yocto 项目中扮演着核心角色,它使得开发者能够在功能强大的宿主机上构建适用于资源受限目标设备的软件系统。这篇文章将从运行原理、实际案例和工具链组成等角度…

python学opencv|读取图像(二十二)使用cv2.polylines()绘制多边形

【1】引言 前序学习进程中,已经掌握了使用pythonopencv绘制线段、矩形和圆形的基本操作,相关链接包括且不限于: python学opencv|读取图像(十八)使用cv2.line创造线段-CSDN博客 python学opencv|读取图像(…

教师管理系统

大概功能: 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名:必须是中文 手机号码:必须是11位,必须是数字 效果展示: 代码展示: Teache…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段:定义小程序顶部、底部 tab 栏,用以实现页面之间的快速切换;可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面; 在上面图中,标注了一些 tabBar …

[Wireshark] 使用Wireshark抓包https数据包并显示为明文、配置SSLKEYLOGFILE变量(附下载链接)

wireshark 下载链接:https://pan.quark.cn/s/eab7f1e963be 提取码:rRAg 链接失效(可能会被官方和谐)可评论或私信我重发 chrome与firefox在访问https网站的时候会将密钥写入这个环境变量SSLKEYLOGFILE中,在wireshark…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局,当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem,跳转到最后一个tab页面时,会发现tab不滚动,手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…

【Spring】 Bean 注入 HttpServletRequest 能保证线程安全的原理

文章目录 前言1. 图示2. 源码坐标后记 前言 今天看了一段老业务代码,HttpServletRequest 被注入后直接用于业务逻辑。 好奇Spring是如何解决线程安全问题。 Controller public class TestController {ResourceHttpServletRequest request;ResponseBodyGetMapping(…

Unity中如何修改Sprite的渲染网格

首先打开SpriteEditor 选择Custom OutLine,点击Genrate 则在图片边缘会出现边缘线,调整白色小方块可以调整边缘 调整后,Sprite就会按照调整后的网格渲染了。 如何在UI中使用? 只要在UI的Image组件中选择Use Sprite Mesh 即可 结果&#xff1…

【Artificial Intelligence篇】AI 前沿探秘:开启智能学习的超维征程

目录 一、人工智能的蓬勃发展与智能学习的重要性: 二、数据的表示与处理 —— 智能学习的基石: 三、构建一个简单的感知机模型 —— 智能学习的初步探索: 四、神经网络 —— 开启超维征程的关键一步: 五、超维挑战与优化 —— 探索智能学习的深度: 六、可视化与交互 —— …

docker-compos mysql5.7主从配置

docker-compos mysql5.7主从配置 docker-compose目录结构 配置文件 master/my.cnf [client] port 3306 socket /var/run/mysqld/mysqld.sock[mysqld_safe] pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.sock nice 0…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

路过石岩浪心古村

周末常去的七彩城堡儿童乐园附近经常有老房子,没想到老房子最多的地方还是浪心古村。而且越看越有历史。 见到一座写着《序西书室》的房子,我最开始以为是一个古代的学校。但是查了百度更加不知道什么意思了哈。‌“序西书室”‌是指《文心雕龙》中的一个…

探索PyTorch:从入门到实践的demo全解析

探索PyTorch:从入门到实践的demo全解析 一、环境搭建:PyTorch的基石(一)选择你的“利器”:安装方式解析(二)步步为营:详细安装步骤指南二、基础入门demo:点亮第一盏灯(一)张量操作:深度学习的“积木”(二)自动求导:模型学习的“幕后英雄”三、数据处理demo:喂饱…

SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换

一、RESTful (一)RESTful概述 RESTful是一种软件架构风格,用于设计网络应用程序。REST是“Representational State Transfer”的缩写,中文意思是“表现层状态转移”。它基于客户端-服务器模型和无状态操作,以及使用HTTP请求来处理数据。RES…

Windows中安装Python3

Windows中安装Python3 1. 下载Python安装包 首先,访问Python的官方网站 Python.org,选择适合你Windows版本的Python安装包。 2. 运行安装包 下载完成.exe文件后,双击运行安装包。在安装过程中,有一些关键的选项需要特别注意&a…

虚幻引擎结构之UWorld

Uworld -> Ulevel ->Actors -> AActor 在虚幻引擎中,UWorld 类扮演着至关重要的角色,它就像是游戏世界的总指挥。作为游戏世界的核心容器,UWorld 包含了构成游戏体验的众多元素,从游戏实体到关卡设计,再到物…

2024第一届Solar杯应急响应挑战赛

日志流量 日志流量-1 直接放到D盾分析 解码 flag{A7b4_X9zK_2v8N_wL5q4} 日志流量-2 哥斯拉流量 工具解一下 flag{sA4hP_89dFh_x09tY_lL4SI4} 日志流量-3 tcp流6复制data流 解码 改pdf flag{dD7g_jk90_jnVm_aPkcs} 内存取证 内存取证-1 vol.py -f 123.raw --profileWin…