本文是我的 FFMPEG Tips 系列的第五篇文章,准备介绍下 ffmpeg 提供的一个非常好用的健值对工具:AVDictionary,特别是对于没有 map 容器的 c 代码,可以充分利用它来配置和定义播放器的参数,ffmpeg 本身也有很多 API 通过它来传递参数。

1.  AVDictionary 的用法简介

AVDictionary 所在的头文件在 libavutil/dict.h,其定义如下:

  1. struct AVDictionary {
  2. int count;
  3. AVDictionaryEntry *elems;
  4. };

其中,AVDictionaryEntry 的定义如下:

  1. typedef struct AVDictionaryEntry {
  2. char *key;
  3. char *value;
  4. } AVDictionaryEntry;

下面就用示例的方式简单介绍下用法

(1)创建一个字典

  1. AVDictionary *d = NULL;

(2) 销毁一个字典

  1. av_dict_free(&d);

(3)添加一对 key-value

  1. av_dict_set(&d, "name", "jhuster", 0);
  2. av_dict_set_int(&d, "age", "29", 0);

(4) 获取 key 的值

  1. AVDictionaryEntry *t = NULL;
  2. t = av_dict_get(d, "name", NULL, AV_DICT_IGNORE_SUFFIX);
  3. av_log(NULL, AV_LOG_DEBUG, "name: %s", t->value);
  4. t = av_dict_get(d, "age", NULL, AV_DICT_IGNORE_SUFFIX);
  5. av_log(NULL, AV_LOG_DEBUG, "age: %d", (int) (*t->value));

(5) 遍历字典

  1. AVDictionaryEntry *t = NULL;
  2. while ((t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX))) {
  3. av_log(NULL, AV_LOG_DEBUG, "%s: %s", t->key, t->value);
  4. }

2.  ffmpeg 参数的传递

ffmpeg 中很多 API 都是靠 AVDictionary 来传递参数的,比如常用的:

  1. int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);

最后一个参数就是 AVDictionary,我们可以在打开码流前指定各种参数,比如:探测时间、超时时间、最大延时、支持的协议的白名单等等,例如:

  1. AVDictionary *options = NULL;
  2. av_dict_set(&options, “probesize”, “4096", 0);
  3. av_dict_set(&options, “max_delay”, “5000000”, 0);
  4. AVFormatContext *ic = avformat_alloc_context();
  5. if (avformat_open_input(&ic, url, NULL, &options) < 0) {
  6. LOGE("could not open source %s", url);
  7. return -1;
  8. }

那么,我们怎么知道 ffmpeg 的这个 API 支持哪些可配置的参数呢 ?

我们可以查看 ffmpeg 源码,比如 avformat_open_input 是结构体 AVFormatContext 提供的 API,在 libavformat/options_table.h 中定义了 AVFormatContext 所有支持的 options 选项,如下所示:

https://www.ffmpeg.org/doxygen/trunk/libavformat_2options__table_8h-source.html

同理,AVCodec 相关 API 支持的 options 选项则可以在 libavcodec/options_table.h 文件中找到,如下所示:

https://www.ffmpeg.org/doxygen/3.1/libavcodec_2options__table_8h_source.html

3.  小结

当然,我们也可以仿照 ffmpeg,给自己的核心结构体对象定义这样的 options 选项,这篇文章就不展开详述了。

http://blog.csdn.net/encoder1234/article/details/54582676

如何利用 AVDictionary 配置参数(转)的更多相关文章

  1. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  2. reids配置参数详解

    转自:http://www.jb51.net/article/60627.htm reids配置参数详解 #daemonize no  默认情况下, redis 不是在后台运行的,如果需要在后台运行, ...

  3. Redis配置参数详解

    Redis配置参数详解 /********************************* GENERAL *********************************/ // 是否作为守护进 ...

  4. Spark配置参数详解

    以下是整理的Spark中的一些配置参数,官方文档请参考Spark Configuration. Spark提供三个位置用来配置系统: Spark属性:控制大部分的应用程序参数,可以用SparkConf ...

  5. 2、haproxy配置参数详解

    代理相关配置参数 内容参考自马哥教育 HAProxy官方文档 https://cbonte.github.io/haproxy-dconv/2.0/configuration.html URI Syn ...

  6. 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  7. redis.windows.conf各项配置参数介绍 (九)

    # 默认情况下,redis不是在后台模式运行的,如果需要在后台进程运行,把该项的值更改为yes,默认为no daemonize:是否以后台daemon方式运行 # 如redis服务以后台进程运行的时候 ...

  8. 29个酷炫的Firefox配置参数

    你可能安装了许多的firefox插件以增加浏览器的功能,但是如果你想更好地使用firefox,学习如何配置about:config参数是很有必要的. about:config配置页包含了所有的fire ...

  9. IDEA02 利用Maven创建Web项目、为Web应用添加Spring框架支持、bean的创建于获取、利用注解配置Bean、自动装配Bean、MVC配置

    1 环境版本说明 Jdk : 1.8 Maven : 3.5 IDEA : 专业版 2017.2 2 环境准备 2.1 Maven安装及其配置 2.2 Tomcat安装及其配置 3 详细步骤 3.1 ...

随机推荐

  1. JS地址自动返填技术

    系统设计地址为省市县三级联动,规范是规范了,但是无形中增加了系统操作的时间成本,因此设计地址自动返填技术,只要把地址拷贝到详细地址框中,可以自动返填到省市县三级联动的下拉框中. 还好洒家的大学不是混过 ...

  2. Python3:sqlalchemy对sybase数据库操作,非sql语句

    Python3:sqlalchemy对sybase数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- c ...

  3. mybatis的namespace

    Mybatis的namespace是用来绑定Dao接口的,使用了namespace之后就可以不用写接口实现类,dao接口的方法对应mapper.xml中的sql语句. 详情见:https://blog ...

  4. cuda8.0 出错:/usr/bin/ld: 找不到 -lGL【转】

    本文转自:https://blog.csdn.net/u010159842/article/details/56833030 最近在学习深度学习,在搭建CUDA8.0的时候,出现一个非常不好的问题: ...

  5. ACM赛前准备——模板(排版篇)

    ACM赛前准备--模板(排版篇) 更新 前言 效果演示 封面 目录页 模板页(不分栏) 模板页(分栏) 结果文件 快速使用 准备工作 安装TexLive (可选)安装minted包 创建模板 文件结构 ...

  6. Redis之Set 集合

    Redis Set 集合 Set 就是一个集合,集合的概念就是一堆不重复值的组合.利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据. 比如在 微博应用中,可以将一个用户所有的关注人 ...

  7. Axios 使用采坑经验

    报错信息:Uncaught (in promise) DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL 解 ...

  8. UVa 10791 最小公倍数的最小和(唯一分解定理)

    https://vjudge.net/problem/UVA-10791 题意: 输入整数n,求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小. 思路: 首先对n进行质因数分解,举个例子 ...

  9. JAVA基础之复识一

    JAVA不单是一门计算机编程语言,而且还是一种基于WEB的全方位软件开发技术, java特定运行平台及关键特点 java开发工具包的安装,配置与应用 java语言的基本概念 java面向对象编程 ja ...

  10. BZOJ 3527 【ZJOI2014】 力

    题目链接:力 听说这道题是\(FFT\)板子题,于是我就来写了…… 首先可以发现这个式子:\[E_i=\sum_{j<i}\frac{q_j}{(i-j)^2}-\sum_{j>i}\fr ...