【FFmpeg学习】avformat_open_input()和avformat_close_input()函数解析

797 阅读2分钟

最近在学习ffmpeg,avformat_open_input()和avformat_close_input()函数应该是最先接触的两个API了。

open_input()函数是我们操作多媒体文件的必要步骤,open_input()函数内部会根据多媒体文件给相应的AVFormatContext赋值,之后我们便可以通过操作AVFormatContext来操作该多媒体文件,包括关闭、获取流信息等等。也就是说,open_input()起了一个将多媒体文件和AVFormatContext结构体绑定的作用。这种绑定类似于Linux内核通过文件描述符来访问文件。只有打开了文件,我们才能进行后续的操作。

当然了,在操作完成之后,也不要忘了用close_input()来关闭文件,释放内存空间。

一.参数解析

1.avformat_open_input()

open_input()函数共有四个参数,分别是我们要将多媒体文件与之绑定的AVFormatContext格式上下文,多媒体文件名,AVInputFormat结构体指针以及AVDictionary字典类型的options选项。

其中options参数默认填NULL。AVInputFormat是AVFormatContext内部的一个结构体指针,记录输入的多媒体文件的格式信息。一般情况下,open_input()内部会根据参数二多媒体文件名去推断输入格式,所以我们也填NULL。

2.avformat_close_input()

close_input()函数只有一个参数,就是多媒体文件绑定的AVFormatContext结构体指针。

二.返回值判断

1.avformat_open_input() open_input()函数成功打开文件则返回0,失败则返回负值。 所以如果返回负值的话,我们通过printf语句打印错误信息,然后通过exit(1)语句直接退出程序。

三.实际案例

我们的实例打开了“Titanic.mp4”多媒体文件,打印其Duration时长信息,并关闭文件。共分为三个步骤:

1.打开多媒体文件 2.打印多媒体文件中stream流的个数 3.关闭多媒体文件

以下贴上main函数代码。

int ret;
AVFormatContext *fmt_ctx=NULL; 

//*1*
ret=avformat_open_input(&fmt_ctx,"Titanic.mp4",NULL,NULL);
if(ret<0)
{
	printf("fail to open input.");
	exit(1);
} 
//*2*
printf("%d\n",fmt_ctx->nb_streams);
//*3*
avformat_close_input(&fmt_ctx);

return 0;

三.运行结果

我们可以看到打印输出结果为2,猜测应该就是一条视频流和一条音频流了。

2021-04-09_192632.png