Libavutil详解:理论与实战

文章目录

  • 前言
  • 一、Libavutil 简介
  • 二、AVLog 测试
    • 1、示例源码
    • 2、运行结果
  • 三、AVDictionary 测试
    • 1、示例源码
    • 2、运行结果
  • 四、ParseUtil 测试
    • 1、示例源码
    • 2、运行结果


前言

在这里插入图片描述
libavutil 是一个实用库,用于辅助多媒体编程,本文记录 libavutil 库学习及 demo 例程展示。


一、Libavutil 简介

libavutil 是一个实用库,用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。

libavcodec 和 libavformat 并不依赖此库

从 FFmpeg 官网的文档 -libavutil 来看, avutil 主要有以下几种功能:

  • 数学函数
  • 字符串操作
  • 内存管理相关
  • 数据结构相关
  • 错误码及错误处理
  • 日志输出
  • 其他辅助信息,比如密钥、哈希值、宏、库版本、常量等

FFmpeg 中 libavutil 的示例,目前包含:

  • AVLog
  • AVOption (AVClass)
  • AVDictionary
  • ParseUtil

二、AVLog 测试

AVLog 是 FFmpeg(音视频处理库)中的一个日志系统,用于记录和输出日志信息。它提供了一种可配置的方式,使开发者能够根据自己的需求控制日志输出的详细程度和目标。

AVLog 的设计目标是提供一个灵活和可扩展的日志系统,以便在音视频处理过程中记录各种事件、错误和调试信息。它可以用于调试和分析应用程序或库的运行时行为,特别是在处理音视频数据时。

AVLog 提供了多个日志级别,包括:

  • QUIET(静默):最低日志级别,不输出任何日志信息。
  • PANIC(紧急):当发生严重错误时触发,可能导致程序崩溃或不可恢复的错误。
  • FATAL(致命):当发生严重错误时触发,但程序可能还能继续执行。
  • ERROR(错误):记录错误信息,表示发生了一些操作失败或异常情况,但程序仍然可以继续执行。
  • WARNING(警告):记录警告信息,表示发生了一些潜在问题或不符合预期的情况。
  • INFO(信息):记录一般的信息,用于追踪应用程序的运行状态。
  • VERBOSE(详细):记录更详细的信息,用于调试和排查问题。
  • DEBUG(调试):记录详细的调试信息,包括函数调用、变量值等。

1、示例源码

#include <stdio.h>extern "C" {#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libavutil/opt.h"#include "libavutil/parseutils.h"#include "libavutil/avutil.h"
};void test_log(){/ av_register_all();AVFormatContext *pAVFmtCtx = NULL;pAVFmtCtx = avformat_alloc_context();printf("====================================\n");av_log(pAVFmtCtx,AV_LOG_PANIC, "Panic: Something went really wrong and we will crash now.\n");av_log(pAVFmtCtx,AV_LOG_FATAL, "Fatal: Something went wrong and recovery is not possible.\n");av_log(pAVFmtCtx,AV_LOG_ERROR, "Error: Something went wrong and cannot losslessly be recovered.\n");av_log(pAVFmtCtx,AV_LOG_WARNING, "Warning: This may or may not lead to problems.\n");av_log(pAVFmtCtx,AV_LOG_INFO, "Info: Standard information.\n");av_log(pAVFmtCtx,AV_LOG_VERBOSE, "Verbose: Detailed information.\n");av_log(pAVFmtCtx,AV_LOG_DEBUG, "Debug: Stuff which is only useful for libav* developers.\n");printf("====================================\n");avformat_free_context(pAVFmtCtx);
}int main(int argc, char* argv[])
{av_log_set_level(AV_LOG_DEBUG);test_log();return 0;
}
  • avformat_alloc_context():分配一个 AVFormatContext;
  • avformat_free_context():可用于释放上下文以及其中由框架分配的所有内容;
  • av_log():如果 level 小于或等于当前 av_log_level,则将指定的消息发送到日志。默认情况下,所有日志消息都发送到 stderr。可以通过设置不同的日志回调函数来更改此行为。

2、运行结果

====================================
====================================
[NULL @ 01e0fc40] Panic: Something went really wrong and we will crash now.
[NULL @ 01e0fc40] Fatal: Something went wrong and recovery is not possible.
[NULL @ 01e0fc40] Error: Something went wrong and cannot losslessly be recovered.
[NULL @ 01e0fc40] Warning: This may or may not lead to problems.
[NULL @ 01e0fc40] Info: Standard information.
[NULL @ 01e0fc40] Verbose: Detailed information.
[NULL @ 01e0fc40] Debug: Stuff which is only useful for libav* developers.

三、AVDictionary 测试

AVDictionary 是 FFmpeg(音视频处理库)中的一个字典结构,用于存储键值对的元数据信息。它提供了一种通用的方式来管理和操作多种类型的元数据,例如音视频流的元数据、编解码器的参数、封装格式的选项等。

AVDictionary 的设计目标是提供一种灵活和可扩展的数据结构,用于表示和传递各种元数据信息。它可以用于读取和写入多种音视频文件格式,并且支持动态添加、修改和查询字典中的元素。

AVDictionary 提供了一系列的函数来对字典进行操作,包括:

  • av_dict_set():向字典中添加或修改键值对。
  • av_dict_get():根据键查询字典中的值。
  • av_dict_count():获取字典中键值对的数量。
  • av_dict_copy():复制一个字典。
  • av_dict_free():释放字典及其内部分配的内存。

除了基本的操作函数外,AVDictionary 还支持迭代器遍历字典中的键值对,以及支持将字典转换为字符串格式进行打印或保存。

1、示例源码

#include <stdio.h>extern "C" {#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libavutil/opt.h"#include "libavutil/parseutils.h"#include "libavutil/avutil.h"
};void test_avdictionary(){AVDictionary *d = NULL;AVDictionaryEntry *t = NULL;av_dict_set(&d, "name", "zhangsan", 0);av_dict_set(&d, "age", "22", 0);av_dict_set(&d, "gender", "man", 0);av_dict_set(&d, "email", "www@www.com", 0);//av_strdup()char *k = av_strdup("location");char *v = av_strdup("Beijing-China");av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);printf("====================================\n");int dict_cnt = av_dict_count(d);printf("dict_count:%d\n",dict_cnt);printf("dict_element:\n");while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {printf("key:%10s  |  value:%s\n",t->key,t->value);}t = av_dict_get(d, "email", t, AV_DICT_IGNORE_SUFFIX);printf("email is %s\n",t->value);printf("====================================\n");av_dict_free(&d);
}int main(int argc, char* argv[])
{test_avdictionary();return 0;
}

2、运行结果

====================================
dict_count:5
dict_element:
key:      name  |  value:zhangsan
key:       age  |  value:22
key:    gender  |  value:man
key:     email  |  value:www@www.com
key:  location  |  value:Beijing-China
email is www@www.com
====================================

四、ParseUtil 测试

ParseUtil 提供了一些实用的函数和方法,用于解析和转换编解码器参数字符串,以及处理编解码器参数的操作。它主要用于解析编解码器的选项和参数,并将它们转换为适当的数据结构供 FFmpeg 使用。

一些常见的功能和用途包括:

  • 解析编解码器参数:ParseUtil 可以解析编解码器参数字符串,将其拆分为键值对或特定格式的数据。
  • 转换参数数据类型:它可以将参数字符串中的数值或其他特定格式的数据转换为适当的数据类型,如整数、浮点数等。
  • 构建编解码器参数结构:ParseUtil 可以根据解析的结果构建编解码器参数的数据结构,以便在 FFmpeg 中使用。
  • 错误处理:它提供了一些错误处理机制,用于检测和处理无效的参数字符串或错误的参数格式。

1、示例源码

#include <stdio.h>extern "C" {#include "libavcodec/avcodec.h"#include "libavformat/avformat.h"#include "libavutil/opt.h"#include "libavutil/parseutils.h"#include "libavutil/avutil.h"
};void test_parseutil(){char input_str[100] = {0};printf("========= Parse Video Size =========\n");int output_w = 0;int output_h = 0;strcpy(input_str, "1920x1080");av_parse_video_size(&output_w,&output_h,input_str);printf("w:%4d | h:%4d\n",output_w,output_h);//strcpy(input_str,"vga");//640x480(4:3)//strcpy(input_str,"hd1080");//high definitionstrcpy(input_str,"pal");//ntsc(N制720x480), pal(啪制720x576)av_parse_video_size(&output_w, &output_h, input_str);printf("w:%4d | h:%4d\n",output_w,output_h);printf("========= Parse Frame Rate =========\n");AVRational output_rational = {0,0};strcpy(input_str,"15/1");av_parse_video_rate(&output_rational,input_str);printf("framerate:%d/%d\n",output_rational.num,output_rational.den);strcpy(input_str,"pal");//fps:25/1av_parse_video_rate(&output_rational,input_str);printf("framerate:%d/%d\n",output_rational.num,output_rational.den);printf("=========== Parse Time =============\n");int64_t output_timeval;//单位:微妙, 1S=1000MilliSeconds, 1MilliS=1000MacroSecondsstrcpy(input_str,"00:01:01");av_parse_time(&output_timeval,input_str,1);printf("microseconds:%lld\n",output_timeval);printf("====================================\n");
}int main(int argc, char* argv[])
{test_parseutil();return 0;
}
  • av_parse_video_size():用于解析视频大小字符串并将其转换为对应的宽度和高度;
  • av_parse_video_rate():用于解析视频帧率字符串并将其转换为对应的帧率值;
  • av_parse_time():用于解析时间字符串并将其转换为对应的时间值(以微秒为单位)

2、运行结果

========= Parse Video Size =========
w:1920 | h:1080
w: 720 | h: 576
========= Parse Frame Rate =========
framerate:15/1
framerate:25/1
=========== Parse Time =============
microseconds:61000000
====================================

我的qq:2442391036,欢迎交流!


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

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

相关文章

智能优化算法应用:基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.战争策略算法4.实验参数设定5.算法结果6.参考…

对比两阶段提交,三阶段协议有哪些改进?

本文我们来讨论两阶段提交和三阶段提交协议的过程以及应用。 在分布式系统中&#xff0c;各个节点之间在物理上相互独立&#xff0c;通过网络进行沟通和协调。在关系型数据库中&#xff0c;由于存在事务机制&#xff0c;可以保证每个独立节点上的数据操作满足 ACID。但是&…

WMMSE方法的使用笔记

标题很帅 原论文的描述WMMSE的简单应用 无线蜂窝通信系统的预编码设计问题中&#xff0c;经常提到用WMMSE方法设计多用户和速率最大化的预编码&#xff0c;其中最为关键的一步是将原和速率最大化问题转化为均方误差最小化问题&#xff0c;从而将问题由非凸变为关于三个新变量的…

Zabbix“专家坐诊”第214期问答汇总

问题一 Q&#xff1a;Zabbix 6.4版本&#xff0c;如图&#xff0c;95th percentable这个值是否会存到zabbix的数据库里&#xff1f;如果存了是存到了哪里&#xff1f; A&#xff1a;这个值是不会保存到数据库里的&#xff0c;它会根据所选的时间段而变化。 问题二 Q&#xff1…

5分钟搞懂ECN

ECN是通过在IP和TCP头中携带拥塞信息&#xff0c;通知发送方网络拥塞状态&#xff0c;从而采取相应拥塞控制措施。原文: What is ECN(Explicit Congestion Notification)?[1] ECN是Explicit Congestion Notification的缩写&#xff0c;意思是显式拥塞通知算法&#xff0c;和慢…

黑苹果之主板篇

一、什么是主板 主板&#xff0c;又叫主机板&#xff08;mainboard&#xff09;、系统板&#xff08;systemboard&#xff09;、或母板&#xff08;motherboard&#xff09;&#xff0c;是计算机最基本的同时也是最重要的部件之一。主板一般为矩形电路板&#xff0c;上面安装了…

Zabbix自动发现机制

Zabbix的自动发现机制 Zabbix客户端主动的和服务端联系&#xff0c;将自己的地址和端口发送服务端&#xff0c;实现自动添加监控主机&#xff0c;客户端是主动的一方缺点自定义网段中主机数量太多&#xff0c;等级耗时会很久&#xff0c;而且这个自动发现机制不是很稳定 Zabb…

06 硬件知识入门(MOSS管)

1 简介 MOS管和三极管的驱动方式完全不一样&#xff0c;以NPN型三极管为例&#xff0c;base极以小电流打开三极管&#xff0c;此时三极管的集电极被打开&#xff0c;发射极的高电压会导入&#xff0c;此时电流&#xff1a;Ic IbIe &#xff1b;电压&#xff1a;Ue>Uc>Ub…

看好美国跨境电商平台Etsy的三个理由

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 不可否认&#xff0c;最近的经济低迷给美国跨境电商平台Etsy(ETSY)的增长带来了一些麻烦。虽然Etsy第三季度营收同比增长了7%&#xff0c;但其商品总量仅增长了1%。如果没有有利的汇率&#xff0c;Etsy的销售额基本上会与前…

中山大学李华山、王彪课题组开发 SEN 机器学习模型,高精度预测材料性能

内容一览&#xff1a;了解全局晶体对称性并分析等变信息&#xff0c;对于预测材料性能至关重要&#xff0c;但现有的、基于卷积网络的算法尚且无法完全实现这些需求。针对于此&#xff0c;中山大学的李华山、王彪课题组&#xff0c;开发了一款名为 SEN 的机器学习模型&#xff…

堆栈,BSS,DATA,TEXT

一、目标文件 首先目标文件的构成&#xff0c;Linux下就是.o 文件 编译器编译源码后生成的文件叫目标文件&#xff08;Object File&#xff09;。 目标文件和可执行文件一般采用同一种格式&#xff0c;这种存储格式为 ELF。 目前文件的内容至少有编译后的机器指令代码和数据&a…

cocos creator “TypeError: Cannot set property ‘string‘ of null

背景&#xff1a; 学习cocos creator时遇到"TypeError: Cannot set property string of null" 错误。具体代码如下&#xff1a;property({ type: Label })public stepsLabel: Label | null null;update(deltaTime: number) {this.stepsLabel.string Math.floor(…

搜索推荐技术-爱奇艺搜索引擎技术

一、爱奇艺的搜索引擎框架示意图 即通过召回系统&#xff0c;即基于文本匹配的matching system&#xff0c;得到大量视频资源的候选集&#xff0c;经过粗排和精排&#xff0c;最后返回给用户。重点在于召回模块和排序模块。 二、召回模块 召回模块比较重要的是基础相关性&am…

对数据库关系代数中除法运算的理解

一、基本概念 1.象集 给定一个关系R(X,Z)&#xff0c;X和Z为属性组&#xff0c;当t[X]x时&#xff0c;x在R中的象集定义为&#xff1a; Z x { t [ Z ] ∣ t ∈ R , t [ X ] x } Z_x\{t[Z]|t\in R,t[X]x\} Zx​{t[Z]∣t∈R,t[X]x} 表示R中属性组X上值为x的诸元组在Z上分量的…

单片机学习13——串口通信

单片机的通信功能&#xff1a; 实现单片机和单片机的信息交换&#xff0c;实现单片机和计算机的信息交换。 计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。 通信有并行通信和串行通信两种方式。 在多微机系统以及现在测控系统中信息的交换多采用串行通信方…

网络机房的功能有哪些?

网络机房的功能主要包括&#xff1a; 信息存储和管理&#xff1a;机房作为信息系统的核心&#xff0c;需要提供可靠的存储和管理能力&#xff0c;包括服务器、存储设备、备份系统等硬件设备&#xff0c;以及数据备份、数据迁移、容灾等管理方法和技术。网络连接和通信&#xf…

微信公众号的服务器验证方法

服务器上的操作&#xff1a; 将下面的wx.py文件放在服务器上&#xff0c;运行python3 wx.py 80 # -*- coding: utf-8 -*- # filename: main.py import web import handle import hashlibclass WeChatHandler(object):def GET(self):data web.input()if len(data) 0:return &…

汽车软件大时代,如何提升软件工程创新力?

当前&#xff0c;传统汽车产业正加速数字化转型&#xff0c;“软件定义汽车”不断深化。在电动化、智能化和网联化趋势下&#xff0c;汽车软件已经成为汽车技术革新和发展的核心驱动力之一。根据亿欧智库发布的《2023中国智能电动汽车车载软件市场分析报告》&#xff0c;2022年…

Tomcat主配置文件(server.xml)详解

前言 Tomcat主配置文件&#xff08;server.xml&#xff09;是Tomcat服务器的主要配置文件&#xff0c;文件位置在conf目录下&#xff0c;它包含了Tomcat的全局配置信息&#xff0c;包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…

Dockerfile与Docker网络

一、Dockerfile 1、概念&#xff1a; Dockerfile是用来构建docker镜像的文本文件&#xff0c;是由构建镜像所需要的指令和参数构建的脚本。 2、构建步骤&#xff1a; ① 编写Dockerfile文件 ② docker build命令构建镜像 ③ docker run依据镜像运行容器实例 Dockerfile …