当前位置: 首页 > 编程日记 > 正文

FFmpeg中AVDictionary介绍

FFmpeg中的AVDictionary是一个结构体,简单的key/value存储,经常使用AVDictionary设置或读取内部参数,声明如下,具体实现在libavutil模块中的dict.c/h,提供此结构体是为了与libav兼容,但它实现效率低下,在FFmpeg 4.1.3版本中已弃用(deprecated),推荐使用libavutil模块中的tree.c/h来替代,但是在一些代码中或API中还是会使用到AVDictionary,包括FFmpeg中的examples,因此这里整理介绍下AVDictionary用法。

typedef struct AVDictionaryEntry {char *key;char *value;
} AVDictionaryEntry;struct AVDictionary {int count;AVDictionaryEntry *elems;
};

1. 一个空字典:AVDictionary* dict = nullptr;

2. 由指定的key获取一个字典条目(dictionary entry):av_dict_get

3. 获取字典条目数:av_dict_count

4. 设置一个字典条目,value为const char*:av_dict_set

5. 设置一个字典条目,value为int:av_dict_set_init,此函数内部会将int转为char*,然后再调用av_dict_set

6. 解析key/value对列表,并将解析的条目添加到字典中:av_dict_parse_string

7. 将条目从一个字典拷贝到另一个字典:av_dict_copy

8. 释放为AVDictonary结构分配的内存以及所有的key/value:av_dict_free

9. 以字符串形式获取一个字典条目:av_dict_get_string

10. av_dict_*中有些接口的最后一个参数为int flags,此参数可接受的有效值为在dict.h文件中定义的宏:

(1). AV_DICT_MATCH_CASE:设置字典中检索的key区分大小写,默认不区分大小写

(2). AV_DICT_IGNORE_SUFFIX:忽略字典中指定条目key的后缀

(3). AV_DICT_DONT_STRDUP_KEY:若key已分配,则不进行复制

(4). AV_DICT_DONT_STRDUP_VAL:若value已分配,则不进行复制

(5). AV_DICT_DONT_OVERWRITE:若指定key在字典中已存在,则不进行覆盖

(6). AV_DICT_APPEND:若指定key在字典中已存在,则value直接拼接到已存在value值的后面

(7). AV_DICT_MULTIKE:允许在字典中存储多个相同的key

FFmpeg中有些API都是通过AVDictionary来设置/读取内部参数的,如avformat_open_input,可设置video size、input format等,其使用可参见https://blog.csdn.net/fengbingchun/article/details/93975844

libavformat模块的options_table.h文件中列出了AVFormatContext支持的options选项;libavcodec模块的options_table.h文件中列出了AVCodecContext支持的options选项。

注:有时设置的参数会无效

测试代码如下(test_ffmpeg_libavutil.cpp):

#include "funset.hpp"
#include <string.h>
#include <iostream>
#include <string>
#include <memory>
#include <vector>#ifdef __cplusplus
extern "C" {
#endif#include <libavutil/dict.h>
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>#ifdef __cplusplus
}
#endifint test_ffmpeg_libavutil_avdictionary()
{
{AVFormatContext* format_ctx = avformat_alloc_context();const char* url = "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov";int ret = -1;AVDictionary* dict = nullptr;av_dict_set(&dict, "max_delay", "100", 0);ret = avformat_open_input(&format_ctx, url, nullptr, &dict);if (ret != 0) {fprintf(stderr, "fail to open url: %s, return value: %d\n", url, ret);return -1;}fprintf(stdout, "dictionary count: %d\n", av_dict_count(format_ctx->metadata));AVDictionaryEntry* entry = nullptr;while ((entry = av_dict_get(format_ctx->metadata, "", entry, AV_DICT_IGNORE_SUFFIX))) {fprintf(stdout, "key: %s, value: %s\n", entry->key, entry->value);}avformat_free_context(format_ctx);av_dict_free(&dict);
}{ // reference: https://ffmpeg.org/doxygen/4.1/group__lavu__dict.htmlAVDictionary* d = nullptr; // "create" an empty dictionaryAVDictionaryEntry* t = nullptr;av_dict_set(&d, "foo", "bar", 0); // add an entrychar* k = av_strdup("key"); // if your strings are already allocated, you can avoid copying them like thischar* v = av_strdup("value");av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);fprintf(stdout, "dictionary count: %d\n", av_dict_count(d));while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {fprintf(stdout, "key: %s, value: %s\n", t->key, t->value); // iterate over all entries in d}av_dict_free(&d);
}{avdevice_register_all();AVDictionary* options = nullptr;
#ifdef _MSC_VERconst char* input_format_name = "vfwcap";const char* url = "";
#elseconst char* input_format_name = "video4linux2";const char* url = "/dev/video0";av_dict_set(&options, "video_size", "640x480", 0);av_dict_set(&options, "input_format", "mjpeg", 0);
#endifAVInputFormat* input_fmt = av_find_input_format(input_format_name);AVFormatContext* format_ctx = avformat_alloc_context();int ret = avformat_open_input(&format_ctx, url, input_fmt, &options);if (ret != 0) {fprintf(stderr, "fail to open url: %s, return value: %d\n", url, ret);return -1;}fprintf(stdout, "dictionary count: %d\n", av_dict_count(format_ctx->metadata));AVDictionaryEntry* entry = nullptr;while ((entry = av_dict_get(format_ctx->metadata, "", entry, AV_DICT_IGNORE_SUFFIX))) {fprintf(stdout, "key: %s, value: %s\n", entry->key, entry->value);}av_dict_free(&options);avformat_close_input(&format_ctx);
}return 0;
}

执行结果如下:

GitHub:https://github.com//fengbingchun/OpenCV_Test

相关文章:

RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个

问题现象RocketMQ3.2.2版本&#xff0c;测试时尝试发送消息时自动创建Topic&#xff0c;设置了队列数量为8&#xff1a;producer.setDefaultTopicQueueNums(8);同时设置broker服务器的配置文件broker.properties&#xff1a;defaultTopicQueueNums16但实际创建后从控制台及后台…

iOS各种宏定义

#ifndef MacroDefinition_h #define MacroDefinition_h //************************ 获取设备屏幕尺寸********************************************** //宽度 #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width //高度 #define SCREENH_HEIGHT [UIScree…

开源库libuuid简介及使用

libuuid是一个开源的用于生成UUID(Universally Unique Identifier&#xff0c;通用唯一标识符)的库&#xff0c;它的源码可从https://sourceforge.net/projects/libuuid/ 下载&#xff0c;最新版本为1.0.3&#xff0c;更新于2013年4月27日&#xff0c;此库仅支持在类Linux下编译…

深度学习会议论文不好找?这个ConfTube网站全都有

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | 刘畅 出品 | AI科技大本营&#xff08;ID:rgznai1000&#xff09;最近跟身边的硕士生、博士生聊天&#xff0c;发现有一个共同话题&#xff0c;大家都想要知道哪款产品能防止掉头发&#xff1f;养发育发已经成了茶余饭…

Java用for循环Map

为什么80%的码农都做不了架构师&#xff1f;>>> 根据JDK5的新特性,用For循环Map,例如循环Map的Key for(String dataKey : paraMap.keySet()) { System.out.println(dataKey ); } 注意的是,paraMap 是怎么样定义的,如果是简单的Map paraMap new …

iOS 应用发布到AppStore流程

iOS开发者&#xff0c;把开发出来的App上传到App Store是必须的。下面就来详细介绍下具体流程。 方法/步骤 1打开苹果开发者中心 打开后点击&#xff1a;Member Center 2如果你的电脑没有保存密码&#xff0c;则会提示你输入开发者帐号和密码&#xff0c;因为我的电脑已经保存了…

FFmpeg中编码类型为rawvideo无须解码直接显示测试代码

在 https://blog.csdn.net/fengbingchun/article/details/93975325 中介绍过通过FFmpeg可以直接获取usb视频流并解码显示的测试代码&#xff0c;当时通过usb获取到的视频流编码类型为AV_CODEC_ID_RAWVIDEO&#xff0c;像素格式为AV_PIX_FMT_YUYV422&#xff0c;其实编码类型为r…

一场高质量的技术盛会怎样炼成?「2019中国大数据技术大会」蓄势待发,还不快上车?...

2019年12月&#xff0c;一场轰动国内产业界、学术界、科研界及投资领域的顶级科技盛会即将拉开帷幕&#xff0c;它涵盖大数据、人工智能、云计算、AIoT、金融科技、智能制造等十几个前沿领域的热门话题。在过去十二年里&#xff0c;这场盛会从最初仅 60 余人参加的技术沙龙到如…

融合应用11.1.8安装,一步一步的引导

融合应用11.1.8安装,一步一步的引导 融合应用11.1.8 安装并不是简单的与电子商务套件11 i / R12安装。 所以我们需要安装划分为许多步骤。 请注意,11.1.8 11.1.7总统发布供应是几乎相同的。 在同一时间的步骤和一些组件11.1.6和11.1.5相比有所不同。 这里我们有实际使用同一个…

FFmpeg中一个线程获取视频流一个线程执行scale测试代码

在https://blog.csdn.net/fengbingchun/article/details/94712986 中介绍过如果usb视频流编码类型为rawvideo则无需进行解码&#xff0c;可直接通过av_read_frame获取视频流然后再通过sws_scale进行像素格式转换&#xff0c;当在高分辨率情况下&#xff0c;有时达不到实时显示&…

医疗影像处理:去除医疗影像中背景的影响2D/3D【numpy-code】| CSDN博文精选

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | chestnut--来源 | CSDN博客在医疗影像中特别是CT影像&#xff0c;包含大量的背景&#xff0c;在进行器官分割时&#xff0c;首先去除背景对分割的效果有很好的提升。本博客使用Python处理医疗影像并去除背景的影像。使…

iOS APP提交上架最新流程

iOS APP提交上架最新流程 反复提交的过程中对上架流程熟悉了好多&#xff0c;写篇帖子送给同为菜鸟的你&#xff0c;如果里面有很菜的东西&#xff0c;大牛请自动忽略&#xff0c;毕竟这也是还为菜鸟的我的备忘录呢&#xff01; 首先得描述一下各个证书的定位&#xff0c;作…

Spring mvc Data Redis—Pub/Sub(附Web项目源码)

一、发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候&#xff0c;我们称这个客户端为发布者(publisher)。 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候&#xff0c;我们称这个客户端为订阅者(subscriber)。 为了解耦发布者(publish…

iOS分析崩溃日志

前言 iOS分析定位崩溃问题有很多种方式&#xff0c;但是发布到AppStore的应用如果崩溃了&#xff0c;我们该怎么办呢&#xff1f;通常我们都会在系统中接入统计系统&#xff0c;在系统崩溃的时候记录下崩溃日志&#xff0c;下次启动时将日志发送到服务端&#xff0c;比较好的第…

海思3559A上编译FFmpeg源码操作步骤

1. 从https://github.com/FFmpeg/FFmpeg/releases 下载你需要的版本&#xff1b; 2. 因为ffmpeg编译选项较多&#xff0c;为了更方便的了解有哪些选项&#xff0c;可将编译选项写入到一个文本文件configure_help.txt中&#xff0c;执行&#xff1a; ./configure --help > …

不到顶会现场也能听论文讲解?这个视频集合网站值得收藏

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai1000&#xff09;最近跟身边的硕士生、博士生聊天&#xff0c;发现有一个共同话题&#xff0c;大家都想要知道哪款产品能防止掉头发&#xff1f;养发育发已经成了茶余饭…

通过cat /proc/cpuinfo看处理器特点

2019独角兽企业重金招聘Python工程师标准>>> 在我的服务器上执行cat /proc/cpuinfo得到如下信息&#xff08;摘录最后一项&#xff0c;从0-23共24项&#xff09;&#xff1a; processor: 23&#xff1a;超线程技术的虚拟逻辑核第24个 vendor_id: GenuineIntel&#…

2016cocoapods安装流程及使用

一&#xff1a;参考安装流程&#xff1a;http://blog.csdn.NET/showhilllee/article/details/38398119/。 二&#xff1a;我的安装步骤。 1:安装cocoapods需要ruby&#xff0c;先查看ruby环境是不是最新版本。如果不是最新版本&#xff0c;需要先升级到最新版本。在终端输入以下…

FFmpeg中拉取rtsp视频流并缩放显示测试代码

之前在https://blog.csdn.net/fengbingchun/article/details/92198857中给出过仅拉取rtsp视频流的测试代码&#xff0c;这里在此代码的基础上进行扩充&#xff0c;包括设置使用多线程进行解码&#xff0c;使用sws_scale函数进行图像格式转换和缩放&#xff0c;并通过OpenCV进行…

全面分析阿里数据中台,小白也能看懂 | CSDN原力计划

扫码参与CSDN“原力计划”作者 | yuanziok来源 | CSDN原力计划获奖作品数据中台被誉为大数据的下一站&#xff0c;由阿里兴起&#xff0c;核心思想是数据共享&#xff0c;2015年阿里提出“大中台&#xff0c;小前台”的策略。2018 年因为“腾讯数据中台论”&#xff0c;中台再度…

【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现

批处理是使GPU进行高效绘制的一种技术手段&#xff0c;也是整个渲染流程中最核心的技术&#xff0c;到目前为止我们并没有使用到这种技术手段&#xff0c;下面我们看看我们现在的渲染机制。 先想一想我们最开始是怎么向GPU绘制一幅图像的&#xff0c;可以回头查看Stage3D学习笔…

MBProgressHUD 使用详解

MBProgressHUD是一个显示HUD窗口的第三方类库&#xff0c;用于在执行一些后台任务时&#xff0c;在程序中显示一个表示进度的loading视图和两个可选的文本提示的HUD窗口。我想最多是应用在加载网络数据的时候。其实苹果官方自己有一个带有此功能的类UIProgressHUD&#xff0c;只…

V4L2获取usb视频流测试代码

Video4Linux2(Video for Linux Two, 简称V4L2)是Linux中关于视频设备的驱动框架&#xff0c;为上层访问底层的视频设备提供统一接口。V4L2主要支持三类设备&#xff1a;视频输入输出设备、VBI设备和Radio设备&#xff0c;分别会在/dev目录下产生videoX、vbiX和radioX设备节点&a…

深度学习渐趋冷静,为何图形计算却逆势反涨?

不知不觉&#xff0c;2019 年的进度条已经快撑不住了 ▓▓▓▓▓▓▓▓▓▓▓▓▓░░ 88%。就像这个进度条一样&#xff0c;人工智能的发展也绝不是一蹴而就的事&#xff0c;而是一步一个脚印逐渐发展&#xff0c;最后达成某个目标。近年来&#xff0c;深度学习领域的技术发展…

数字图像处理课设

2019独角兽企业重金招聘Python工程师标准>>> 对于整个窗体的设计&#xff0c;菜单组件&#xff08;MenuStrip)和工具条&#xff08;ToolStrip&#xff09;来添加相应的功能事件当然还有右击鼠标就能弹出相应的属性框&#xff0c;也是使用了叫contextMenuStrip的组件…

Swift3.0带来的变化汇总

var string "Hello-Swift" //获取某个下标后一个下标对应的字符 char"e" //swift2.2 //var char string[startIndex.successor()] //swift3.0 var char string[string.index(after: startIndex)] //获取某个下标前一个下标对应的字符 char2 "t&qu…

通过配置NFS使Ubuntu和海思3559A板子共享目录

之前在Ubuntu和海思3559A板子之间来回拷贝文件都是用的scp命令&#xff0c;不是很方便&#xff0c;这里通过配置NFS来实现它们之间共享目录&#xff0c;操作步骤如下&#xff1a; 1. 在Ubuntu上安装NFS&#xff0c;执行以下命令&#xff0c;执行结果如下&#xff1a; sudo ap…

22w+的人选择了这款蓝牙耳机

01现在有两个电子产品&#xff0c;应该是你们现在必有的&#xff0c;手机和电脑。但还有一样不可缺少的电子产品&#xff0c;那就是耳机。不管喜不喜欢带&#xff0c;反正你手里肯定有一个&#xff0c;应该没人不认可我说的这个话吧。反正我去哪都会带着耳机&#xff0c;听不听…

自定义数字格式字符串输出示例

自定义数字格式字符串输出示例 MSDN 下表阐释了通过给特定数据类型和值应用某些自定义数字格式字符串来创建的输出。输出是通过使用 ToString 方法和美国英语 (en-US) 区域性生成的。 “格式字符串”列指示格式字符串&#xff0c;“数据类型”列指示所用的数据类型&#xff0c;…

海思3559A上编译LIVE555源码操作步骤

1. 从http://www.live555.com/liveMedia/public/ 下载live.2019.06.28.tar.gz&#xff0c;并解压缩&#xff1b; 2. 生成静态库&#xff0c;拷贝一份config.armlinux&#xff0c;取名为config.hi3559a&#xff0c;修改后的内容如下: CROSS_COMPILE? /opt/hisi-linux/x86-ar…