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