MediaInfo是一个用来分析媒体文件的开源工具。 支持的文件很是全面,基本上支持全部的媒体文件。 框架
最近是在作HEVC开发,因此比较关注MediaInfo中关于HEVC的分析与处理。 ide
从MeidaInfo的官网上下载下来的代码比较庞大,工程比较多,可是代码阅读的一个关键在于,先要抓住主干,而后再不断的深刻。先找到本身关注的地方,而后分析,以后再进行分析一些相关的代码。 函数
此处下载的是mediainfo 0.7.72版本。 工具
从下图能够看出,mediaInfo中包括了诸多的工程。 ui
其中,MediaInfoDll是用于生成Dll库的工程,MediaInfoLib是真正的用于分析媒体文件的库,zlib是一个用于无损压缩的库(http://www.zlib.net/),zenlib是一个C++库,其中封装了一些C++操做,好比字符串操做,configuration,bitstreams,threading,translation,和一些跨平台的函数。MediaInfo_CLI是用于生成mediainfo的命令行版本,相应的MediaInfo_GUI用于生成mediainfo的GUI版本。 编码
对于MediaInfoLib工程也包括不少的文件: spa
Archive:支持的各类压缩文档,包括7z,rar,zip,tar等格式 .net
Audio:支持的各类音频编码方式,包括aac,ac3,ape等等 命令行
Export:设置导出的格式,包括MPEG7格式 code
Image:支持的图片压缩编码方式,包括bmp,jpeg等常见格式
Muitiple:支持的文件封转格式,包括flv,mp4,mkv等格式
Reader:支持的输入方式,一直觉得MediaInfo只支持文件输入,后来发现还支持MMS这样的流媒体输入
Tag:支持的标签,包括idv3等等
Text:支持的文本。这个用的比较少
Video:支持的视频编码。包括H.264,H.263等。使人瞩目的是,也支持HEVC。
这儿咱们主要看一看对HEVC的支持,位于文件File_Hevc.cpp中。
File_Hevc类是从File__Analyze继承而来,包括了对码流的分析。
为了分析VPS,SPS和PPS定义了相应的结构体:video_parameter_set_struct,seq_parameter_set_struct和pic_parameter_set_structs。
函数video_parameter_set()是提取VPS信息。
函数seq_parameter_set()提取SPS信息。这其中就包括了对裁剪窗口信息提取:
TEST_SB_SKIP( "conformance_window_flag" ); Get_UE (conf_win_left_offset , "conf_win_left_offset" ); Get_UE (conf_win_right_offset , "conf_win_right_offset" ); Get_UE (conf_win_top_offset , "conf_win_top_offset" ); Get_UE (conf_win_bottom_offset , "conf_win_bottom_offset" );
函数vui_parameters是分析VUI信息,由于其中包括了重要的视频信息:
TEST_SB_SKIP( "vui_parameters_present_flag" ); vui_parameters (video_parameter_set_Item , vui_parameters_Item );
函数pic_parameter_set()提取PPS信息。
函数sei_message()提取SEI信息,这个信息对于mediainfo来讲也很重要。其中比较重要的是sei_message_user_data_unregistered,可能包含了编码器自定义的一些信息。当前版本中,支持x265和ateme两个编码器定义的信息。
函数hrd_parameters提取HRD信息,HRD信息是与码率控制相关的信息,
File_Hevc::Streams_Fill ()函数是对媒体文件中的hevc码流获得的信息填充到相应的结构中,便于被调用。
从这个函数代码能够看到,MediaINfo主要是对码流中的SPS信息进行分析。
for (std::vector<seq_parameter_set_struct*>::iterator seq_parameter_set_Item=seq_parameter_sets.begin(); seq_parameter_set_Item!=seq_parameter_sets.end(); ++seq_parameter_set_Item) if ((*seq_parameter_set_Item)) Streams_Fill(seq_parameter_set_Item);
这一段代码调用另外一个Streams_Fill函数来分析码流,若是存在多个SPS,会获得每一个SPS的信息。
Stream_Fill函数中先计算了视频的分辨率大小,须要注意的是视频中可能有一些裁剪信息,须要利用这些信息来获得正确的宽高。
还有,对于MediaInfo这种主要为了分析码流信息的软件,须要特别注意HEVC中所支持的VUI,由于VUI中正是保存的视频相关的一些重要信息,包括timing_info, aspect_ratio_info等。在MediaInfo以前的版本中,因为忽略了aspect_ratio_info信息,获得的显示宽高比DAR信息是错误的。
从代码来看,mediainfo在分析码流过程当中,跳过了不少的语法元素,由于不少语法元素它暂时是用不到的,它只是保存了那些须要的信息,若是之后再新版本中须要一些信息的话,估计到时候就是保存一下就能够了。
另外,在http://blog.csdn.net/leixiaohua1020/article/details/12449277处有为Mediainfo代码的一些分析,主要是框架吧。