近期需要写一个对媒体文件的解析类,用到了MediaInfo这个工具,但是在命令行下进行使用的话,需要做比较多的文本过滤工作,于是想到了基于其SDK进行开发,下面列出学习的一些总结。
首先了解下MediaInfo工具的输出
其输出包含了文件中各个流的信息,此例为5个流,分别为基本信息、视频轨道信息、音频轨道信息、字幕轨道信息、节目轨道信息。每个流下面都对应着许多不同的参数 说明 ,由于现在音视频领域编解码工具比较多,但却无有统一的标准,因此每个工具都会打上一些基本说明信息,众多工具在参数的说明上都有一定的风格,因而MediaInfo在解析时基本是遍历所有可能的值去列出其认识的参数信息,若一个新工具打的参数信息没有包含在MediaInfo所支持的参数中,则就不能被识别出来。
有了这些基础知识,下面我们介绍开发方法。
要进行开发,要到官网上下载其源码或SDK包,解压会得到MediaInfo.dll及对应的头文件,如何搞个VS工程不在这里介绍,只介绍库的使用。
DLL导出了一个MediaInfo类,这个类可以完成解析一个媒体文件的所有功能,其有如下方法:
int Open(string& file) 打开指定路径的文件,若成功返回1,失败返回0
void Close() 释放打开的资源
string Inform() 解析文件并将输出返回
string option(string& key, string& value="") 设定选项,或获取配置信息。
设定方面的选项有Complete=1,设置是否输出完全信息
获取方面的选项有"Info_Version", "Inf_Codecs" , "Info_Parameters"分别获取库版本,支持的编码信息,支持的所有参数
string get( StreamKind, StreamNumber, Parameter,InfoKind) 获取指定流类型的参数特定信息,这个函数比较重要,重点介绍
StreamKind:流类型,如Steam_General,Stream_Audio,Stream_Video,Stream_Text之类的;
StreamNumber:指特定类型流的序号,如果有n个字幕,则字幕由0编号开始到n-1。
Parameter:指定参数名或参数的序号,参数名可以通过Option方法获得所有支持的参数。由于不同的流类型对应的参数是不同的,因而MediaInfo针对不同的流类型定义了众多的参数值,这个值的最大值可以通过取每个流的Count参数获得。然后我们就可以从0-count-1去遍历所有可能的值。
InfoKind:获取的信息类型,定义的有Info_Text,这个是默认值,可以不用指定。其他有Info_Name等。
int Count_Get(StreamKind , StreamNumber) 若指定StreamNumber,则获取指定流的可遍历参数个数,功能类似于Get(Count)。若不指定,则返回此类流的个数,功能类似于Get($type_Count)。但执行效率更高。
下面通过一个例子看此库如何使用
#ifdef MEDIAINFO_LIBRARY #include "MediaInfo/MediaInfo.h" //Staticly-loaded library (.lib or .a or .so) #define MediaInfoNameSpace MediaInfoLib; #else //MEDIAINFO_LIBRARY #include "MediaInfoDLL/MediaInfoDLL.h" //Dynamicly-loaded library (.dll or .so) #define MediaInfoNameSpace MediaInfoDLL; #endif //MEDIAINFO_LIBRARY #include <iostream> #include <iomanip> using namespace MediaInfoNameSpace; int main () { //Information about MediaInfo MediaInfo MI; String To_Display=MI.Option(__T("Info_Version"), __T("0.7.13;MediaInfoDLL_Example_MSVC;0.7.13")).c_str(); To_Display += __T("\r\n\r\nInfo_Parameters\r\n"); To_Display += MI.Option(__T("Info_Parameters")).c_str(); To_Display += __T("\r\n\r\nInfo_Codecs\r\n"); To_Display += MI.Option(__T("Info_Codecs")).c_str(); //An example of how to use the library To_Display += __T("\r\n\r\nOpen\r\n"); MI.Open(__T("example.mp4")); To_Display += __T("\r\n\r\nInform with Complete=false\r\n"); MI.Option(__T("Complete")); To_Display += MI.Inform().c_str(); To_Display += __T("\r\n\r\nInform with Complete=true\r\n"); MI.Option(__T("Complete"), __T("1")); To_Display += MI.Inform().c_str(); To_Display += __T("\r\n\r\nCustom Inform\r\n"); MI.Option(__T("Inform"), __T("General;Example : FileSize=%FileSize%")); To_Display += MI.Inform().c_str(); To_Display += __T("\r\n\r\nGet with Stream=General and Parameter=\"FileSize\"\r\n"); To_Display += MI.Get(Stream_General, 0, __T("FileSize"), Info_Text, Info_Name).c_str(); To_Display += __T("\r\n\r\nGetI with Stream=General and Parameter=46\r\n"); To_Display += MI.Get(Stream_General, 0, 46, Info_Text).c_str(); To_Display += __T("\r\n\r\nCount_Get with StreamKind=Stream_Audio\r\n"); toStringStream SS; SS << std::setbase(10) << MI.Count_Get(Stream_Audio); To_Display += SS.str(); To_Display += __T("\r\n\r\nGet with Stream=General and Parameter=\"AudioCount\"\r\n"); To_Display += MI.Get(Stream_General, 0, __T("AudioCount"), Info_Text, Info_Name).c_str(); To_Display += __T("\r\n\r\nGet with Stream=Audio and Parameter=\"StreamCount\"\r\n"); To_Display += MI.Get(Stream_Audio, 0, __T("StreamCount"), Info_Text, Info_Name).c_str(); To_Display += __T("\r\n\r\nClose\r\n"); MI.Close(); std::cout << To_Display; return 0; }