=====================================================

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 charactersRetour.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;}//InformationsZtring 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 fluxfor (size_t StreamPos=0; StreamPos<(size_t)Count_Get((stream_t)StreamKind); StreamPos++){//Pour chaque stream//输出为HTMLif (HTML) Retour+=__T("<table width=\"100%\" border=\"0\" cellpadding=\"1\" cellspacing=\"2\" style=\"border:1px solid Navy\">\n<tr>\n    <td width=\"150\"><h2>");//输出为XMLif (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(",");elseA+=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("\"");}}//输出为HTMLif (HTML) Retour+=__T("</h2></td>\n  </tr>");//输出为XMLif (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();}}//输出为HTMLif (HTML) Retour+=__T("\n</body>\n</html>\n");//输出为XMLif (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 charactersRetour.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>”)

具体每一块代码的含义已经写在注释中了。

MediaInfo源代码分析 4:Inform()函数相关推荐

  1. MediaInfo源代码分析 3:Open()函数

    ===================================================== MediaInfo源代码分析系列文章列表: MediaInfo源代码分析 1:整体结构 Me ...

  2. MediaInfo源代码分析 2:API函数

    ===================================================== MediaInfo源代码分析系列文章列表: MediaInfo源代码分析 1:整体结构 Me ...

  3. MediaInfo源代码分析 5:JPEG解析代码分析

    ===================================================== MediaInfo源代码分析系列文章列表: MediaInfo源代码分析 1:整体结构 Me ...

  4. MediaInfo源代码分析 1:整体结构

    ===================================================== MediaInfo源代码分析系列文章列表: MediaInfo源代码分析 1:整体结构 Me ...

  5. Media Player Classic - HC 源代码分析 6:MediaInfo选项卡 (CPPageFileMediaInfo)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  6. Common Lisp 函数 require 和 provide 源代码分析

    2019独角兽企业重金招聘Python工程师标准>>> Common Lisp 函数 require 和 provide 源代码分析 === 涉及文件: l1-files.lisp ...

  7. Media Player Classic - HC 源代码分析 8:RenderFile函数详细分析(CFGManager)

    前面有两篇文章分析了Media Player Classic - HC(mpc-hc)的源代码中的核心类 CMainFrame: Media Player Classic - HC 源代码分析 2:核 ...

  8. 笛卡尔心形函数图像c语言,笛卡尔-心形图 源代码 分析

    java的代码如下,谁能帮我用C#改写一下啊,谢谢,感激不尽 import javafx.application.Application; import javafx.scene.Scene; imp ...

  9. Media Player Classic - HC 源代码分析 7:详细信息选项卡(CPPageFileInfoDetails)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

最新文章

  1. java 工作 日期转换代码,判断是否是当天,然后日期转换
  2. async/await 异步操作 .net csharp C#
  3. consul java_springcloud使用consul作为配置中心
  4. Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch
  5. Git详解(1)——Git起步
  6. 开源大数据:Iceberg新一代数据湖技术实践
  7. 使用 Python 进行线性搜索优化
  8. PythonServer
  9. WPS Excel VB宏简单编程
  10. Java下载base64图片
  11. linux环境libudev安装,树莓派 3B 上安装 libnfc 配合 acr122u 读取 nfc
  12. Arduino手自两用蓝牙避障小车
  13. SSM框架:MyBatis
  14. linux下操作3G模块
  15. 苹果cms模板_苹果CMS提示“模板文件不存在”怎么办?
  16. 【python、matlab】sRGB颜色空间与线性sRGB空间转换
  17. XML解析之DOM、SAX、JAXP、DOM4J
  18. 笔记本电脑无法连接无线网问题
  19. Origin 三种方法在图片中添加水平辅助线
  20. 天朝皇叔:学习笔记 Qt 连接数据库sql server

热门文章

  1. 使用PowerDesinger 正向工程
  2. UVA11413 Fill the Containers【二分搜索】
  3. Python web —— Selenium 库
  4. 伪随机数与采样(sampling)
  5. Bootstrap 警告
  6. Python 进阶 —— 使用修饰器执行函数的参数检查
  7. linux作为一个开发服务器,怎样搭建一个linux开发服务器
  8. 学计算机的能看出批图吗,P图P的好,女朋友满街跑,P图先学计算机,清华和这些学校少不了...
  9. jsp模糊查询_[内附完整源码和文档] 基于JSP+Servlet校园二手交易平台
  10. python编程入门-Python编程入门经典pdf(Python编程入门教程) 高清中文版