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

news2024/12/25 12:49:14

一、视频解码流程

二、函数介绍

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.coloradmin.cn/o/1591828.html

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

相关文章

AI大模型探索之路-应用篇1:Langchain框架概述—快速构建大模型应用

目录 一、什么是LangChain&#xff1f; 二、LangChain解决了哪些问题&#xff1f; 三、LangChain总体架构 四、代码实践样例 总结 一、什么是LangChain&#xff1f; 为大模型应用提供简便之道。 LangChain&#xff0c;专为构建庞大的语言模型应用程序设计的框架&#xff0…

神级浏览器,大小不到2MB

今天分享2个神级浏览器&#xff0c;大小不到2MB&#xff0c;第一个是崇尚速度与简约的手机浏览器&#xff0c;支持广告拦截、插件定制、主题自定义等功能 https://github.com/tuyafeng/Via &#xff0c;安装包大小不过2MB。 资源嗅探可以很方便的下载网页视频&#xff1a; 第2个…

Ubuntu 22.04 安装 zabbix

Ubuntu 22.04 安装 zabbix 1&#xff0c;Install Zabbix repository2&#xff0c;安装Zabbix server&#xff0c;Web前端&#xff0c;agent3&#xff0c;安装mysql数据库3.1 创建初始数据库3.2 导入初始架构和数据&#xff0c;系统将提示您输入新创建的密码。3.3 在导入数据库架…

尚硅谷html5+css3(3)布局

1.文档流normal flow -网页是一个多层结构 -通过CSS可以分别为每一层设置样式 -用户只能看到最顶层 -最底层&#xff1a;文档流&#xff08;我们所创建的元素默认都是从文档流中进行排列&#xff09; <head><style>.box1 {background-color: blue;}/*它的父元…

今日arXiv最热大模型论文:清华大学发布,ChatGML又添新功能,集成“自我批评”,提升数学能力

引言&#xff1a;数学问题解决在大语言模型中的挑战 在当今的人工智能领域&#xff0c;大语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;已经在理解和生成人类语言方面取得了显著的进展。这些模型在文本摘要、问答、角色扮演对话等多种语言任务上展现…

JVM性能调优——OOM分类及解决方案

文章目录 1、概述2、OOM案例1&#xff1a;堆内存溢出3、OOM案例2&#xff1a;元空间溢出4、OOM案例3:GC overhead limit exceeded5、OOM案例4&#xff1a;线程溢出6、小结 在工作中会经常遇到内存溢出(Out Of Memory,OOM)异常的情况&#xff0c;每当遇到OOM&#xff0c;总是让人…

今天我们来聊一聊Java中的Semaphore

写在开头 在上几天写《基于AQS手写一个同步器》时&#xff0c;很多同学留言说里面提到的Semaphore&#xff0c;讲得太笼统了&#xff0c;今天趁着周末有空&#xff0c;咱们就一起详细的学习和梳理一把 Semaphore。 什么是Semaphore&#xff1f; 在前面我们讲过的synchronize…

【计算机毕业设计】人事管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

【刷题】代码随想录算法训练营第十一天|20、有效的括号,1047、删除字符中的所有相邻重复项,150、逆波兰表达式求值

目录 20、有效的括号1047、删除字符中的所有相邻重复项150、逆波兰表达式求值 20、有效的括号 讲解&#xff1a;https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html 括号匹配是使用栈解决的经典问题。 三种不匹配&#xff1a;第一种是缺少匹…

Axure RP中的相关概念及高保真原型构建方法

1 Axure RP中概念介绍 对于构建高保真原型来说&#xff0c;需要知道事件&#xff08;Event&#xff09;、Case、Action等概念。Axure RP中给出这些概念&#xff0c;是为了方便原型的构建&#xff0c;尤其是高保真原型的构建。 事件&#xff08;Event&#xff09;是附着于控件…

.vue文件引入路径正确,但报错

问题描述 使用Vue挂载组件时&#xff0c;导入路径正确&#xff0c;但是一直提示 Already included file name ‘绝对路径/index.vue’ differs from file name ‘绝对路径/Index. vue’ only in casing. The file is in the program because: Imported via ‘./components/ind…

Ubuntu,Kylin环境使用clock()函数设置延迟

一、Ubuntu操作系统中&#xff0c;直接在main中测试clock()设置延迟功能 代码描述&#xff1a;直接在main中使用clock()函数设置200ms延迟。 代码输出&#xff1a; 实现了200ms的延迟。 #include <time.h> #include <sys/time.h> #include <stdio.h> #inc…

HarmonyOS实战开发-自定义通知角标、如何设定应用的桌面图标角标的功能。

介绍 本示例主要展示了设定应用的桌面图标角标的功能&#xff0c;使用ohos.notificationManager 接口&#xff0c;进行桌面角标的设置&#xff0c;通知的发送&#xff0c;获取等。 效果预览 使用说明 在使用本应用时&#xff0c;需安装并启动仿桌面应用&#xff1b;在主界面…

微信小程序报错——“errno“: 600001, “errMsg“: “request:fail -2:net::ERR_FAILED“

bug现象 微信小程序体验版和真机调试 进入小程序的时候接口就出现了这个报错 "errno": 600001, "errMsg": "request:fail -2:net::ERR_FAILED" 排查 检查是证书过期还是证书链不完整 证书的信任链完整问题&#xff0c;可以在 亚数信息-SSL/TLS安…

Leetcode:283.移动零

题目要求 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0…

8、【构造者模式】适合于需要创建复杂对象的场景

你好&#xff0c;我是程序员。 今天我们来学习23种设计模式中的建造者模式。构造者模式是什么&#xff1f;有什么优缺点&#xff1f;使用场景&#xff0c;与工厂模式有什么区别&#xff1f;简单代码实现。 一、是什么&#xff1f; 建造者模式&#xff08;Builder Pattern&…

MySQL:MySQL的查询(上)

文章目录 MySQL的增加单行数据插入多行数据插入插入否则更新替换 MySQL的查询select列where语句 本篇开始总结的是MySQL当中的基本查询语句 对于数据库的查询&#xff0c;无非大致就是增删查改&#xff0c;因此对于这些内容进行一一解释&#xff1a; MySQL的增加 单行数据插…

鸿铭网创88计第49计:2024挂机托管项目, 单号躺赚4000+,无需发作品

项目概述&#xff1a; 这个副业项目极为适合忙碌却希望额外赚钱的伙伴们。核心是与平台合作&#xff0c;提供快手账号用于发布视频&#xff0c;视频中会嵌入推广链接。当有用户通过这些链接下载应用时&#xff0c;我们就能获得拉新佣金。 项目 地 址 &#xff1a; laoa1.cn/…

Json和Qt中Json的使用学习笔记

视频链接 https://www.bilibili.com/video/BV1yf4y1A7ek/?p2&spm_id_frompageDriver&vd_sourcefa4ef8f26ae084f9b5f70a5f87e9e41b Json JSON是在网络传输中常用的数据格式&#xff0c;能将不同类型的数据统一起来&#xff0c;我们在发送数据前将不同类型的数据存入到…

关于Git的一些基础用法

关于Git的一些基础用法 1. 前言2. 使用GitHub/gitee创建项目2.1 创建账号2.2 创建项目2.3 下载仓库到本地2.4 提交代码到远端仓库2.5 查看日志2.6 同步远端仓库和本地仓库 1. 前言 首先说一个冷知识&#xff08;好像也不是很冷&#xff09;&#xff0c;Linux和git的创始人是同…