MPEG4碼流的幀率計算
MPEG4標準協議中。
VOL頭中的Vop_time_increment_resolution和VOP頭中的Vop_time_increment,一起確定了碼流所採用的幀率。
VOL頭中的Vop_time_increment_resolution,指示了vop_time_increment 的時間解析度。它的值實際上就表示了1 秒被分成多少間隔。
VOP頭中的Vop_time_increment,單位為vol 中定義的1/vop_time_increment_resolution 秒,它給出當前vop 的以modulo_time_base 為基準的精確時間。它的取值範圍為[0,vop_time_increment_resolution]。
簡單計算,碼流的實時幀率應該等於Vop_time_increment_resolution/(每個Vop_time_increment的差值)。
VOL中的fixed_vop_rate,表示所有VOP是否採用固定的幀率編碼。只有當任意兩個連續的vop 顯示間隔是常數時,它才被設定為1。
Fixed_vop_time_increment:這個碼字描述了顯示序列中兩個vop 之間的時間長度,單位由vop_time_increment_resolution 決定, 等於它的倒數。
在這種情況下,碼流的固定幀率由vop_time_increment_resolution/fixed_vop_time_increment給出。
對於VOP中的modulo_time_base,它由一個0 和後面緊跟著的若干個1 組成,每個1 表示1秒。每過1s,0後面多1個1。
GOV頭中的時間顯示以此為基準。
以下是標準中的例子。
存在VLC接收碼流時,幀率顯示與實際幀率不一致的情況。
使用ElecardStreamEye分析幀率30的碼流,使用VLC接收卻是60或30000。
應該是因為VLC在解碼時,只關心vop_time_increment_resolution的值,而沒有關心vop_time_increment的值。
在實際應用中還存在這樣的問題:
設定的幀率是25幀,GOV中的時間也是按照25幀1秒來計算。
但vop_time_increment_resolution和vop_time_increment的增量分別是60和2,等於是30幀,實際位元速率也是按照30幀來控制。
這樣需要從編碼入手進行修改。