(三)ffmpeg 解码流程以及函数介绍

一、视频解码流程

二、函数介绍

1.avformat_network_init

函数作用:

执行网络库的全局初始化。这是可选的,不再推荐。

此函数仅用于解决旧GnuTLS或OpenSSL库的线程安全问题。如果libavformat链接到这些库的较新版本,或者不使用它们,则不需要调用此函数。否则,您需要在启动使用该函数的任何其他线程之前调用该函数。 一旦删除对旧GnuTLS和OpenSSL库的支持,此函数将被弃用,并且此函数没有任何用途。

2.av_dict_set 

函数作用:

用于向字典中添加键值对。它可以被用来传递多种数据,例如视频解码参数、音频参数、字幕参数等等。

函数原型:

int av_dict_set(AVDictionary **pm,const char *key, const char *value, int flags);

参数说明:

pm:指向AVDictionary结构的指针,该结构将被填充以包含新的键值对。

key:要添加到字典中的键。

value:与键关联的值。

flags:可选参数,指定如何处理重复的键。0:默认,默认情况下,如果键已经存在,则新值将覆盖旧值。AV_DICT_DONT_OVERWRITE:如果已经存在键名,则不会执行任何操作,

避免覆盖。AV_DICT_APPEND:如果关键字已经定义,则将其与新的值合并。

返回值:

返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。

常见用法:

av_dict_set(&options, "rtsp_transport", "tcp", 0); //使用 TCP 方式
av_dict_set(&options, "buffer_size", "1024", 0); // 设置缓冲区大小为1024字节av_dict_set(&options, "max_delay", "200", 0);//设置接收包间隔最大延迟,微秒

av_dict_set(&options, "timeout", "5000000", 0); // 设置超时时间为5秒(单位为微秒)

av_dict_set(&options, "stimeout", "3000000", 0);//设置阻塞超时,否则可能在流断开时连接发生阻塞,微秒

3.avformat_open_input

函数作用:

用于打开多媒体文件或流并初始化用于读取数据的结构。这个函数是FFmpeg多媒体处理流程的起点,通常用于设置后续的解码、编码或其他处理步骤。

函数原型:

int avformat_open_input(AVFormatContext **ps,const char *url, AVInputFormat *fmt, AVDictionary **options);

参数说明:

ps:指向AVFormatContext结构的指针,该结构将被填充以包含媒体文件的信息和IO上下文。本函数如果打开媒体成功,会返回一个AVFormatContext的实例。

url:要打开的文件名或流的URL。

fmt:可选参数,指定要尝试探测的特定输入格式。如果为NULL,则自动探测。

options:可选参数,一个字典,包含一些特定的选项。这些选项可以影响解析过程或被用来设置特定格式的私有选项。

返回值:

返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。

4.avformat_find_stream_info

函数作用:

用于获取媒体文件的流信息。它通过解析媒体文件的头部数据来确定每个流的类型、编码格式和其他相关信息。

函数原型:

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

参数说明:

ic:指向AVFormatContext结构的指针,该结构包含媒体文件的信息和IO上下文。

options:可选参数,一个字典,包含一些特定的选项。这些选项可以影响解析过程或被用来设置特定格式的私有选项。

返回值:

返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。

5.av_find_best_stream

函数作用:

用于在给定的媒体文件中查找最佳流。它可以根据指定的条件(如编码格式、类型等)来选择最佳的流。

函数原型:

int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream, AVCodec **decoder_ret, int flags);

参数说明:

ic:指向AVFormatContext结构的指针,该结构包含媒体文件的信息和IO上下文。

type:要查找的流的类型,可以是音频、视频或字幕等。

wanted_stream_nb:可选参数,指定要查找的流的索引号。如果为-1,则自动选择最佳流。

related_stream:可选参数,指定与要查找的流相关的流的索引号。例如,如果要查找的视频流与音频流相关联,可以设置此参数为音频流的索引号。

decoder_ret:可选参数,一个指向AVCodec结构的指针,用于返回找到的最佳流的解码器。

flags:可选参数,用于控制查找过程的行为。可以使用AVFMT_FLAG_GENPTS标志来生成时间戳。默认为0

返回值:

 返回值为整数类型。如果成功,返回找到的最佳流的索引号;否则返回一个负数错误码。

6.avcodec_find_decoder

函数作用:

用于查找指定编码格式的解码器。它可以根据给定的编码格式或编解码器ID来查找相应的解码器。(新版本返回值必须使用const)

函数原型:

AVCodec *avcodec_find_decoder(enum AVCodecID id);

参数说明:

id:要查找的编解码器ID,可以是音频、视频或字幕等类型的编解码器ID。

返回值:

返回值为指向AVCodec结构的指针。如果成功找到解码器,则返回该解码器的指针;否则返回NULL。

7.avcodec_alloc_context3

函数作用:

用于分配编解码器上下文结构。它为指定的编解码器分配内存并初始化其字段。

函数原型:

AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);

参数说明:

codec:指向要为其分配上下文结构的编解码器的指针。

返回值:

返回值为指向AVCodecContext结构的指针。如果成功分配和初始化上下文结构,则返回该结构的指针;否则返回NULL。

8.avcodec_parameters_to_context

函数作用:

用于将编解码器参数复制到编解码器上下文中。

函数原型:

int avcodec_parameters_to_context(AVCodecContext *ctx, const AVCodecParameters *par_out());

参数说明:

ctx:指向要设置参数的编解码器上下文的指针。

par_out():指向要复制的编解码器参数的指针。

返回值:

返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。

9.avcodec_open2

函数作用:

用于打开编解码器并初始化其上下文。

函数原型:

int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);

参数说明:

avctx:指向要打开的编解码器上下文的指针。

codec:指向要打开的编解码器的指针。

options:可选参数,一个字典,包含一些特定的选项。这些选项可以影响编解码器的打开过程或被用来设置特定格式的私有选项。

返回值:

返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。

10.av_read_frame

函数作用:

用于从媒体文件中读取一帧数据。

函数原型:

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

参数说明:

s:指向要读取数据的媒体文件的格式上下文的指针。

pkt:指向一个AVPacket结构的指针,该结构将被填充以包含读取到的数据。

返回值:

返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。

11.avcodec_send_packet

函数作用:

用于将数据包发送到编解码器进行编码或解码。

函数原型:

int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);

参数说明:

avctx:指向要发送数据包的编解码器上下文的指针。

avpkt:指向要发送的数据包的指针。

返回值:

返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。

12.avcodec_receive_frame

函数作用:

用于从编解码器接收编码或解码后的数据帧。

函数原型:

int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);

参数说明:

avctx:指向要接收数据帧的编解码器上下文的指针。

frame:指向一个AVFrame结构的指针,该结构将被填充以包含接收到的数据帧。

返回值:

返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。

13.sws_getContext

函数作用:

用于创建一个缩放和转换上下文。在调用该函数时,需要先确定源图像和目标图像的尺寸、像素格式以及是否需要进行某些特定的处理(例如缩放、裁剪、旋转等),然后根据这些信息来设置相应的参数。

函数原型:

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表示源图像的像素格式;

dstWdstH表示目标图像的宽度和高度;

dstFormat表示目标图像的像素格式;

flags表示一些选项,例如是否使用多线程等;

srcFilterdstFilter表示源图像和目标图像的滤波器;

param是一个可选参数,用于指定一些特定的参数

返回值:

返回值为一个指向新创建的缩放和转换上下文的指针。如果创建失败,则返回NULL。

14.av_image_get_buffer_size

函数作用:

用于计算图像缓冲区所需的内存大小。

函数原型:

int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);

参数说明:

pix_fmt:指定像素格式,例如YUV420P、RGB24等。

width:指定图像的宽度。

height:指定图像的高度。

align:指定内存对齐的大小,通常为1或2。

返回值:

返回值为整数值,表示所需缓冲区的大小(以字节为单位)。

15.av_image_fill_arrays

函数作用:用于将图像数据填充到指定的缓冲区中。

函数原型:

int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],const uint8_t *src,enum AVPixelFormat pix_fmt, int width, int height, int align);

参数说明:

dst_data:指向目标缓冲区的指针数组,每个元素对应一个平面的数据指针。

dst_linesize:指向目标缓冲区的行大小数组,每个元素对应一个平面的行大小。

src:指向源数据的指针。

pix_fmt:指定像素格式,例如YUV420P、RGB24等。

width:指定图像的宽度。

height:指定图像的高度。

align:指定内存对齐的大小,通常为1或2。

返回值:

返回值为填充后的行大小数组;否则返回一个负数错误码。

16.av_strerror

函数作用:

用于将错误码转换为对应的错误信息字符串。

函数原型:

int av_strerror(int errnum, char *errbuf, size_t errbuf_size);

 参数说明:

errnum:表示错误码的整数。

errbuf:指向存储错误信息的字符数组的指针。

errbuf_size:指定errbuf的大小。

返回值:

返回一个整数值,表示转换后的错误信息字符串的长度。如果转换成功,则返回非负值;如果转换失败,则返回负值。

17.av_packet_alloc

函数作用:

分配AVPacket内存空间并将其字段设置为默认值。

函数原型:

AVPacket *av_packet_alloc(void);

参数说明:

返回值:

返回一个AVPacket,填充了默认值或失败时为NULL。

这只分配AVPacket本身,而不是数据缓冲区。那些必须通过诸如av_new_packet之类的其他方式进行分配。 

使用示例:

int ret = -5;char *error = new char[1024];
memset(error, 0, 1024);// 将数组置零av_strerror(ret, error, 1024);
qDebug()<<"错误原因:"<<QString::fromStdString(error)<<" 返回值:"<<ret;delete[] error;
error = NULL;

18.av_new_packet

函数作用:

初始化AVPacket结构体的字段。

函数原型:

int av_new_packet(AVPacket *pkt, int size);

参数说明:

pkt:指向要分配的AVPacket结构体的指针。

size:指定AVPacket结构体的大小。

返回值:

返回一个整数值,表示操作的结果。如果成功,则返回0;否则,返回负数表示错误码。

19.一些创建函数

avformat_alloc_context:分配一个新的AVFormatContext结构体,并初始化其字段为默认值。

avcodec_alloc_context3:分配一个新的AVCodecContext结构体,并设置其字段为默认值。

 av_packet_alloc:分配一个新的AVPacket结构体,并设置其字段为默认值。

av_frame_alloc:分配一个新的AVFrame结构体并将其字段设置为默认值,用于存储视频帧或音频帧的数据。

av_malloc:分配一块内存,该内存块可以用于存储多媒体数据或其他用途

20.一些释放资源函数

av_free(void *ptr):这个函数用于释放之前通过av_mallocav_reallocav_malloczav_calloc等函数分配的内存。

av_freep(void * * ptr):这个函数与av_free类似,但它还会将指针设置为NULL,以避免悬挂指针的问题。 

 avformat_close_input(AVFormatContext **s):关闭媒体文件格式上下文,并释放与之相关的资源。

 avcodec_close(AVCodecContext *avctx):关闭编解码器上下文,并释放其中的资源。

av_packet_unref(AVPacket *pkt):用于释放AVPacket结构体占用的内存。

av_free_packet(AVPacket *pkt):用于释放数据包,主要用于网络传输。 

avformat_flush(AVFormatContext *s):用于清空 AVFormatContext 中的输入/输出缓冲区中的数据。

 av_frame_free(AVFrame **frame):用于释放AVFrame结构体占用的内存。

sws_freeContext(SwsContext *sws):用于释放 SwsContext 结构体占用的内存。

在使用这些函数时,需要注意以下几点:

正确配对:确保使用av_malloc等分配的内存使用av_freeav_freep来释放。

避免泄漏:在释放资源后,确保不再使用已释放的资源,以防止内存泄漏。

按顺序释放:如果多个资源之间存在依赖关系,应按照正确的顺序释放资源,以避免未定义的行为。

21.avformat_flush和av_frame_free区别

  • avformat_flush:这个函数用于清空输入/输出缓冲区中的数据,确保所有的数据都已经读取或者写入。这对于同步多媒体流非常重要,尤其是在关闭文件之前确保所有数据都已经被处理完毕。它不会影响已经分配的内存,只是清空了数据内容。
  • av_frame_free:这个函数用于释放一个AVFrame结构体及其相关的数据所占用的所有内存。AVFrame是FFmpeg中表示音频或视频帧的结构体,当不再需要这个结构体时,应当使用av_frame_free来释放它,以防止内存泄漏。

总的来说,avformat_flushav_frame_free在功能上是不同的。前者是清空缓冲区数据,后者是释放帧结构体内存。

22.av_packet_unref和av_free_packet区别

  • av_packet_unref:该函数减少AVPacket的引用计数。如果引用计数减到0,则该函数会释放AVPacket及其数据缓冲区。通常用于解码过程中,当一个AVPacket不再被需要时,可以调用这个函数来避免内存泄露。
  • av_free_packet:该函数释放AVPacket结构体本身以及它所包含的数据。与av_packet_unref不同,av_free_packet不仅释放了AVPacket结构体,还释放了与它关联的所有数据。

总的来说,如果你只想释放AVPacket的数据部分而不是整个结构体,可以使用av_packet_unref。而如果你想要彻底地释放AVPacket结构体以及其数据,那么应该使用av_free_packet

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

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

相关文章

阿里云微调chatglm3-6b---只有一个python解释器但gradio要求版本不兼容怎么办

安装LLAMA参考博文http://t.csdnimg.cn/6yYwG 在用LLAMA微调大模型的时候总是出现connected error out并且出现这样的界面 这是由于LLMA所要求的gradio版本>4.0.0,<4.2.0&#xff0c;然而chatglm3-6b要求的gradio版本需要gradio3.39.0才能显示出web_demo_gradio.py渲染…

【MATLAB源码-第36期】matlab基于BD,SVD,ZF,MMSE,MF,SLNR预编码的MIMO系统误码率分析。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. MIMO (多输入多输出)&#xff1a;这是一个无线通信系统中使用的技术&#xff0c;其中有多个发送和接收天线。通过同时发送和接收多个数据流&#xff0c;MIMO可以增加数据速率和系统容量&#xff0c;同时提高信号的可靠性。…

Mac环境 llamafile 部署大语言模型LLM

文章目录 Github官网本地部署 llamafile 是一种可在你自己的电脑上运行的可执行大型语言模型&#xff08;LLM&#xff09;&#xff0c;它包含了给定的开放 LLM 的权重&#xff0c;以及运行该模型所需的一切。让人惊喜的是&#xff0c;你无需进行任何安装或配置。 Github https…

爱奇艺APP Android低端机性能优化

01 背景介绍 在智能手机市场上&#xff0c;高端机型经常备受瞩目&#xff0c;但低端机型亦占据了不可忽视的份额。众多厂商为满足低端市场的需求&#xff0c;不断推出低配系列手机。另外过去几年的中高端机型&#xff0c;随着系统硬件的快速迭代&#xff0c;现已经被归类为低端…

APP开发_开发一个入门的 H5 APP

1 开发环境的搭建与准备 1.1 安装 Android Studio 下载&#xff1a;首先&#xff0c;从谷歌的安卓开发者网站&#xff08;https://developer.android.google.cn/studio/releases?hlzh-cn&#xff09;下载Android Studio的安装包。在下载页面中&#xff0c;可以根据自己的操作…

智慧公厕是智慧城市建设中不可或缺的一部分

智慧城市的数字化转型正在取得显著成效&#xff0c;各项基础设施的建设也在迅速发展&#xff0c;其中智慧公厕成为了智慧城市体系中不可或缺的一部分。作为社会生活中必要的设施&#xff0c;公共厕所的信息化、数字化、智慧化升级转型能够实现全区域公共厕所管理的横向打通和纵…

asp.net core 网页接入微信扫码登录

创建微信开放平台账号&#xff0c;然后创建网页应用 获取appid和appsecret 前端使用的vue&#xff0c;安装插件vue-wxlogin 调用代码 <wxlogin :appid"appId" :scope"scope" :redirect_uri"redirect_uri"></wxlogin> <scri…

【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

目录 求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子应用一&#xff1a;统计二叉树中叶子结点个数的算法写法一&#xff1a;使用静态变量写法二&#xff1a;传入 count 作为参数写法三&#xff1a;不使用额外变量 应用二&am…

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

少年有梦&#xff0c;不应至于心动&#xff0c;更要付诸行动 —— 24.4.12 pymysql 除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行SQL从而操作数据库 在Python中&#xff0c;使用第三方库&#xff1a;pymysql来完成对MySQl数据库的操作 安装 pip install py…

什么是面向对象思想?

面向对象不是一种技术&#xff0c;而是一种思想。它指导我们以什么形式组织代码&#xff0c;以什么思路解决问题。 面向对象编程&#xff0c;是一种通过对象方式&#xff0c;把现实世界映射到计算机世界的编程方法。 面向对象解决问题的思路&#xff1a;把构成问题的事物分解成…

Go——网络编程

一. 互联网协议介绍 网络基础——网络传输基本流程_网络传输过程-CSDN博客 应用层HTTP协议-CSDN博客 传输层UDP/TCP协议_udp报文提供的确认号用于接收方跟发送方确认-CSDN博客 网络层IP协议-CSDN博客 链路层以太网详解_以太网数据链路层-CSDN博客 二. Socket编程 Socket是…

中国省级人口结构数据集(2002-2022年)

01、数据简介 人口结构数据不仅反映了地域特色&#xff0c;更是预测地区未来发展趋势的重要工具。在这些数据中&#xff0c;总抚养比、少年儿童抚养比和老年人口抚养比是三大核心指标。 少儿抚养比0-14周岁人口数/15-64周岁人口数 老年抚养比65周岁及以上人口数/15-64周岁人…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…

03-JAVA设计模式-外观模式

外观模式 什么是外观模式 外观模式&#xff08;Facade Pattern&#xff09;是面向对象设计模式中的一种&#xff0c;它为子系统中的一组接口提供了一个统一的高级接口&#xff0c;使得子系统更容易使用。外观模式定义了一个高层接口&#xff0c;让子系统更容易使用。子系统中…

【JS进阶】第四天

JavaScript 进阶 - 第 4 天 深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只针对引用类型&#xff0c;因为简单类型直接拷贝值了 浅拷贝&#xff1a;拷贝的是地址&#xff0c;只拷贝一层 常见方法&#xff1a; 拷贝对象&#xff1a;Object.assgin() / 展开运算符 {…obj} 拷贝对象…

Linux_ubuntu使用常见问题解决

文章目录 1.安装好了搜狗输入法却只能输出英文&#xff1a; 1.安装好了搜狗输入法却只能输出英文&#xff1a; 1.浏览器搜索搜狗输入法&#xff0c;下载好安装包 终端输入下列命令安装&#xff0c;找不到文件可以cd到该安装包的目录文件下&#xff1a; sudo dpkg -i sogoupin…

自定义vue-cli 实现预设模板项目

模板结构 主要包括四个部分&#xff1a; preset.jsonprompts.jsgenerator/index.jstemplate/ 项目最终结构 preset.json preset.json 中是一个包含创建新项目所需预定义选项和插件的 JSON 对象&#xff0c;让用户无需在命令提示中选择它们&#xff0c;简称预设&#xff1b;…

从 0 搭建公司Jenkins服务 Centos7

从 0 搭建公司Jenkins服务 Centos7 安装 (运维人员) 安装环境 配置DNS安装JDK17安装Jenkins安装Docker安装GIT安装Ansible启动Jenkins安装插件配置凭据配置共享库配置 (开发经理)使用 (开发、测试人员) 安装 (运维人员) 安装环境 配置DNS 新安装系统的服务器无法解析域名&a…

云计算重要概念之:虚拟机、网卡、交换机、路由器、防火墙

一、虚拟机 (Virtual Machine, VM) 1.主流的虚拟化软件&#xff1a; 虚拟化软件通过在单个物理硬件上创建和管理多个虚拟环境&#xff08;虚拟机&#xff09;&#xff0c;实现资源的高效利用、灵活部署、隔离安全以及便捷管理&#xff0c;是构建云计算和现代化数据中心的核心…

B端:弹窗的场景、类型、 选择策略串讲,让你的设计有理有据。

B端产品在什么情况下使用弹窗&#xff0c;弹窗又分为哪些类型&#xff0c;该如何选择合理的弹窗形式&#xff0c;很多小伙伴都是跟着感觉走&#xff0c;本文告诉你依据。 一、弹窗及其场景 在B端系统中&#xff0c;"B端"通常指的是面向企业&#xff08;Business&am…