(三)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.hqwc.cn/news/615838.html

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

相关文章

潍微科技-水务信息管理平台 ChangePwd SQL注入漏洞复现(CNVD-2024-14945)

0x01 产品简介 水务信息管理平台主要帮助水务企业实现水质状态监测、管网运行监控、水厂安全保障、用水实时监控以及排放有效监管,确保居民安全稳定用水、环境有效保护,全面提升水务管理效率。由山东潍微科技股份有限公司研发,近年来,公司全力拓展提升水务、水利信息化业务…

37% 的公开共享文件暴露个人信息

许多存储在 Google Drive、Slack 和其他协作工作应用程序等平台上的敏感文档几个月甚至几年都无人看管。根据 Metomic 的“金融服务数据安全状况”报告&#xff0c;这给公司带来了数据蔓延的挑战&#xff0c;也给个人及其雇主带来了重大的数据安全威胁。 86% 的文件在 90 天内…

AI赋能晨光文具,破解轻工业大规模生产品控难题

在制造业的浪潮中&#xff0c;晨光圆珠笔以其年产量约50亿支的庞大规模&#xff0c;稳坐行业前列。然而&#xff0c;每一支笔的完美出品&#xff0c;背后都离不开严格的品质把控。在装盒包装之前&#xff0c;每一支笔都要接受细致的外观检查&#xff0c;以确保产品质量的无懈可…

C++11 设计模式4. 抽象工厂(Abstract Factory)模式

问题的提出 从前面我们已经使用了工厂方法模式 解决了一些问题。 现在 策划又提出了新的需求&#xff1a;对于各个怪物&#xff0c;在不同的场景下&#xff0c;怪物的面板数值会发生变化&#xff0c; //怪物分类&#xff1a;亡灵类&#xff0c;元素类&#xff0c;机械类 …

淘宝批量采集商品详情数据(属性丨详情图丨sku丨价格等)

淘宝批量采集商品详情数据&#xff08;包括属性、详情图、SKU、价格等&#xff09;可以通过以下几种方式实现&#xff1a; 使用淘宝数据抓取工具&#xff1a;这类工具&#xff0c;如某鱼等&#xff0c;能够自动化采集淘宝商品数据&#xff0c;并将其转换成CSV、Excel等格式&am…

Flutter中间镂空的二维码扫描控件

1、UI效果图&#xff1a; 2、中间镂空UI&#xff1a; class CenterTransparentMask extends CustomClipper<Path> {final double? width;CenterTransparentMask({this.width});overridePath getClip(Size size) {final path Path()..addRect(Rect.fromLTWH(0, 0, size…

34-5 CSRF漏洞 - CSRF分类

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 1)GET 类型 传参: 参数连接在URL后面 POC构造及执行流程: 构造URL,诱导受害者访问点击利用利用标签进行攻击: 构造虚假URL,在链接上添加payload抓包获取数据包,通过CSRF POC…

【日常记录】【CSS】生成动态气泡小球

文章目录 1、分析2、实现 1、分析 核心有两点&#xff0c;通过这两个不一样就可以实现每个小球的颜色、动画时间不一致 给每个元素都设置一个css 变量 bgc 用于控制每一个小球的颜色给每个元素都设置一个css 变量 duration 用于控制每一个小球的时间 2、实现 <!DOCTYPE ht…

王道C语言督学营OJ课后习题(课时17)

#include <iostream> #include <stdlib.h> #include <time.h> #include <stdio.h> typedef int ElemType; typedef struct {ElemType *elem;int TableLen; }SSTable; void Init_ST(SSTable &ST,int len)//申请空间&#xff0c;并进行随机数生成 {S…

研发岗-面临统信UOS系统配置总结

第一步 获取root权限 配置环境等都需要用到root权限&#xff0c;所以我们先获取到root权限&#xff0c;方便下面的操作 下载软件 在UOS应用商店下载的所需应用 版本都比较低 安装node 官网下载了【arm64】的包&#xff0c;解压到指定文件夹&#xff0c;设置链接&#xff0…

前端css笔记(pink老师)

css css书写顺序 自适应屏幕 html { width: 100%; height: 100%; display: table; } body { display: table-cell; } 用了这个方法以后&#xff0c;如果希望页面内的盒子也适应屏幕大小&#xff0c;则使用以下方法&#xff0c;会根据父亲的宽高计算出该盒子的宽高 width:xx%; …

蓝桥杯物联网竞赛_STM32L071KBU6_全部工程及国赛省赛真题及代码

包含stm32L071kbu6全部实验工程、源码、原理图、官方提供参考代码及国、省赛真题及代码 链接&#xff1a;https://pan.baidu.com/s/1pXnsMHE0t4RLCeluFhFpAg?pwdq497 提取码&#xff1a;q497