近期須要寫一個對媒體文件的解析類,用到了MediaInfo這個工具,可是在命令行下進行使用的話,須要作比較多的文本過濾工做,因而想到了基於其SDK進行開發,下面列出學習的一些總結。ios
首先了解下MediaInfo工具的輸出ide
其輸出包含了文件中各個流的信息,此例爲5個流,分別爲基本信息、視頻軌道信息、音頻軌道信息、字幕軌道信息、節目軌道信息。每一個流下面都對應着許多不一樣的參數 說明 ,因爲如今音視頻領域編解碼工具比較多,但卻無有統一的標準,所以每一個工具都會打上一些基本說明信息,衆多工具在參數的說明上都有必定的風格,於是MediaInfo在解析時基本是遍歷全部可能的值去列出其認識的參數信息,若一個新工具打的參數信息沒有包含在MediaInfo所支持的參數中,則就不能被識別出來。函數
有了這些基礎知識,下面咱們介紹開發方法。
工具
要進行開發,要到官網上下載其源碼或SDK包,解壓會獲得MediaInfo.dll及對應的頭文件,如何搞個VS工程不在這裏介紹,只介紹庫的使用。學習
DLL導出了一個MediaInfo類,這個類能夠完成解析一個媒體文件的全部功能,其有以下方法:編碼
int Open(string& file) 打開指定路徑的文件,若成功返回1,失敗返回0spa
void Close() 釋放打開的資源命令行
string Inform() 解析文件並將輸出返回code
string option(string& key, string& value="") 設定選項,或獲取配置信息。orm
設定方面的選項有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; }本身在使用的時候,建議作下封裝,提供更便捷的接口,由於咱們一般並不須要遍歷全部的參數,只須要取咱們常常用的幾個參數。