当前位置: 首页 > news >正文

04.ffmpeg打印音视频媒体信息

目录

1、相关头文件

2、相关结构体

3、相关函数

4、函数详解

5、源码附上


1、相关头文件

#include <libavformat/avformat.h>        包含格式相关的函数和数据结构

#include <libavutil/avutil.h>                    包含一些通用实用函数

2、相关结构体

AVFormatContext                        用于存储媒体文件的信息

3、相关函数

1、void av_register_all(void);

        解释:初始化所有的编解码器、解码器、分离器和复用器。在使用任何其他 libav* 函数之前,必须调用此函数一次。在 FFmpeg 4.0 之后的版本中,这个函数已经被弃用,不再需要调用。

2、int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);

  • 参数
    • AVFormatContext **ps:指向格式上下文指针的指针。成功打开文件后,它将指向一个已初始化的 AVFormatContext
    • const char *filename:输入文件的文件名。
    • AVInputFormat *fmt:指定输入格式。通常传递 NULL 以自动检测格式。
    • AVDictionary **options:包含输入选项的字典。通常传递 NULL
  • 返回值:返回 0 表示成功,负值表示错误。
  • 解释:打开输入文件并读取文件头,创建并初始化 AVFormatContext

3、int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

  • 参数
    • AVFormatContext *ic:指向已打开的 AVFormatContext
    • AVDictionary **options:包含选项的字典。通常传递 NULL
  • 返回值:返回 0 表示成功,负值表示错误。
  • 解释:读取媒体文件的数据以获取流信息。

4、void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output);

  • 参数
    • AVFormatContext *ic:指向 AVFormatContext 的指针。
    • int index:流的索引,通常传递 0。
    • const char *url:输入文件的 URL。
    • int is_output:如果是输入文件,传递 0;如果是输出文件,传递 1。
  • 解释:打印 AVFormatContext 的详细信息,主要用于调试。

5、void avformat_close_input(AVFormatContext **s);

  • 参数
    • AVFormatContext **s:指向格式上下文指针的指针。
  • 解释:关闭一个打开的输入文件并释放相关资源,调用之后,s 将被设置为 NULL。

4、函数详解

  • av_register_all
    此函数在程序开始时调用,注册所有可用的文件格式、编解码器和网络协议。尽管在较新的 FFmpeg 版本中不再需要,但在旧版本中这是必要的一步,确保库中所有功能可用。

  • avformat_open_input
    这个函数尝试打开一个媒体文件,并读取文件头来填充 AVFormatContext。如果文件打开成功,AVFormatContext 将包含有关文件格式的信息。它不仅处理本地文件,也支持通过 URL 访问网络上的媒体流。

  • avformat_find_stream_info
    在成功打开媒体文件后,FFmpeg 还需要更多信息来正确解码数据。此函数读取更多的数据包以获取关于文件中每个流的信息(如视频和音频流),并填充 AVFormatContext 中的流信息。

  • av_dump_format
    这是一个非常有用的调试工具,可以打印出媒体文件的详细信息,包括每个流的格式、比特率、分辨率等。对于开发者来说,这是验证 FFmpeg 是否正确解析文件的好方法。

  • avformat_close_input
    在处理完媒体文件后,需要调用此函数来关闭文件并释放与 AVFormatContext 相关的所有资源。这是资源管理的一个重要部分,确保没有内存泄漏或资源占用。

5、源码附上

#include <stdio.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>int main(int argc, char *argv[]) {if ( argc < 2 ) {fprintf(stderr, "Usage: %s <input_file>\n", argv[0]);return -1;}AVFormatContext *fmt_ctx = NULL;const char *input_filename = "input.mp4";input_filename = argv[1];// 初始化所有编解码器, 我使用的ffmpeg版本以及弃用该函数// av_register_all();// 打开输入文件并且读取文件头int ret = avformat_open_input( &fmt_ctx, input_filename, NULL, NULL );if ( ret ) {fprintf( stderr, "avformat_open_input open %s error!!!\n", input_filename );return -1;}// 读取媒体文件数据以获取流信息ret = avformat_find_stream_info( fmt_ctx, NULL );if ( ret ) {fprintf( stderr, "avformat_find_stream_info error!!!\n" );return -1;}// 打印AVFormatContext信息av_dump_format( fmt_ctx, 0, input_filename, 0 );// 关闭文件, 并设置AVFormatContext指针为NULLavformat_close_input( &fmt_ctx );return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux从入门到精通
  • 性能测试的流程(企业真实流程详解)(二)
  • 冒泡排序与其C语言通用连续类型排序代码
  • SpringBoot新手快速入门系列教程五:基于JPA的一个Mysql简单读写例子
  • [C++] 模拟实现list(二)
  • STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)
  • 论文学习_An Empirical Study of Deep Learning Models for Vulnerability Detection
  • 利用 Plotly.js 创建交互式条形图
  • 【js面试题】深入理解浏览器对象模型(BOM)
  • HiFi音频解码器:音质提升的秘密武器
  • ios swift5 蓝牙广播出数据
  • 蚁剑编码器编写——php木马免杀
  • DID差分模型案例集(传统DID、队列DID、渐近DID、空间DID、PSM-DID)
  • 使用 FFmpeg 处理视频:简介、常用命令及在 C++ 中调用 FFmpeg
  • jmeter-beanshell学习3-beanshell获取请求报文和响应报文
  • ----------
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 10个确保微服务与容器安全的最佳实践
  • bearychat的java client
  • CAP理论的例子讲解
  • gitlab-ci配置详解(一)
  • Phpstorm怎样批量删除空行?
  • python学习笔记 - ThreadLocal
  • Twitter赢在开放,三年创造奇迹
  • 安卓应用性能调试和优化经验分享
  • 翻译:Hystrix - How To Use
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 王永庆:技术创新改变教育未来
  • 学习ES6 变量的解构赋值
  • 再次简单明了总结flex布局,一看就懂...
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #预处理和函数的对比以及条件编译
  • $forceUpdate()函数
  • $GOPATH/go.mod exists but should not goland
  • (09)Hive——CTE 公共表达式
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (175)FPGA门控时钟技术
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十五)使用Nexus创建Maven私服
  • (一一四)第九章编程练习
  • (转)项目管理杂谈-我所期望的新人
  • (转)用.Net的File控件上传文件的解决方案
  • ***通过什么方式***网吧
  • ./configure、make、make install 命令
  • .NET C# 使用GDAL读取FileGDB要素类
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net 验证控件和javaScript的冲突问题
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET大文件上传知识整理
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • @requestBody写与不写的情况