一種基于h264、h265視頻分析的時間戳補(bǔ)償或修正的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種基于H264、H265視頻分析的時間戳補(bǔ)償或修正的方法。
【背景技術(shù)】
[0002]視頻文件或者流是由視頻基本流(Video Element Stream)以及視頻容器(container)組成,視頻基本流的格式包含H264、H265等視頻格式,視頻內(nèi)容包含顯示時間計數(shù)(P0C,Picture Order of Count),容器包含MPEG、TS、PS、VOB、MKV、AV1、FLV等國際通用容器格式,包含了每一幀的時間戳(PTS)以及/或者Frame rate信息,而這些時間戳信息可能通過各種傳輸系統(tǒng)、處理系統(tǒng),及最后由于各種原因?qū)е聛G失或者錯誤,這樣的視頻文件在后續(xù)的使用(播放、編輯、轉(zhuǎn)碼等)會造成很多問題,比如出現(xiàn)卡頓、與設(shè)備的兼容性等問題。
【發(fā)明內(nèi)容】
[0003]基于此,有必要提供一種用于檢測視頻文件或者視頻流中的時間戳丟失或錯誤,且可補(bǔ)償或修正這些時間戳的基于H264、H265視頻分析的時間戳補(bǔ)償或修正的方法。
[0004]根據(jù)本發(fā)明的一方面,提供了一種基于H264、H265視頻分析的時間戳補(bǔ)償或修正的方法,包括如下步驟:
[0005]解析原始文件的容器層信息,獲取每幀的時間戳,并在缺失時間戳的幀位標(biāo)注“缺失”;
[0006]解析原始文件的視頻層信息,記錄每幀的P0C;
[0007]統(tǒng)一化跨GOP的POC,使后一個GOP的任意一幀的POC,大于前一個GOP的任意一幀的POC ;
[0008]對每幀的POC按照從小到大進(jìn)行排序,并對缺失時間戳的幀進(jìn)行補(bǔ)償處理;
[0009]對每幀的時間戳按照從小到大進(jìn)行排序,并對時間戳進(jìn)行檢測,對存在錯誤的時間戳進(jìn)行修正。
[0010]在其中一個實(shí)施例中,對缺失時間戳的幀進(jìn)行補(bǔ)償處理的步驟中,具體的補(bǔ)償處理方法如下:
[0011 ] al、先找到含POC序號最小、且無缺失時間戳的幀;
[0012]bl、若步驟al找到的幀非第一個幀,則先對步驟al找到的幀以前的所有缺失時間戳的幀進(jìn)行補(bǔ)償;
[0013]Cl、對于步驟al找到的幀之后的幀,通過增加單幀時長的算法,對步驟al找到的幀往后所有缺失時間戳的幀進(jìn)行補(bǔ)償。
[0014]這種基于H264、H265視頻分析的時間戳補(bǔ)償或修正的方法,通過檢測到的容器層的時間戳缺失或者錯誤等信息,可根據(jù)視頻文件中的P0C、時間戳以及單幀時長信息來重構(gòu)正確的時間戳,從而使視頻文件可以兼容更多的視頻播放、編輯等軟硬件。
【具體實(shí)施方式】
[0015]為了便于理解本發(fā)明,下面將用具體實(shí)施例對本發(fā)明進(jìn)行更全面的描述。但是,本發(fā)明可以以許多不同的形式來實(shí)現(xiàn),并不限于本文所描述的實(shí)施例。相反地,提供這實(shí)施例的目的是使對本發(fā)明的公開內(nèi)容的理解更加透徹全面。
[0016]本發(fā)明一實(shí)施例的基于H264、H265視頻分析的時間戳補(bǔ)償或修正的方法,包括如下步驟:
[0017]解析原始文件的容器層信息,獲取每幀的時間戳,并在缺失時間戳的幀位標(biāo)注“缺失”;
[0018]解析原始文件的視頻層信息,記錄每幀的P0C;
[0019]統(tǒng)一化跨GOP的POC,使后一個GOP的任意一幀的POC,大于前一個GOP的任意一幀的POC ;
[0020]對每幀的POC按照從小到大進(jìn)行排序,并對缺失時間戳的幀進(jìn)行補(bǔ)償處理;
[0021]對每幀的時間戳按照從小到大進(jìn)行排序,并對時間戳進(jìn)行檢測,對存在錯誤的時間戳進(jìn)行修正。
[0022]具體地,解析原始文件的視頻層信息,記錄每幀的POC的步驟中,POC代表了當(dāng)前幀與當(dāng)前GOP內(nèi)與其他幀的顯示先后關(guān)系。同一個GOP內(nèi),POC越小,則顯示順序越考前,POC越大,則顯示順序越靠后。由于POC不容易因視頻處理傳輸?shù)倪^程發(fā)生變化,所以可認(rèn)為POC是穩(wěn)定可靠的信息,且每幀都有POC,不存在缺失的問題。
[0023]具體地,統(tǒng)一化跨GOP的POC的步驟中,由于文件位置較前的GOP的任意一幀的顯示順序都先于文件位置較晚的GOP中的任意一幀,可通過以下方法調(diào)整POC的值,使得文件中所有的POC按順序呈現(xiàn)越大。
[0024]具體的調(diào)整方法如下:
[0025]對于第一個G0P,調(diào)整后的POC記為原始P0C,并記錄當(dāng)前最大的P0CS“P0C max”;
[0026]若對于第η個GOP的POC已經(jīng)調(diào)整完畢,第n+1個GOP的POC調(diào)整步驟為,設(shè)第n+1個GOP的最小POC記錄為“POC min”,則第n+1個GOP的每幀的POC都加上“(“POC max,,+ l)-“P0Cmin””,同時將調(diào)整完第n+1后的最大的POC記錄為“POC max” ;
[0027]從第一個GOP到最后G0P,反復(fù)遞歸調(diào)整,直到文件中的所有GOP調(diào)整完畢,則調(diào)整后的POC代表了文件中所有幀的顯示先后關(guān)系。
[0028]具體地,對每幀的POC按照從小到大進(jìn)行排序的步驟,具體的排序方法如下:
[0029]設(shè)文件共有I個幀,對每幀的POC按從小到大的順序進(jìn)行編碼,第i個POC的序號為O
(i),l < 1^0(1)<0(1)<00),大小判斷原則為0(1-1)<0(1)<0(1+1)。
[0030]對缺失時間戳的幀進(jìn)行補(bǔ)償處理的步驟,具體的補(bǔ)償處理方法如下:
[0031]al、先找到含所述POC序號最小、且無缺失所述時間戳的所述幀;
[0032]具體為,先找到含POC序號最小、且無缺失時間戳的幀,設(shè)該幀的POC序號為0(p),I<P< N,對該幀的時間戳進(jìn)行對應(yīng)的編碼,序號為PTS(p)。
[0033]bl、若步驟al找到的所述幀非第一個幀,則先對步驟al找到的所述幀以前的所有缺失所述時間戳的幀進(jìn)行補(bǔ)償;
[0034]具體為,若O(p )> O (I ),則先補(bǔ)償序號為O (I)?O (p-1)的POC對應(yīng)的幀的時間戳,補(bǔ)償方法為,設(shè)一幀含序號為O (q)的POC,I < q < P,按照算式“PTS (p)-(0(p)_0(q))X單幀時長”得出該序號為0(q)的POC的幀對應(yīng)的時間戳。
[0035]Cl、對于步驟al找到的所述幀之后的幀,通過增加單幀時長的算法,對步驟al找到的幀往后所有缺失所述時間戳的幀進(jìn)行補(bǔ)償。
[0036]具體為,對于含序號為0(ρ+1)的POC的幀,若該幀缺失時間戳,按照算式“PTS(p+l)= PTS(P)+單幀時長”得出該序號為0(ρ+1)的POC的幀對應(yīng)的時間戳。