MediaInfo編程指南

        近期須要寫一個對媒體文件的解析類,用到了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;
}
        本身在使用的時候,建議作下封裝,提供更便捷的接口,由於咱們一般並不須要遍歷全部的參數,只須要取咱們常常用的幾個參數。