博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MediaInfo源代码分析 4:Inform()函数
阅读量:6927 次
发布时间:2019-06-27

本文共 3698 字,大约阅读时间需要 12 分钟。

hot3.png

注:此前已经写了一系列分析MediaInfo源代码的文章,列表如下:

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

我们来看一下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
\n\n\n
\n\n");    if (XML)  Retour+=__T("
\n");    for (size_t StreamKind=(size_t)Stream_General; StreamKind
\n\n    

");            //输出为XML if (XML) Retour+=__T("
\n  "); //输出为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("\n
");            if (XML) Retour+=__T("\n");            Retour+=MediaInfoLib::Config.LineSeparator_Get();        }    } //输出为HTML    if (HTML) Retour+=__T("\n\n\n"); //输出为XML    if (XML)  Retour+=__T("\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>”)

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

转载于:https://my.oschina.net/leixiaohua1020/blog/302119

你可能感兴趣的文章
Java8新特性系列(流性能)
查看>>
WebView实现页内文字查找功能
查看>>
大众点评点餐小程序开发经验 - 源码解析
查看>>
编写最基本的Gradle插件
查看>>
01、React系列之 React简介
查看>>
浅谈变量类型之外的变量命名
查看>>
Mixin Network第一届开发者大赛作品介绍- iXin和SuperCard
查看>>
20个数据库常见面试题讲解
查看>>
推荐一份 Google 面试指南
查看>>
React实战篇(React仿今日头条)
查看>>
iOS--TextView自适应高度以及键盘遮挡问题
查看>>
QuickBI助你成为分析师-数据建模(二)
查看>>
开源库小技巧+1,在 ContentProvider 中初始化
查看>>
egg sequelize 实践
查看>>
我们为什么需要 lock 文件
查看>>
java发送邮件方法的整理
查看>>
node.js gulp 自动化构建工具
查看>>
要点提炼| 理解JVM之类加载机制
查看>>
Android NDK开发之旅11 JNI JNI数据类型与方法属性访问
查看>>
移动端H5页面注意事项
查看>>