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 definition
    strcpy(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/1
    av_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=1000MacroSeconds
    strcpy(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,欢迎交流!


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

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

相关文章

【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 方法一 有源码…

探索低代码之路——JNPF

目录 一、低代码行业现状 二、产品分析 1.可视化应用开发 2.流程管理 3.整个平台源码合作 三、架构和技术 技术栈 四、规划和展望 低代码平台&#xff08;Low-code Development Platform&#xff09;是一种让开发者通过拖拽和配置&#xff0c;而非传统的手动编写大量代…

NTT 的各类优化:Harvey、PtNTT,Intel AVX2、ARM Neon、GPGPU

参考文献&#xff1a; [Har14] Harvey D. Faster arithmetic for number-theoretic transforms[J]. Journal of Symbolic Computation, 2014, 60: 113-119.[Sei18] Seiler G. Faster AVX2 optimized NTT multiplication for Ring-LWE lattice cryptography[J]. Cryptology ePr…

供应链 | “利刃出鞘”——顶刊POMS论文解读:制造商借助电子商务部门入侵

论文解读者&#xff1a;肖善&#xff0c;温梓曦&#xff0c;张怡雯&#xff0c;杨子豪 编者按&#xff1a; 解密品牌商在线电商平台&#xff1a;组织结构、策略选择、三方共赢 Manufacturer encroachment with an e‐commerce division 原文作者信息 Shi, S., Wang, C., Ch…

微信发红包,有哪些测试点

1、功能 1.在红包钱数&#xff0c;和红包个数的输入框中只能输入数字 2.红包里最多和最少可以输入的钱数 200 0.01 3.拼手气红包最多可以发多少个红包 100 3.1超过最大拼手气红包的个数是否有提醒 4.当红包钱数超过最大范围是不是有对应的提示 5.当发送的红包个数超过…

springboot开发更换Java版本要检查的所有地方

尤其是装了多个Java版本的小伙伴注意啦&#xff01; 首先就是要检查自己的环境变量&#xff0c;把环境变量设置好&#xff0c;然后出来打开cmd输入java -version查看是否更换成功 把系统的Java版本更换好以后&#xff0c;紧接着检查一下的idea&#xff0c;maven的所有和Java有…

4G工业路由器智慧楼宇门禁无人值守、实时监控

门禁是我们日常生活中常见的基础设施&#xff0c;就像是现代社会智慧城市中的“门神”&#xff0c;在楼宇管理领域中普遍采用的安防卫士。4G工业路由器的物联网应用则为楼宇门禁管理带来了更加便捷和高效的解决方案。 在传统的楼宇门禁系统中&#xff0c;人员需要手动刷卡、输…

JavaScript包装类型

前端面试大全JavaScript包装类型 &#x1f31f;经典真题 &#x1f31f;包装类型 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 是否了解 JavaScript 中的包装类型&#xff1f; &#x1f31f;包装类型 在 ES 中&#xff0c;数据的分类分为基本数据类型…

YOLOv5改进之ShuffleNetV2

目录 一、原理 网络结构 二、代码 三、应用到YOLOv5 一、原理

3DMAX二维图片对象摆放插件安装使用方法

3DMAX二维图片对象摆放插件使用教程 3DMAX二维图片对象摆放插件自动对齐相机&#xff0c;可以有效地自动将简单的2D PNG图像添加到3dMax场景中。使用3DMAX二维图片对象摆放插件&#xff0c;你可以使用一次渲染来渲染具有正确阴影的快速预览和最终图像&#xff0c;而无需稍后合成…

对话式数据需求激增,景联文科技提供高质量多轮对话数据定制采集标注服务

大模型的快速发展使得数据服务需求激增&#xff0c;产品整体处于供不应求状态。对话式数据集成为当下需求热点&#xff0c;人们对于更复杂、更真实的多轮对话数据需求不断增加&#xff0c;定制化服务占据市场需求主流。 通过对多轮对话数据的训练&#xff0c;模型可以更好地理解…

Golang数据类型(字符串)

字符串重要概念 根据Go语言官方的定义&#xff1a; In Go, a string is in effect a read-only slice of bytes. 意思是Go中的字符串是一组只读的字节切片&#xff08;slice of bytes&#xff09;&#xff0c;每个字符串都使用一个或多个字节表示&#xff08;当字符为 ASCII 码…

【存储】blotdb的原理及实现(2)

【存储】etcd的存储是如何实现的(3)-blotdb 在etcd系列中&#xff0c;我们对作为etcd底层kv存储的boltdb进行了比较全面的介绍。但是还有两个点没有涉及。 第一点是boltdb如何和磁盘文件交互。 持久化存储和我们一般业务应用程序的最大区别就是其强依赖磁盘文件。一方面文件数…

【Java】NIO概述

本文主要介绍Java的IO。 这里主要按类的操作方式和操作对象对JavaIO进行分类&#xff0c;方便理解&#xff0c;后续使用时可以方便地查询。 一、操作方式分类 首先介绍几组概念&#xff1a; 字节流和字符流&#xff1a; 字节流&#xff1a;以字节为单位&#xff0c;每次次读…

【element-plus使用】el-select自定义样式、下拉框选项过长等问题解决

1、自定义样式 <template><el-select v-model"value" style"width: 150px"><el-option label"选项一" value"option1"></el-option><el-option label"选项二" value"option2"><…

Condition 源码解析

Condition 源码解析 文章目录 Condition 源码解析一、Condition二、Condition 源码解读2.1. lock.newCondition() 获取 Condition 对象2.2. condition.await() 阻塞过程2.3. condition.signal() 唤醒过程2.4. condition.await() 被唤醒后 三、总结 一、Condition 在并发情况下…

虚幻学习笔记7—蓝图接口

一、前言 蓝图接口就是可以在蓝图中实现的接口&#xff0c;有它方便的地方&#xff0c;可以很方便的调用到实现了接口的函数。 二、实现 2.1、创建一个蓝图接口 1&#xff09;可以添加多个函数。 2&#xff09;函数在蓝图接口中只能规定输入和输出参数。 只有输入参数的可以…

OSHI-操作系统和硬件信息库

文章目录 引言一、快速入门1.1 OSHI的简介1.2 引入依赖1.3 涉及的包&#xff08;package&#xff09;1.4 涉及的核心类 二、操作系统信息&#xff1a;OperatingSystem2.1 总揽2.2 文件系统信息&#xff1a;FileSystem2.3 网络参数信息&#xff1a;NetworkParams2.4 进程信息&am…

手势识别4:C/C++实现手部检测和手势识别(含源码下载)

手势识别4&#xff1a;C/C实现手部检测和手势识别(含源码下载) 目录 手势识别4&#xff1a;C/C实现手部检测和手势识别(含源码下载) 1. 前言 2. 手势识别模型&#xff08;YOLOv5&#xff09; &#xff08;1&#xff09;手势识别模型训练 &#xff08;2&#xff09;将Pyto…

家电产品扇叶零部件自动化三维检测设备高精度3D测量系统-CASAIM-IS(2ND)

一、背景介绍 某家电制造商希望对其生产的家电产品零部件进行高精度的3D测量&#xff0c;以确保零部件的尺寸精度和质量符合严格的标准&#xff0c;零部件的形状复杂且多样化&#xff0c;对于一些细节部位的测量精度要求极高。本文将介绍CASAIM-IS&#xff08;2ND&#xff09;…