在C#中用MediaInfo获取视频或音频的属性
MediaInfo是一个开源的获取视频或音频的信息的非常便利的工具,它本身就带有一个GUI界面,可以非常方便我们查看视频信息。但是,当我们写一些转码程序时,往往需要在程序中获取视频信息的时候。
以前我经常使用的方式是通过命令行调用MediaInfo.exe,通过--Output=XML参数来将其输出为一个XML文件,然后通过解析XML文件来获取视频信息。这种常规的做法虽然思路比较简单,但是如果需要解析的属性比较多的时候,则就显得比较繁琐了。便打算直接调用MediaInfo.dll中的api接口,直接获取其属性。
虽然MediaInfo是开源的,但由于它不是.net语言编写的,在C#中是无法直接使用的,但仍然是可以通过Pinvoke的方式来调用的。不过Nuget上已经有这种封装好了的库供我们直接使用的:
我试用过一下,本身这个封装是没有什么问题的,但不知道为什么作者对于属性是采用的首字母小写的方式,感觉很不习惯。便找了Sourceforge上的另一个库MediaInfoNET,该库的说明地址如下:http://teejeetech.blogspot.com/2013/01/mediainfo-wrapper-for-net-projects.html。但由于看这个地址不爽,只有在火星上才能访问这个网站,因此我就把原文的例子转录了下来,使用起来还是非常简单的:
static void Main(string[] args)
{
MediaFile aviFile = new MediaFile(@"r:\test.avi");
Console.WriteLine();
Console.WriteLine("General ---------------------------------");
Console.WriteLine();
Console.WriteLine("File Name : {0}", aviFile.Name);
Console.WriteLine("Format : {0}", aviFile.General.Format);
Console.WriteLine("Duration : {0}", aviFile.General.DurationString);
Console.WriteLine("Bitrate : {0}", aviFile.General.Bitrate);
if (aviFile.Audio.Count > 0)
{
Console.WriteLine();
Console.WriteLine("Audio ---------------------------------");
Console.WriteLine();
Console.WriteLine("Format : {0}", aviFile.Audio[0].Format);
Console.WriteLine("Bitrate : {0}", aviFile.Audio[0].Bitrate.ToString());
Console.WriteLine("Channels : {0}", aviFile.Audio[0].Channels.ToString());
Console.WriteLine("Sampling : {0}", aviFile.Audio[0].SamplingRate.ToString());
}
if (aviFile.Video.Count > 0)
{
Console.WriteLine();
Console.WriteLine("Video ---------------------------------");
Console.WriteLine();
Console.WriteLine("Format : {0}", aviFile.Video[0].Format);
Console.WriteLine("Bit rate : {0}", aviFile.Video[0].Bitrate.ToString());
Console.WriteLine("Frame rate : {0}", aviFile.Video[0].FrameRate.ToString());
Console.WriteLine("Frame size : {0}", aviFile.Video[0].FrameSize.ToString());
}
Console.ReadLine();
}
这个库貌似并没有在Nuget上发布,要是该作者把它也传到Nuget上那用起来就更加方便了。