在做碼流分析時,影象解析度、幀率這類的基本資訊,當然不可少。本文介紹如何從nal中計算到影象寬、高,還有解析度。於是h264和h265有相似性,就在一起寫了。
寬高可從sps欄位計算得到,公式如下:
width = (pic_width_in_mbs_minus1+1)*16;但以上是針對寬高是16的整數倍的情況,當不是16整數倍時,frame_cropping_flag值為1,frame_mbs_only_flag為1,公式如下:height = (pic_height_in_map_units_minus1+1)*16;
(也可以認為統一使用下面的公式)
width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_left_offset*2 - frame_crop_right_offset*2;height= ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - \
(frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2);
pic_width_in_mbs_minus1 : 119根據第二個公式pic_height_in_map_units_minus1 : 67
frame_mbs_only_flag : 1
mb_adaptive_frame_field_flag : 0
direct_8x8_inference_flag : 1
frame_cropping_flag : 1
frame_crop_left_offset : 0
frame_crop_right_offset : 0
frame_crop_top_offset : 0
frame_crop_bottom_offset : 4
width = (119+1) * 18 - 0*2 - 0*2 = 1920以上公式是一年多以前在網上找的,仔細看手冊,上面的公式有侷限性。根據h264手冊table6-1及7.4.2.1.1,參考mkvtoolnix**,比如穩妥的計算方法如下:height = (2-1) * (67+1)*16 - 0*2 - 4*2 = 1088 - 8 = 1080
// 寬高計算公式h.265類似,但sps的字段不同了。公式如下:width = (sps->pic_width_in_mbs_minus1+1) * 16;
height = (2 - sps->frame_mbs_only_flag)* (sps->pic_height_in_map_units_minus1 +1) * 16);
if(sps->frame_cropping_flag)
else if (1 == sps->chroma_format_idc) // 4:2:0
else if (2 == sps->chroma_format_idc) // 4:2:2
else // 3 == sps.chroma_format_idc // 4:4:4
width -= crop_unit_x * (sps->frame_crop_left_offset + sps->frame_crop_right_offset);
height -= crop_unit_y * (sps->frame_crop_top_offset + sps->frame_crop_bottom_offset);
}
width = sps->pic_width_in_luma_samples;當視窗有裁剪時(conformance_window_flag為1),計算如下:height = sps->pic_height_in_luma_samples;
sub_width_c = ((1==chroma_format_idc)||(2 == chroma_format_idc))&&(0==separate_colour_plane_flag)?2:1;上式根據h265手冊table6-1及7.4.3.2.1小節計算寬、高。注意,手冊裡加了1,但實際不使用。sub_height_c = (1==chroma_format_idc)&& (0 == separate_colour_plane_flag)?2:1;
width -= (sub_width_c*conf_win_right_offset + sub_width_c*conf_win_left_offset);
height -= (sub_height_c*conf_win_bottom_offset + sub_height_c*conf_win_top_offset);
參考mkvtoolnix討論:
h264和h265幀率計算公式相同,如下:
max_framerate = (float)(sps->vui.vui_time_scale) / (float)(sps->vui.vui_num_units_in_tick);使用x264編碼yuv序列,設定為25fps時,time_scale為50,num_units_in_tick為1,計算得50fps,與實際不符。而x265用同樣的引數編碼,計算得到的幀率是正常的。
網上有說法,當nuit_field_based_flag為1時,要再除以2。另外說x264將該值設定為0,所以得到的值不是實際值。參見:
目前還沒研究透這一點。
從H264 H265碼流中獲取寬 高及幀率
在做碼流分析時,影象解析度 幀率這類的基本資訊,當然不可少。本文介紹如何從nal中計算到影象寬 高,還有解析度。由於h264和h265有相似性,就在一起寫了。一 從碼流獲得寬 高 1 h264 寬高可從sps欄位計算得到,公式如下 width pic width in mbs minus1 1 16...
從H264 H265碼流中獲取寬 高及幀率
在做碼流分析時,影象解析度 幀率這類的基本資訊,當然不可少。本文介紹如何從nal中計算到影象寬 高,還有解析度。於是h264和h265有相似性,就在一起寫了。一 從碼流獲得寬 高 1 h264 寬高可從sps欄位計算得到,公式如下 width pic width in mbs minus1 1 16...
開源工程 之裸碼流提取工具 H264 H265
序 工程中常常需要分析一些碼流,但碼流檔案過大的話,不利於分析具體的幀資料,由此編寫了碼流提取軟體。此工具是在業餘時間完成,很多功能尚待完善,如果茫茫中,你發現了此工具,也感興趣研究,希望你將工具改進之後開源出來,方便你 我以及大家 2 軟體截圖 1.碼流拖曳到軟體中顯示如下 2.在某幀上右擊儲存裸...