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;
}

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

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

相关文章

【PWN · ret2syscall | GoPwn】[2024CISCN · 华中赛区]go_note

一道GoPwn&#xff0c;此外便是ret2syscall的利用。然而过程有不小的曲折&#xff0c;参考 返璞归真 师傅的wp&#xff0c;堪堪完成了复现。复现过程中&#xff0c;师傅也灰常热情回答我菜菜的疑问&#xff0c;感谢&#xff01;2024全国大学生信息安全竞赛&#xff08;ciscn&am…

RabbitMQ快速入门 - 图像化界面的简单操作

目录 1、RabbitMQ的安装 2、RabbitMQ基本介绍 3、简单案例 4、数据隔离 1、RabbitMQ的安装 官网链接&#xff1a;rabbitmq官网 &#xff08;官网很详细&#xff0c;也可以在官网学习啦~&#xff09; 基础入门&#xff1a;自主学习&#xff1a;最新版本&#xff1a;安装我…

缓存-缓存的使用与基本详解

1.缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。而db承担数据落盘工作。 哪些数据适合放入缓存&#xff1f; 即时性、数据一致性要求不高的访问量大且更新频率不高的数据&#xff08;读多&#xff0c;写少&#xff09; …

如何配置 PostgreSQL 以实现高可用性和故障转移?

文章目录 一、高可用性和故障转移的概念&#xff08;一&#xff09;数据复制&#xff08;二&#xff09;监控和检测&#xff08;三&#xff09;快速切换 二、实现高可用性和故障转移的技术方案&#xff08;一&#xff09;流复制&#xff08;Streaming Replication&#xff09;&…

轻松创建对象——简单工厂模式(Java实现)

1. 引言 大家好&#xff0c;又见面了&#xff01;在上一篇文章中&#xff0c;我们通过Python示例介绍了简单工厂模式&#xff0c;今天&#xff0c;我们继续深入这个话题&#xff0c;用Java来实现简单工厂模式。 2. 什么是简单工厂模式 简单工厂模式&#xff08;Simple Facto…

idea部署war包成功,但是接口404

场景 项目结构 xxx-xxx-app xxx-xxx-service xxx-xxx-webappapp/webapp依赖service&#xff0c;service中写了各种api&#xff0c;先别管它合不合理&#xff0c;正式环境用webapp发布。 本地配置tomcat启动&#xff0c;但是发现每次部署成功&#xff0c;但是service中的接口…

【TB作品】脉搏测量,ATMEGA8单片机,Proteus仿真,ATmega8控制脉搏测量与显示系统

硬件组成&#xff1a; LCD1602脉搏测量电路&#xff08;带灯&#xff09;蜂鸣器报警按键设置AT24C02 功能&#xff1a; &#xff08;1&#xff09;LCD1602主页显示脉搏、报警上限、报警下限&#xff1b; &#xff08;2&#xff09;五个按键&#xff1a;按键1&#xff1a;切换设…

baomidou多数据源切换注解@DS没有效果

baomidou多数据源切换注解DS没有效果 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.1.1</version> </dependency> ##原因 方法上有Transaction…

Docker学习笔记(二)镜像、容器、仓库相关命令操作

一、docker镜像操作 列出镜像列表 我们可以使用 docker images 来列出本地主机上的镜像。 各个选项说明: REPOSITORY&#xff1a;表示镜像的仓库源 TAG&#xff1a;镜像的标签 IMAGE ID&#xff1a;镜像ID CREATED&#xff1a;镜像创建时间 SIZE&#xff1a;镜像大小 查…

昇思25天学习打卡营第9天|静态图模式的深度剖析与应用指南

目录 背景介绍 动态图模式 静态图模式 静态图模式的使用场景 静态图模式开启方式 基于装饰器的开启方式 基于context的开启方式 静态图的语法约束 JitConfig配置选项 静态图高级编程技巧 背景介绍 AI 编译框架主要包含两种运行模式&#xff0c;即动态图模式与静态图模…

19C 单机文件系统安装文档

准备工作 1)查看系统版本、内核参数 more /etc/redhat-release more /etc/redflag-releaseuname -a2)查看当前系统是否配置了HugePages。在下面的查询中&#xff0c;HugePages的几个相关值都为0&#xff0c;表明当前未配值HugePages&#xff0c;其次可以看到该版本的大页大小为…

Java之网络面试经典题(一)

目录 ​编辑 一.Session和cookie Cookie Session 二.HTTP和HTTPS的区别 三.浅谈HTTPS为什么是安全的&#xff1f; 四.TCP和UDP 五.GET和Post的区别 六.forward 和 redirect 的区别&#xff1f; 本专栏全是博主自己收集的面试题&#xff0c;仅可参考&#xff0c;不能相…

转发服务器实验

首先先克隆一个虚拟机并完成ip地址的修改 nmcli connection modify ens160 ipv4.addresses 192.168.209.128/24 nmcli connection modify ens160 ipv4.method manual nmcli connection modify ens160 connection.autoconnect yes nmcli connection up ens160 nmcli connection…

强化学习编程实战-1-一个及其简单的强化学习实例(多臂赌博机)

1.1 多臂赌博机 一台拥有K个臂的机器&#xff0c;玩家每次可以摇动K个臂中的一个&#xff0c;摇动后&#xff0c;会吐出数量不等的金币&#xff0c;吐出金币的数量服从一定的概率分布&#xff0c;而且不同臂的概率分布不同。 多臂赌博机的问题是&#xff1a;假设玩家共有N次摇地…

WPF中Background=“{x:Null}“ 和 Transparent

WPF中关于背景透明和背景无 此时&#xff0c;我代码中是写的有有个控件&#xff0c;一个Border &#xff0c;一个TextBox &#xff0c;范围都是全屏这么大&#xff0c;可以输入TextBox 因为&#xff0c;当border没有设置背景的时候&#xff0c;实际上是&#xff1a; <Borde…

尚庭公寓——数据库设计

1. 数据的关系 一对一&#xff0c;一对多&#xff08;多对一&#xff09;&#xff0c;多对多 2. 实体关系模型 实体关系模型常用ER图&#xff08;enity relationship graph&#xff09;表示&#xff1b; 矩形表示实体&#xff08;类似Java中的对象&#xff0c;如学生就是一…

NoSQL 之 Redis 配置与常用命令

一、关系型数据库与非关系型数据库 1、数据库概述 &#xff08;1&#xff09;关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记 录。 SQL 语句&#xff08;标准数据查询语言&am…

在5G/6G应用中实现高性能放大器的建模挑战

来源&#xff1a;Modelling Challenges for Enabling High Performance Amplifiers in 5G/6G Applications {第28届“集成电路和系统的混合设计”(Mixed Design of Integrated Circuits and Systems)国际会议论文集&#xff0c;2021年6月24日至26日&#xff0c;波兰洛迪} 本文讨…

Vue中Class数据绑定

Class数据绑定 数据绑定的一个常见需求场景是操作CSS class列表&#xff0c;因为class是attribute&#xff08;属性&#xff09;&#xff0c;我们可以和其他attribute一样使用v-bind 将它们和动态的字符串绑定。但是&#xff0c;在处理比较复杂的绑定时&#xff0c;通过拼接生…

金蝶云苍穹-插件开发(一)加载数据

前言 此系列博客是进行金蝶云苍穹开发时的插件开发的教程&#xff0c;一是在明年要是还要参加软件杯金蝶A6赛题的话&#xff0c;可以看此系列教程的博客来进行复习&#xff0c;同时如果要是我实验室的学弟学妹要参加的话&#xff0c;我这个系列的博客可以给他们提供学习参考&a…