最近在学习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,猜测应该就是一条视频流和一条音频流了。