從H264 H265碼流中獲取寬 高及幀率

2021-10-02 05:23:59 字數 2895 閱讀 4435

在做碼流分析時,影象解析度、幀率這類的基本資訊,當然不可少。本文介紹如何從nal中計算到影象寬、高,還有解析度。於是h264和h265有相似性,就在一起寫了。

一、從碼流獲得寬、高

1、h264

寬高可從sps欄位計算得到,公式如下:

width = (pic_width_in_mbs_minus1+1)*16;

height = (pic_height_in_map_units_minus1+1)*16;

但以上是針對寬高是16的整數倍的情況,當不是16整數倍時,frame_cropping_flag值為1,frame_mbs_only_flag為1,公式如下:

(也可以認為統一使用下面的公式)

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

height = (2-1) * (67+1)*16 - 0*2 - 4*2 = 1088 - 8 = 1080

以上公式是一年多以前在網上找的,仔細看手冊,上面的公式有侷限性。根據h264手冊table6-1及7.4.2.1.1,參考mkvtoolnix**,比如穩妥的計算方法如下:

// 寬高計算公式

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;

height = sps->pic_height_in_luma_samples;

當視窗有裁剪時(conformance_window_flag為1),計算如下:

sub_width_c  = ((1==chroma_format_idc)||(2 == chroma_format_idc))&&(0==separate_colour_plane_flag)?2: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);

三、幀率

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有相似性,就在一起寫了。寬高可從sps欄位計算得到,公式如下 width pic width in mbs minus1 1 16 height pic height...

從H264 H265碼流中獲取寬 高及幀率

在做碼流分析時,影象解析度 幀率這類的基本資訊,當然不可少。本文介紹如何從nal中計算到影象寬 高,還有解析度。由於h264和h265有相似性,就在一起寫了。一 從碼流獲得寬 高 1 h264 寬高可從sps欄位計算得到,公式如下 width pic width in mbs minus1 1 16...

開源工程 之裸碼流提取工具 H264 H265

序 工程中常常需要分析一些碼流,但碼流檔案過大的話,不利於分析具體的幀資料,由此編寫了碼流提取軟體。此工具是在業餘時間完成,很多功能尚待完善,如果茫茫中,你發現了此工具,也感興趣研究,希望你將工具改進之後開源出來,方便你 我以及大家 2 軟體截圖 1.碼流拖曳到軟體中顯示如下 2.在某幀上右擊儲存裸...