FFMPEG学习【libavutil】:数据结构(四)

ffmpeg推流 av_dict_set 参数设置解析(降低延时、处理花屏、改善画面质量)(实时更新) 一、关于影响时延的参数设置 1.preset :指定编码的配置。x264编码算法有很多可供配置的参数,不同的参数值会导致编码的速度大相径庭,甚至可能影响质量。为了免去用户了解算法,然后手工配置参数的麻烦。x264提供了一些预设值,而这些预设值可以通过preset指定。这些预设值有包括:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast编码速度最快,但压缩率低,生成的文件更大,placeb 阅读详情

一、AVDictionary

简单键:值存储。

字典用于存储键:值对。 要创建一个AVDictionary,只需将一个NULL指针的地址传递给av_dict_set()。 NULL可以用作空字典,无论何处需要指向AVDictionary的指针。 使用av_dict_get()来检索一个条目或迭代所有条目,最后使用av_dict_free()来释放字典及其所有内容。

AVDictionary *d = NULL;           // "create" an empty dictionary
AVDictionaryEntry *t = NULL;
av_dict_set(&d, "foo", "bar", 0); // add an entry
char *k = av_strdup("key");       // if your strings are already allocated,
char *v = av_strdup("value");     // you can avoid copying them like this
av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {
    <....>                             // iterate over all entries in d
}
av_dict_free(&d);



一)、数据结构

struct   AVDictionaryEntry{
char * key;
char * value;
}


二)、宏

#define  AV_DICT_MATCH_CASE   1
只能获得一个具有完全匹配关键字的条目。


#define  AV_DICT_IGNORE_SUFFIX   2
返回字典中的第一个条目,其第一部分对应于搜索关键字,忽略找到的关键字串的后缀。


#define  AV_DICT_DONT_STRDUP_KEY   4
获取已分配给av_malloc()或另一个内存分配函数的密钥的所有权。


#define  AV_DICT_DONT_STRDUP_VAL   8
获取已经使用av_malloc()或另一个内存分配函数分配的值的所有权。


#define  AV_DICT_DONT_OVERWRITE   16
不要覆盖现有条目 。


#define  AV_DICT_APPEND   32
如果条目已经存在,请附加到该条目。


#define  AV_DICT_MULTIKEY   64
允许在字典中存储几个相等的键。


三)、函数

AVDictionaryEntry *  av_dict_get (const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
获取具有匹配键的字典条目。

返回的条目键或值不能更改,否则将导致未定义的行为。

要遍历所有字典条目,您可以将匹配键设置为空字符串“”,并设置AV_DICT_IGNORE_SUFFIX标志。

参数:prev:设置到先前匹配的元素以找到下一个。 如果设置为NULL,则返回第一个匹配元素。

  key:匹配键

  flags:控制如何检索条目的AV_DICT_ *标志的集合

返回:找到条目或NULL,以防在字典中找不到匹配条目


int  av_dict_count (const AVDictionary *m)
获取字典中的条目数。

参数:m:字典

返回:字典中的条目数


int  av_dict_set (AVDictionary **pm, const char *key, const char *value, int flags)
设置* pm中的给定条目,覆盖现有条目。

注意:如果设置了AV_DICT_DONT_STRDUP_KEY或AV_DICT_DONT_STRDUP_VAL,这些参数将被错误地释放。

警告:将新条目添加到字典会使先前使用av_dict_get返回的所有现有条目无效。

参数:pm:指向字典结构体的指针。 如果* pm为NULL,则会分配一个字典结构并放入* pm。

  key:添加到* pm的条目键(将根据标志为av_strduped或添加为新的键)

  value:条目值添加到* pm(将被av_strduped或添加为一个新的密钥取决于标志)。 传递NULL值将导致现有条目被删除。

返回:> = 0,否则为错误代码<0


int  av_dict_set_int (AVDictionary **pm, const char *key, int64_t value, int flags)
av_dict_set的便利包装器将值转换为字符串并存储。

注意:如果设置了AV_DICT_DONT_STRDUP_KEY,则键将被释放。


int  av_dict_parse_string (AVDictionary **pm, const char *str, const char *key_val_sep, const char *pairs_sep, int flags)
解析键/值对列表,并将解析的条目添加到字典中。

万一发生故障,所有成功设置的条目存储在* pm中。 您可能需要手动释放创建的字典。

参数:key_val_sep:一个0个终止的字符列表,用于将值与值分离

  pairs_sep:用于将两个对彼此分离的0个字符的字符列表

  flags:添加到字典时要使用的标志。 AV_DICT_DONT_STRDUP_KEY和AV_DICT_DONT_STRDUP_VAL将被忽略,因为键/值令牌将始终被复制。

返回:0成功,否则ERROR代码失败


int  av_dict_copy (AVDictionary **dst, const AVDictionary *src, int flags)
将条目从一个AVDictionary结构复制到另一个。

参数:dst:指向AVDictionary结构体的指针。 如果* dst为NULL,则此函数将为您分配一个结构,并将其放在* dst中

  src:指向源AVDictionary结构的指针

  flags:在* dst中设置条目时要使用的标志

注意:使用AV_DICT_IGNORE_SUFFIX标志读取元数据

返回:0成功,否则ERROR代码失败。 如果dst由此功能分配,则呼叫者应释放相关联的内存。


void  av_dict_free (AVDictionary **m)
释放分配给AVDictionary结构体的所有内存以及所有键和值。


int  av_dict_get_string (const AVDictionary *m, char **buffer, const char key_val_sep, const char pairs_sep)
以字符串形式获取字典条目。

创建一个包含字典条目的字符串。 这样的字符串可以传回给av_dict_parse_string()。

注意:字符串使用反斜杠('\')进行转义。

参数:m:字典

  buffer:将分配给字符串的缓冲区指针包含条目。 当不再需要时,调用者必须释放缓冲区。

  key_val_sep:用于将键与值分离的字符

  pairs_sep:用于将两个对彼此分开的字符

返回:> = 0成功,否定错误

警告:分隔符不能既不是“\”也不是“\ 0”。 他们也不一样。



二、AVTree

低复杂度树容器。

插入,移除,找到相等的,最大的,小于和小于大于所有都具有O(log n)最坏情况的复杂性。


一)、函数

struct AVTreeNode *  av_tree_node_alloc (void)
分配AVTreeNode。


void *  av_tree_find (const struct AVTreeNode *root, void *key, int(*cmp)(const void *key, const void *b), void *next[2])
找一个元素

参数:root:指向树的根节点的指针

  next:如果next不为NULL,则next [0]将包含上一个元素,next [1]将包含下一个元素。 如果不存在,则下一个对应的条目不变。

  cmp:比较功能用于比较树中的元素,API与标准C的qsort相同。保证第一个也只有第一个参数为cmp()将成为av_tree_find()的关键参数,因此如果用户想要 ,是不同的类型(如不透明的上下文)。

返回:如果树中没有这样的元素,则具有cmp(key,elem)== 0或NULL的元素。

参数:


void *  av_tree_insert (struct AVTreeNode **rootp, void *key, int(*cmp)(const void *key, const void *b), struct AVTreeNode **next)
插入或移除元素。

如果* next为NULL,则提供的元素将被删除(如果存在)。 如果* next为非NULL,则提供的元素将被插入,除非它已经存在于树中。

参数:rootp:指向树的根节点的指针的指针; 注意根节点在插入过程中可以改变,这是保持树平衡所必需的。

  key:指向要插入树中的元素键的指针

           next:用于分配和释放AVTreeNodes。 对于插入,用户必须将其设置为至少为av_tree_node_size字节大小的已分配和归零的对象。 如果av_tree_insert()已被使用,将会将其设置为NULL。 对于删除元素* next由用户设置为NULL,av_tree_insert()将其设置为用于已删除元素的AVTreeNode。 这允许使用扁平阵列,与许多已发现的元素相比,它们具有较低的开销。 您可能需要定义如下功能:

void *tree_insert(struct AVTreeNode **rootp, void *key,
                  int (*cmp)(void *key, const void *b),
                  AVTreeNode **next)
{
    if (!*next)
        *next = av_mallocz(av_tree_node_size);
    return av_tree_insert(rootp, key, cmp, next);
}
void *tree_remove(struct AVTreeNode **rootp, void *key,
                  int (*cmp)(void *key, const void *b, AVTreeNode **next))
{
    av_freep(next);
    return av_tree_insert(rootp, key, cmp, next);

   cmp:比较功能用于比较树中的元素,API与标准C的qsort相同

返回:如果没有插入,发现元素; 如果发生插入或删除,则返回任一键或NULL。 哪一个取决于树状态和实现。 你不应该假设它是代码中的一个或另一个。


void  av_tree_destroy (struct AVTreeNode *t)

void  av_tree_enumerate (struct AVTreeNode *t, void *opaque, int(*cmp)(void *opaque, void *elem), int(*enu)(void *opaque, void *elem))
对给定范围内的树中的所有元素应用enu(opaque,&elem)。

参数:cmp:对于范围以下的元素返回<0的比较函数,范围以上的元素返回> 0,范围内的元素返回== 0

注意:cmp函数应该使用与构造树相同的顺序。


二)、变量

const int  av_tree_node_size

从学龄前开始解读FFMPEG代码 之 AVDictionary结构体以及av_dict_set()相关函数 @[TOC]( 从学龄前开始解读FFMPEG代码 之 AVDictionary结构体以及av_dict_set()相关函数 ) 开始AVDictionary以及相关函数学习前想说的一些话 首先声明源码是我在github上直接clone并checkout到了4.2的版本。关于这个结构体以及后续的相关函数的说明可能会进行多次添加修改(在阅读源码的整体学习过程中真的随时都有可能更新自己的认知) 从AVDictionary开始 AVDictionary结构体其实是FFmpeg提供的用于存储键值对的结构体,使用该结构 阅读详情

相关推荐

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

在调用该函数时,需要先确定源图像和目标图像的尺寸、像素格式以及是否需要进行某些特定的处理(例如缩放、裁剪、旋转等),然后根据这些信息来设置相应的参数。这个函数是FFmpeg多媒体处理流程的起点,通常用于设置后续的解码、编码或其他处理步骤。:可选参数,指定与要查找的流相关的流的索引号。例如,如果要查找的视频流与音频流相关联,可以设置此参数为音频流的索引号。这些选项可以影响编解码器的打开过程或被用来设置特定格式的私有选项。:如果多个资源之间存在依赖关系,应按照正确的顺序释放资源,以避免未定义的行为。

m0_67254672的博客 2792

ffmpeg通过 av_dict_set 设置参数

ffmpeg 设置参数

dss875914213的博客 2480

FFMPEG中libavutil的软件架构是怎么样的?如何使用?

libavutil` 是 FFmpeg 项目中的一个支持库,它提供了一系列公共的实用函数和数据结构,这些函数和数据结构在 FFmpeg 的其他组件中广泛使用。`libavutil` 的目的是为编解码器、格式处理和过滤器提供通用的功能,以避免代码重复。

bai915290475的博客 1372

【FFmpeg笔记】05-AVDictionary使用介绍

1. AVDictionary 介绍 AVDictionary 是一种字典数据结构,可以简单理解为 key-value 集合。现在主要用于兼容 libav** 库,效率会比较低一些,官方推荐使用树形容器,见 tree.h 文件。 Audictionary 中的每个 item 可以当作为 AVDictionaryEntry 进行处理,AVDictionaryEntry 的声明如下: typedef struct AVDictionaryEntry { char *key; char *valu

eieihihi的专栏 3793

ffmpeg源码简析(十一)libavformat,libavcodec,libavutil

libavformatavformat.h 文件 定义识别文件格式和媒体类型库使用的宏、数据结构和函数,通常这些宏、数据结构和函数在此模块内相 对全局有效allformat.c 文件 简单的注册/初始化函数,把相应的协议,文件格式,解码器等用相应的链表串起来便于查找。cutils.c 文件 文件格式分析模块使用的两个工具类函数,都是对字符串的操作。file.c 把 file 当做类似

WangShuo的专栏 2357

多媒体编解码学习: ffmpeg(更新ffmpeg库使用方法)

文中内容部分参考大牛博客进行边操作边总结 一、ubuntu安装ffmpeg 1. 从ffmpeg官网:https://www.ffmpeg.org/download.html下载源代码,ffmpeg-3.1.2.tar.bz2 2. 解压文件   3. 安装步骤 进入解压目录:   配置makefile:   其中--enable-share生产动态链接库,编程

jayson_jang的专栏 5136

FFmpeg中libavutil库简介及测试代码

libavutil是一个实用库,用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。libavcodec和libavformat并不依赖此库。 以下是测试代码,包括base64, aes, des, hash, log, md5, sha, sha512, tea, twofish, xteaa。 funse...

网络资源是无限的 4475

FFmpeg入门详解之58:Libavutil详解:理论与实战

libavutil是一个实用库,用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。libavcodec和libavformat并不依赖此库。从FFmpeg官网的文档-libavutil来看,avutil主要有一下几种功能:数学函数字符串操作内存管理相关数据结构相关错误码及错误处理日志输出其他辅助信息,比如密钥、哈希值、宏、库版本、常量等AVLogParseUtil。

福优学苑@音视频+流媒体 1145

FFmpeg学习(三)-- libavutil 代码组成

FFmpeg libavutil

云梦居 3714

FFmpeg libavutil 深度剖析:万物之基

libavutil 是 FFmpeg 的零依赖基础设施层,所有上层库均依赖于它。本文深度剖析其内存管理、引用计数、媒体数据模型、选项系统、数学工具等核心子系统,所有代码引用均附文件路径与行号。

Chars 223

163种中草药图像数据集构建与ResNet-50迁移学习实战指南

在计算机视觉领域,高质量标注数据集是模型训练的基石,直接影响图像分类、目标检测等任务的性能。其核心原理在于为算法提供结构化的监督信号,通过深度学习模型学习从像素到语义的映射关系。构建此类数据集的技术价值在于解决了特定垂直领域(如中医药)数据稀缺的痛点,为AI技术落地提供了关键“燃料”。在应用场景上,标准化数据集广泛支撑着教学演示、算法验证和产业应用开发。本文聚焦于中草药识别这一细分领域,详细介绍了一个包含163种常见药材、经过多源聚合与清洗的图像数据集构建全过程,并提供了基于PyTorch和ResNet-5

weixin_33672400的博客 455

Libavutil详解:理论与实战

libavutil 是一个实用库,用于辅助多媒体编程,本文记录 libavutil 库学习及 demo 例程展示。libavutil 是一个实用库,用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。libavcodec 和 libavformat 并不依赖此库。数学函数字符串操作内存管理相关数据结构相关错误码及错误处理日志输出其他辅助信息,比如密钥、哈希值、宏、库版本、常量等AVLog。

明天你好的博客 2173

用友BIP培训资料-设计采购订单新增API接口开发

14.在子实体的String pkMeas = order_hhrSlave0VOJson.getString("pk_meas");Openapi路径:nccloud/api/pu/order_hhrmanage/order_hhrMaster/addAggOrder_hhrMasterVO。实现接口的开发部署,通过openAPI的test类,实现一条数据的插入。16.进入自己的Idea打开老师发的TestOpenApi并且编译完成后如下。12.编写检测是否字段中是否含有中文的方法。

m0_68497879的博客 1544

FFmpeg 头文件完美翻译之 libavutil 模块

众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内容很重要,为此,我对 FFmpeg 6.x 版本的头文件进行了翻译,方便大家阅读理解。相信我,通读一遍头文件的注释后,你的 FFmpeg 的代码库开发技能将更上一层。本文适用于有 FFmpeg 代码库开发基础,但想深入熟练使用的同学。同时也可以参考我的Github 仓库。

Leon_Chenl的博客 963

Android 13/14/15 默认授权应用权限的实现方法

Android版本修改方式实现原理13/14修改Permission.java将所有权限标记为Normal权限15修改DeviceIdleController.java + DefaultPermissionGrantPolicy.java监听应用安装并主动授权。

m0_60898338的博客 2911

KUKA机器人 - 从开机到自动运行

注1:本文仅代表本人对机器人使用的一些建议,在使用机器人前,还请详细阅读库卡机器人官方资料,道路千万条,安全第一条!!! 注2:技术有限,欢迎各位大大在阅读过程中发现各类问题,并且批评指正!!! 目录 一、准备工作 1. 机器人上电完成 2. 电脑安装Workvisual 二、学习手动移动机器人 三、项目配置 1. 设置机器人IP地址 2.电脑和机器人通过网线连接 3.查找并打开项目 4. 通讯配置 5. 项目上传 6. 检验IO配置 四、编程 1.新建程序 2. 程序...

yilunyao的博客 1万+

FFmpeg libavutil主要功能概述

0 引言 FFmpeg使用很久了,一直没有认真看过FFmpeg内部源码所提供的各种机制和功能。本文的主要目标是能够初步总结FFmpeg的avutil中所提供的功能。从FFmpeg官网的文档-libavutil来看,avutil主要有一下几种功能(顺序做了重排): 数学函数 字符串操作 内存管理相关 数据结构相关 错误码及错误处理 日志输出 其他辅助信息,比如密钥、哈希值、宏、库版本、常量等 ...

SurpassLi的专栏 78

虚拟机VMware Horizon Client与主机之间建立共享文件夹

因经常需要在虚拟机和主机之间传递一些日常文件,所以建立共享文件夹。 虚拟机中安装的系统为win10,主机中的系统为win10。 步骤: 第一步:先在虚拟机win10中新建文件夹(我重命名为“共享文件夹”),然后右键属性->共享->共享 进去之后点击自己的账户名 然后点共享。操作完成后,再返回属性界面就能看到该文件夹已经共享而且出现了共享链接,记下此链接。 第二步:回到主机桌面->此电脑->最上面计算机->添加一个网络位置- 点击下一步 然后自定义网络位置,下一步,如下图

AnChenliang_1002的博客 1万+

ffmpeg常用函数和数据结构

记录下ffmpeg常用的一些函数和数据结构环境:ffmpeg-6.1。

langzi113的专栏 1651

Pixhawk2.4.8接口及引脚定义

pixhawk2.4.8接口定义图解

加斯顿工程师的博客 8745

YOLOv11 改进入门篇 | 轻量级涨点技巧:GhostConv 替代普通卷积的实战指南

摘要: 本文介绍如何通过GhostConv改进YOLOv11,实现轻量化涨点。YOLOv11深度增加导致参数量、延迟和内存占用上升,GhostConv通过“本征特征+线性变换”策略,在精度几乎无损的情况下降低30%-50%计算量。文章详细解析GhostConv原理,对比普通卷积的参数量和FLOPs优势,并提供完整的代码级改造流程,包括模块实现、注册及网络配置。实验表明,该方法有效提升边缘端推理效率,适用于移动端等资源受限场景。

shrgegrb的博客 1655

ffmpeg获取时间方法(libavutil/time.c)

FFmpeg libavutil/time.c int64_t av_gettime_relative(void) { #if HAVE_CLOCK_GETTIME && defined(CLOCK_MONOTONIC) /* 如果有clock_gettime函数 和定义了CLOCK_MONOTONIC(从系统重启到现在所经过的时间) 就通过clock_gettime该函数...

mwsubt的博客 2969

微信小程序 - 强力解决播放视频卡顿问题,小程序使用video组件播放视频或第三方视频插件,会出现卡顿或者无法播放的各种奇怪问题(微信小程序苹果ios/安卓播放视频很卡不流畅、视频太长或文件大等情况)

微信小程序视频组件播放卡顿,微信小程序video组件出现无法播放或卡顿,微信小程序video组件播放时会出现卡顿,微信小程序使用video组件播放视频的时候,会出现卡顿或者无法播放的问题,微信小程序安卓视频播放卡顿问题,微信小程序苹果ios手机播放视频不流畅很卡,加cdn还是卡,uniapp播放视频会有明显的卡顿问题,video视频时卡顿不流畅问题,为什么video组件播放视频卡顿?苹果微信小程序通过video组件播放视频时卡顿,怎么解决?微信小程序video组件出现无法播放或卡顿,设置custom-cac

🏆 前端领域优质创作者 1万+

FFmpeg 学习(一):FFmpeg 简介

它提供了录制、转换以及流化音视频的完整解决方案。如果您之前没有阅读FFmpeg代码的经验,建议优先阅读libavformat、libavcodec以及libavutil下面的代码,它们提供了音视频开发的最基本功能,应用范围也是最广的。链接:https://zhuanlan.zhihu.com/p/568800000。链接:https://zhuanlan.zhihu.com/p/568800000。商业转载请联系作者获得授权,非商业转载请注明出处。商业转载请联系作者获得授权,非商业转载请注明出处。

yinshipin007的博客 3764

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ffmpeg数据结构简介

每个库的功能作用在 FFmpeg 的编译中可以编译出了6个so动态库:libavcodec.so libavfilter.so libavformat.so libavutil.so l...

音视频开发进阶 844

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

解决 symbol lookup error av_opt_child_class_iterate, version LIBAVUTIL_56

经查,是因为我安装了gimp, 它会在 /lib/x86_64-linux-gnu 安装了libavformat, libavcodec, LIBAVUTIL 等库,干扰了ffmpeg 的运行。这个错误是说,LIBAVUTIL_56 这个库中没有av_opt_child_class_iterate 函数声明,因为我的库都在/opt/ffmpeg_build/lib 目录下,用ldd ffmpeg 观察,保证其为正确链接就可以正常运行了!算是解决问题的经验,留存!

hjjdebug的专栏 2365

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: FFMPEG学习【libavutil】:数据结构(三)
下一篇: FFMPEG学习【libavutil】:视频相关
一世豁然
博客等级 码龄15年 1276粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值