码迷,mamicode.com
首页 > 其他好文 > 详细

MediaInfo代码阅读

时间:2015-05-16 18:11:33      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

?

MediaInfo是一个用来分析媒体文件的开源工具。 支持的文件非常全面,基本上支持所有的媒体文件。

最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理。

MeidaInfo的官网上下载下来的代码比较庞大,工程比较多,但是代码阅读的一个关键在于,先要抓住主干,然后再不断的深入。先找到自己关注的地方,然后分析,之后再进行分析一些相关的代码。

此处下载的是mediainfo 0.7.72版本。

从下图可以看出,mediaInfo中包括了诸多的工程。

技术分享

?

其中,MediaInfoDll是用于生成Dll库的工程,MediaInfoLib是真正的用于分析媒体文件的库,zlib是一个用于无损压缩的库(http://www.zlib.net/),zenlib是一个C++库,其中封装了一些C++操作,比如字符串操作,configurationbitstreamsthreadingtranslation,和一些跨平台的函数。MediaInfo_CLI是用于生成mediainfo的命令行版本,相应的MediaInfo_GUI用于生成mediainfoGUI版本。

?

对于MediaInfoLib工程也包括很多的文件:

技术分享

?Archive:支持的各种压缩文档,包括7zrarziptar等格式

?Audio:支持的各种音频编码方式,包括aacac3ape等等?

?Export:设置导出的格式,包括MPEG7格式?

?Image:支持的图片压缩编码方式,包括bmpjpeg等常见格式?

?Muitiple:支持的文件封转格式,包括flvmp4mkv等格式

?Reader:支持的输入方式,一直以为MediaInfo只支持文件输入,后来发现还支持MMS这样的流媒体输入?

?Tag:支持的标签,包括idv3等等

Text:支持的文本。这个用的比较少 ?

?Video:支持的视频编码。包括H.264H.263等。令人瞩目的是,也支持HEVC

?

这儿我们主要看一看对HEVC的支持,位于文件File_Hevc.cpp中。

File_Hevc类是从File__Analyze继承而来,包括了对码流的分析。

为了分析VPSSPSPPS定义了相应的结构体:video_parameter_set_structseq_parameter_set_structpic_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,可能包含了编码器自定义的一些信息。当前版本中,支持x265ateme两个编码器定义的信息。

?

函数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代码的一些分析,主要是框架吧。

MediaInfo代码阅读

标签:

原文地址:http://www.cnblogs.com/xkfz007/p/4507990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!