注:此前已经写了一系列分析MediaInfo源代码的文章,列表如下:
MediaInfo源代码分析 1:整体结构
MediaInfo源代码分析 2:API函数
MediaInfo源代码分析 3:Open()函数
MediaInfo源代码分析 4:Inform()函数
MediaInfo源代码分析 5:JPEG解析代码分析
===================
我们来看一下MediaInfo中的Inform()函数的内部调用过程
首先Inform()函数封装了MediaInfo_Internal类中的Inform()函数
//返回文件信息 String MediaInfo::Inform(size_t) { //封装了一层 return Internal->Inform(); }
查看一下MediaInfo_Internal类中的Inform()函数的源代码:
// 获取信息 Ztring MediaInfo_Internal::Inform() { CS.Enter(); if (Info && Info->Status[File__Analyze::IsUpdated]) Info->Open_Buffer_Update(); CS.Leave(); if (MediaInfoLib::Config.Inform_Get()==__T("MPEG-7")) return Export_Mpeg7().Transform(*this); if (MediaInfoLib::Config.Inform_Get()==__T("PBCore") || MediaInfoLib::Config.Inform_Get()==__T("PBCore_1.2")) return Export_PBCore().Transform(*this); if (MediaInfoLib::Config.Inform_Get()==__T("reVTMD")) return __T("reVTMD is disabled due to its non-free licensing."); //return Export_reVTMD().Transform(*this); //获取相应的信息 if (!( MediaInfoLib::Config.Inform_Get(__T("General")).empty() && MediaInfoLib::Config.Inform_Get(__T("Video")).empty() && MediaInfoLib::Config.Inform_Get(__T("Audio")).empty() && MediaInfoLib::Config.Inform_Get(__T("Text")).empty() && MediaInfoLib::Config.Inform_Get(__T("Chapters")).empty() && MediaInfoLib::Config.Inform_Get(__T("Image")).empty() && MediaInfoLib::Config.Inform_Get(__T("Menu")).empty() )) { //获取各种信息 //Retour即为返回的字符串 Ztring Retour; Retour+=MediaInfoLib::Config.Inform_Get(__T("File_Begin")); Retour+=MediaInfoLib::Config.Inform_Get(__T("General_Begin")); Retour+=Inform(Stream_General, 0, false); Retour+=MediaInfoLib::Config.Inform_Get(__T("General_End")); if (Count_Get(Stream_Video)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Video_Begin")); for (size_t I1=0; I1<Count_Get(Stream_Video); I1++) { Retour+=Inform(Stream_Video, I1, false); if (I1!=Count_Get(Stream_Video)-1) Retour+=MediaInfoLib::Config.Inform_Get(__T("Video_Middle")); } if (Count_Get(Stream_Video)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Video_End")); if (Count_Get(Stream_Audio)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Audio_Begin")); for (size_t I1=0; I1<Count_Get(Stream_Audio); I1++) { Retour+=Inform(Stream_Audio, I1, false); if (I1!=Count_Get(Stream_Audio)-1) Retour+=MediaInfoLib::Config.Inform_Get(__T("Audio_Middle")); } if (Count_Get(Stream_Audio)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Audio_End")); if (Count_Get(Stream_Text)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Text_Begin")); for (size_t I1=0; I1<Count_Get(Stream_Text); I1++) { Retour+=Inform(Stream_Text, I1, false); if (I1!=Count_Get(Stream_Text)-1) Retour+=MediaInfoLib::Config.Inform_Get(__T("Text_Middle")); } if (Count_Get(Stream_Text)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Text_End")); if (Count_Get(Stream_Other)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Chapters_Begin")); for (size_t I1=0; I1<Count_Get(Stream_Other); I1++) { Retour+=Inform(Stream_Other, I1, false); if (I1!=Count_Get(Stream_Other)-1) Retour+=MediaInfoLib::Config.Inform_Get(__T("Chapters_Middle")); } if (Count_Get(Stream_Other)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Chapters_End")); if (Count_Get(Stream_Image)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Image_Begin")); for (size_t I1=0; I1<Count_Get(Stream_Image); I1++) { Retour+=Inform(Stream_Image, I1, false); if (I1!=Count_Get(Stream_Image)-1) Retour+=MediaInfoLib::Config.Inform_Get(__T("Image_Middle")); } if (Count_Get(Stream_Image)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Image_End")); if (Count_Get(Stream_Menu)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Menu_Begin")); for (size_t I1=0; I1<Count_Get(Stream_Menu); I1++) { Retour+=Inform(Stream_Menu, I1, false); if (I1!=Count_Get(Stream_Menu)-1) Retour+=MediaInfoLib::Config.Inform_Get(__T("Menu_Middle")); } if (Count_Get(Stream_Menu)) Retour+=MediaInfoLib::Config.Inform_Get(__T("Menu_End")); Retour+=MediaInfoLib::Config.Inform_Get(__T("File_End")); //可以在此加入视频质量检测----------------------------------------- //字符串替换?各种换行符统统改为“\n”----------------------------- Retour.FindAndReplace(__T("\\r\\n"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\\r"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\\n"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\r\n"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\r"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\n"), MediaInfoLib::Config.LineSeparator_Get(), 0, Ztring_Recursive); //Special characters Retour.FindAndReplace(__T("|SC1|"), __T("\\"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC2|"), __T("["), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC3|"), __T("]"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC4|"), __T(","), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC5|"), __T(";"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC6|"), __T("("), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC7|"), __T(")"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC8|"), __T(")"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC9|"), __T("),"), 0, Ztring_Recursive); return Retour; } //Informations Ztring Retour; bool HTML=false; bool XML=false; bool CSV=false; //获取配置信息(输出格式) if (MediaInfoLib::Config.Inform_Get()==__T("HTML")) HTML=true; if (MediaInfoLib::Config.Inform_Get()==__T("XML")) XML=true; if (MediaInfoLib::Config.Inform_Get()==__T("CSV")) CSV=true; if (HTML) Retour+=__T("<html>\n\n<head>\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head>\n<body>\n"); if (XML) Retour+=__T("<File>\n"); for (size_t StreamKind=(size_t)Stream_General; StreamKind<Stream_Max; StreamKind++) { //Pour chaque type de flux for (size_t StreamPos=0; StreamPos<(size_t)Count_Get((stream_t)StreamKind); StreamPos++) { //Pour chaque stream //输出为HTML if (HTML) Retour+=__T("<table width=\"100%\" border=\"0\" cellpadding=\"1\" cellspacing=\"2\" style=\"border:1px solid Navy\">\n<tr>\n <td width=\"150\"><h2>"); //输出为XML if (XML) Retour+=__T("<track type=\""); Ztring A=Get((stream_t)StreamKind, StreamPos, __T("StreamKind/String")); Ztring B=Get((stream_t)StreamKind, StreamPos, __T("StreamKindPos")); if (!XML && !B.empty()) { if (CSV) A+=__T(","); else A+=MediaInfoLib::Config.Language_Get(__T(" Config_Text_NumberTag")); A+=B; } Retour+=A; if (XML) { Retour+=__T("\""); if (!B.empty()) { Retour+=__T(" streamid=\""); Retour+=B; Retour+=__T("\""); } } //输出为HTML if (HTML) Retour+=__T("</h2></td>\n </tr>"); //输出为XML if (XML) Retour+=__T(">"); Retour+=MediaInfoLib::Config.LineSeparator_Get(); Retour+=Inform((stream_t)StreamKind, StreamPos, false); Retour.FindAndReplace(__T("\\"), __T("|SC1|"), 0, Ztring_Recursive); if (HTML) Retour+=__T("</table>\n<br />"); if (XML) Retour+=__T("</track>\n"); Retour+=MediaInfoLib::Config.LineSeparator_Get(); } } //输出为HTML if (HTML) Retour+=__T("\n</body>\n</html>\n"); //输出为XML if (XML) Retour+=__T("</File>\n"); //字符串替换? Retour.FindAndReplace(__T("\\r\\n"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\\r"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\\n"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\r\n"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\r"), __T("\n"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("\n"), MediaInfoLib::Config.LineSeparator_Get(), 0, Ztring_Recursive); //Special characters Retour.FindAndReplace(__T("|SC1|"), __T("\\"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC2|"), __T("["), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC3|"), __T("]"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC4|"), __T(","), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC5|"), __T(";"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC6|"), __T("("), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC7|"), __T(")"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC8|"), __T(")"), 0, Ztring_Recursive); Retour.FindAndReplace(__T("|SC9|"), __T("),"), 0, Ztring_Recursive); return Retour; }
函数比较复杂,从代码中我们可以看出,Inform()的实质还是使用Get()一个一个取出所有的属性值。
当指定输出为XML或者是HTML的时候,在输出的字符串上加上相应的标签(例如,输出为HTML的时候,字符串每一行上加上“</tr><tr>”,首尾加上“<table></table>”)
具体每一块代码的含义已经写在注释中了。
相关推荐
1. **加载文件**:首先,你需要使用`MediaInfo_Open()`函数打开你要分析的多媒体文件,该函数会返回一个句柄,用于后续的操作。 2. **提取信息**:接着,你可以调用`MediaInfo_Inform()`或`MediaInfo_Get()`函数,...
例如,`MediaInfo_Inform()`函数用于获取解析后的信息字符串,`MediaInfo_Open()`用于打开文件进行解析,`MediaInfo_Close()`则用于关闭已打开的文件。 2. **错误处理**:在调用MediaInfo的API时,需要注意错误处理...
这个“mediainfo_0.7.31.rar”压缩包包含了mediainfo的源代码,版本为0.7.31,适合开发者用于学习、定制或在Visual Studio环境下进行编译。 Mediainfo的源码是用C++编写的,它的设计目标是提供一个跨平台的解决...
命令行示例标准通知文件mediainfo --Inform=file:///Path/To-File/Inform-Example.txt 'Blue Planet II - S01E02 - The Deep.mkv' 命令行示例$ if()通知文件通过管道传递到“ TR”以删除空白行mediainfo --Inform...
"MediaInfo视频编码分析查询器"是一款专门用于分析和查询视频文件编码信息的工具,它可以帮助用户深入了解视频文件的技术细节,包括编码格式、分辨率、帧率、音频编码、比特率等关键参数。在数字媒体领域,了解这些...
MediaInfo 用来分析视频和音频文件的编码和内容信息,是一款是自由软件 (免费使用、免费获得源代码,许可协议:GNU GPL/LGPL)。 支持格式:视频:MKV, OGM, AVI, DivX, WMV, QuickTime, Real, MPEG-1, MPEG-2, MPEG-4...
MediaInfo就是这样一款强大的工具,专为媒体专业人士和普通用户提供了详尽的媒体文件分析功能。它可以帮助我们洞察视频、音频文件的每一个细节,包括编码方式、比特率、分辨率等关键信息。本文将深入探讨MediaInfo的...
The MediaInfo data display includes: Container: format, profile, commercial name of the format, duration, overall bit rate, writing application and library, title, author, director, album, track ...
MediaInfo 用来分析视频和音频文件的编码和内容信息,是一款是自由软件 (免费使用、免费获得源代码,许可协议:GNU GPL/LGPL)。 MediaInfo可以获得多媒体文件的哪些信息? 内容信息:标题,作者,专辑名,音轨号,...
MediaInfo DLL允许程序员在不直接访问源代码的情况下,调用其内部的分析和解析功能。 2. **API接口**:MediaInfo提供了丰富的API接口,这些接口定义了如何与DLL交互。例如,`Open()`函数用于打开一个媒体文件,`...
MediaInfo遵循开源许可,可能使用的是GPL或MIT等开放源代码许可证,允许自由使用和分享。 4. **History.txt**:这是一个版本历史记录文件,列出了该版本的更新内容、改进和修复的bug,帮助用户了解软件的发展历程...
它使用从C ++源代码编译而来。演示版在浏览器中尝试mediainfo.js: ://mediainfo.js.org用法浏览器您可以使用CDN将脚本文件直接包含在页面中,也可以使用JavaScript捆绑程序(例如webpack)。 CDN : [removed]...
MediaInfo 是一款强大的媒体信息查看工具,专门用于分析和提取各种多媒体文件的详细技术信息。这个软件可以帮助用户轻松地了解视频、音频文件的编码格式、分辨率、比特率、采样率等关键参数,从而在处理多媒体文件时...
**MediaInfo 媒体分析工具** MediaInfo 是一款强大的媒体信息分析工具,它能够提供详尽的多媒体文件元数据信息,包括视频、音频、字幕等不同轨道的数据。这款工具对于媒体处理、流媒体研究、视频编码和解码、内容...
1. 下载MediaInfo库:访问MediaInfo的官方网站或通过GitHub等平台获取最新的MediaInfo源代码或预编译的二进制文件。 2. 解压并找到MediaInfo.dll文件,这通常是MediaInfoLib中的一个动态链接库文件。 3. 在VB项目中...
1. `libmediainfo.so.0`:这是`Mediainfo`的动态链接库文件,它包含了运行`Mediainfo`所需的函数和数据结构。在Linux系统中,动态链接库可以在程序运行时被加载,而不是在编译时嵌入到可执行文件中,这样可以节省...
8. **开源项目**:MediaInfo是开源软件,遵循GPL许可证,这意味着源代码公开,用户可以自由查看、修改和分发。 在实际应用中,MediaInfo的使用场景广泛: - **视频编辑**:在剪辑和后期制作过程中,MediaInfo可以...
在Windows环境下,Visual Studio(如VS2010)这样的集成开发环境可以用于编译和调试Mediainfo的源代码,以便根据需要进行定制或扩展。 在具体应用中,Mediainfo可以为我们提供以下关键的视频信息: 1. 视频编码:...
MediaInfo是一款强大的多媒体信息分析工具,专为用户提供详细的音频、视频文件元数据。这款软件在全球范围内广受欢迎,因其用户友好的界面和免费无限制的特性而备受赞誉。MediaInfo_20.03.dmg.zip是针对Mac OS平台的...
Linux中的 Mediainfo 执行程序是用于分析多媒体文件元数据的工具,它可以从音频、视频文件中提取出详细的格式和技术信息。 Mediainfo 源码编译后生成的可执行程序可以在各种Linux发行版中运行,这得益于其跨平台的...