MediaInfo编程指南

        近期需要写一个对媒体文件的解析类,用到了MediaInfo这个工具,但是在命令行下进行使用的话,需要做比较多的文本过滤工作,于是想到了基于其SDK进行开发,下面列出学习的一些总结。

        首先了解下MediaInfo工具的输出

        MediaInfo编程指南_第1张图片

        其输出包含了文件中各个流的信息,此例为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;
}

        自己在使用的时候,建议做下封装,提供更便捷的接口,因为我们通常并不需要遍历所有的参数,只需要取我们经常用的几个参数。







你可能感兴趣的:(MediaInfo编程指南)