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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟TED演讲学英文:The dark side of competition in AI by Liv Boeree

The dark side of competition in AI Link: https://www.ted.com/talks/liv_boeree_the_dark_side_of_competition_in_ai Speaker:Liv Boeree Date: October 2023 文章目录 The dark side of competition in AIIntroductionVocabularyTranscriptSummary后记 Introduction Co…

react 初学增删改查购物车案例

界面 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>react-购物车案例</title><…

[MQTT]Mosquitto的簡介、安裝與本機連接測試

MQTT(Message Queuing Telemetry Transport)是基於發布/訂閱模式(Publish/Subscribe)的輕量級網絡通訊協議&#xff0c;專用於在低帶寬、不可靠的網絡環境中傳輸數據&#xff0c;關於工作原理和優點如下: 1.發布/訂閱模式(Publish/Subscribe) 發布者將消息發布特定的主題(top…

MIPI CSI-2 虚拟通道

一、背景 在介绍虚拟通道之前&#xff0c;我们先描述一个场景&#xff0c;主控芯片只有 4 个 D-PHY VIN 接口&#xff0c;但是产品需要4 个以上的摄像头。 如上图所示&#xff0c;如果我们把摄像头和主控芯片直接通过 D-PHY 接口连接&#xff0c;最多只能接 4 个摄像头&#x…

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…

Linux 系统解压缩文件

Linux系统&#xff0c;可以使用unzip命令来解压zip文件 方法如下 1. 打开终端&#xff0c;在命令行中输入以下命令来安装unzip&#xff1a; sudo apt-get install unzip 1 2. 假设你想要将zip文件解压缩到名为"target_dir"的目录中&#xff0c;在终端中切换到目标路…

ActiveMQ介绍及linux下安装ActiveMQ

ActiveMQ介绍 概述 ActiveMQ是Apache软件基金下的一个开源软件&#xff0c;它遵循JMS1.1规范&#xff08;Java Message Service&#xff09;&#xff0c;是消息队列服务&#xff0c;是面向消息中间件&#xff08;MOM&#xff09;的最终实现&#xff0c;它为企业消息传递提供高…

基于腾讯云手把手教你搭建网站全流程,2024年最新建站教程

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com整理使用腾讯云服务器建站教程&#xff0c;…

2011年认证杯SPSSPRO杯数学建模B题(第一阶段)生物多样性的评估全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 B题 生物多样性的评估 原题再现&#xff1a; 2010 年是联合国大会确定的国际生物多样性年。保护地球上的生物多样性已经越来越被人类社会所关注&#xff0c;相关的大规模科研和考察计划也层出不穷。为了更好地建立国际交流与专家间的合作&…

sql注入技术总结

Sql注入判断数据库类型 Mysql注入 如果对应的表&#xff0c;列名爆不出来&#xff0c;可以尝试用字符转16进制转化。 相关函数&#xff1a; system_user() 系统用户名 user() 用户名 current_user 当前用户名 session_user()连接数据库的用户名 database() 数据库名 ver…

5G Frequency Bands 频率分布

连接&#xff1a;https://www.5g-networks.net/5g-technology/5g-frequency-bands/

项目5-博客系统1(准备工作+博客列表+博客详情页)

1.创建项目 导入以下依赖 2.项目介绍 使⽤SSM框架实现⼀个简单的博客系统 共5个页面 2.1 前端页面展示 2.1.1 用户登录 2.1.2 博客发表页 2.1.3 博客编辑页 2.1.4 博客列表页 2.1.5博客详情页 2.2 功能描述: ⽤⼾登录成功后, 可以查看所有⼈的博客. 点击 <<查看全⽂…

CSS基础+基本选择器和复合选择器(如果想知道CSS的基础+基本选择器和复合选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;在我们学习完了html之后&#xff0c;我们就要开始学习三大件中的第二件—CSS&#xff0c;CSS 可以控制多重网页的样式和布局&#xff0c;也就是将我们写好的html代码加上一层华丽的衣裳&#xff0c;使网页变得更加精美。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨…

uni-app如何生成骨架屏

为什么需要骨架屏&#xff1a;为了缓解用户打开程序时等待接口的焦虑情绪 1.打开微信开发者工具&#xff0c;找到模拟器中的页面信息&#xff0c;选择生成骨架屏 2.将生成的wxml代码复制到vscode&#xff0c;在index的components中新建一个vue文件&#xff0c;只需保留请求接口…

RPA实战演练UiBot6.0新食堂一楼问卷星(类似于之前的网页表单提交)

要使用RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;帮助新食堂进行调查问卷&#xff0c;我们可以结合UiBot 6.0来实施具体的计划。以下是一个大致的实战演练计划&#xff1a; 一、目标与需求分析 明确调查目标&#xff1a;了解新食堂…

CentOS7里ifcfg-eth0文件不存在解决方案/Centos7修改网络IP解决方案

Centos7网络IP地址手动设置 1、centos7没有ifcfg-eth0&#xff0c;我的centos7也没有其他博客说的什么ifcfg-ens33、ifcfg-ens32&#xff0c;然后我打开了我这里的ifcfg-eno***&#xff0c;结果发现就是centos6里的ifcfg-eth0里的网络配置。2、vim ifcfg-eno***&#xff08;按t…

34. UE5 RPG实现鼠标点击移动

在前面&#xff0c;我们实现过使用键盘按键wasd去实现控制角色的移动&#xff0c;现在&#xff0c;我们实现了InputAction按键触发&#xff0c;后面&#xff0c;实现一下通过鼠标点击地面实现角色移动。 我们将实现两种效果的切换&#xff0c;如果你点击地面快速松开&#xff0…

突破编程_前端_SVG(circle 圆形)

1 circle 元素的基本属性和用法 SVG 的 <circle> 元素用于在SVG文档中绘制圆形。它具有几个基本属性&#xff0c;允许定义圆形的大小、位置、填充颜色和边框样式。以下是 <circle> 元素的基本属性及其详细解释&#xff1a; 1.1 cx 和 cy 描述&#xff1a;这两个…

Docker容器嵌入式开发:Docker Ubuntu18.04配置mysql数据库

在 Ubuntu 18.04 操作系统中安装 MySQL 数据库的过程。下面是安装过程的详细描述&#xff1a; 首先&#xff0c;使用以下命令安装 MySQL 服务器&#xff1a; sudo apt install mysql-server系统会提示是否继续安装&#xff0c;按下 Y 键确认。 安装过程中&#xff0c;系统会…

模板进阶 | 非类型模板参数 | 类模板的特化 | 模板的分离编译 | 模板的优缺点

非类型模板参数 我们可以认为非类型模板参数就是一个常量&#xff0c;在我们的类里面我们是不能对它进行改造 为什么会有这样的场景&#xff0c;其次就是C语言那里我们一般使用什么。 场景1 #include<iostream> using namespace std;#define N 10 template<class T…