一種音視頻文件轉(zhuǎn)存及檢索方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及視頻文件存儲及檢索領(lǐng)域,尤其涉及一種音視頻文件轉(zhuǎn)存及檢索方法。
【背景技術(shù)】
[0002]目前有很多以MP4、WMV、RM等文件格式存儲的節(jié)目文件,當需要觀看某個絕對時間段的錄像內(nèi)容時,操作非常復(fù)雜。以MP4文件為例,首先需要查找到待觀看的錄像分布在哪些MP4的錄像文件中,然后打開該MP4文件,拖動播放位置到OSD顯示為待觀看的時間處,然后再進行觀看。比如說,當觀看2014年12月I日14:00?14:20的一檔電視節(jié)目的時候,首先需要確定該電視節(jié)目分布在哪些錄像文件中,然后拖動到視頻畫面上顯示時間為14:00的位置開始進行觀看。當需要當觀看的時間段不連續(xù)時,需要反復(fù)上述操作多次。所以這種查看某段時間節(jié)目視頻的操作非常麻煩。
【發(fā)明內(nèi)容】
[0003]有鑒于此,本發(fā)明提供一種音視頻文件轉(zhuǎn)存方法,該方法包括:對若干待轉(zhuǎn)存的音視頻文件按照時間順序進行排序;依次對排好序的各個待轉(zhuǎn)存文件按照塊格式進行存儲;在對每一個待轉(zhuǎn)存的文件按照塊格式進行存儲包括:在存儲設(shè)備上,開辟出塊格式存儲區(qū)域,向其中的超級塊區(qū)域中填入對應(yīng)的超級塊信息,向其中的一級索引區(qū)填入一級時間索引,數(shù)據(jù)單元的二級時間索引區(qū)填入二級時間索引,數(shù)據(jù)單元的數(shù)據(jù)區(qū)中填入I幀組數(shù)據(jù);其中,一級時間索引區(qū)中的第一條一級時間索引中填入該待轉(zhuǎn)存的文件的媒體開始時間Tl ;在第一個數(shù)據(jù)單元的二級時間索引區(qū)的第一條二級時間索引中填入所述時間Tl,在該第一個數(shù)據(jù)單元的二級時間索引區(qū)的第η條二級時間索引中填入時間Τη,其中Tn =Τ1+(η-1)*Ι幀組的幀數(shù)/幀率,η為從2開始的自然數(shù);第一個數(shù)據(jù)單元的數(shù)據(jù)區(qū)填入各二級時間索引對應(yīng)的I幀組數(shù)據(jù);在I幀組的每個幀的ES頭中填充幀內(nèi)包序號、幀首包標識、幀結(jié)尾標識、幀類型、碼流類型、ES凈長度、幀率。
[0004]優(yōu)選地,每隔預(yù)設(shè)時間間隔,利用I幀數(shù)據(jù)解碼獲取OSD時間對所述二級索引時間進行校準。
[0005]優(yōu)選地,當存在待插入的音視頻文件時,重新開辟一塊塊格式存儲區(qū)域用于該音視頻文件的補存;對該塊格式存儲區(qū)域的一級時間索引區(qū)進行標記,以表示其為補存錄像的索引區(qū);將該補存的塊格式文件與之前已經(jīng)存儲的塊格式文件進行索引重構(gòu)。
[0006]優(yōu)選地索引重構(gòu)包括:利用二分法在已經(jīng)存儲的塊格式文件的二級時間索引中確定所述補存索引區(qū)的第一條時間索引的時間之前相鄰的二級時間索引,將該相鄰的二級時間索引進行標記,添加指向補存索引區(qū)的信息。
[0007]優(yōu)選地,在對按照塊格式存儲的文件進行檢索的時候,忽略存在補存標記的一級時間索引區(qū),用二分法定位待檢索錄像的開始時間在其他一級時間索引區(qū)的一級時間索引中的位置,進一步用二分法定位待檢索錄像的開始時間在對應(yīng)的二級時間索引中的位置,如果定位后的位置緊挨著存在補存錄像標記的二級時間索引且在其后,則進一步在該存在補存錄像標記的二級時間索引所指向的補存錄像索引區(qū)再用二分法進行待檢索錄像開始時間的定位。
[0008]相較于現(xiàn)有技術(shù),本發(fā)明的多媒體音視頻文件轉(zhuǎn)存方案將多媒體音視頻文件按照其媒體時間連續(xù)地存儲在塊存儲設(shè)備上。當后續(xù)要查詢某一時間的錄像時,系統(tǒng)能迅速定位到該錄像并自動進行播放。
【附圖說明】
[0009]圖1是一種塊存儲格式。
[0010]圖2是一個ES頭示例。
[0011]圖3是索引重構(gòu)示例圖。
【具體實施方式】
[0012]針對【背景技術(shù)】提出的技術(shù)問題,本發(fā)明提供一種多媒體音視頻文件轉(zhuǎn)存方案。該多媒體音視頻文件轉(zhuǎn)存方案將多媒體音視頻文件按照其媒體時間連續(xù)地存儲在塊存儲設(shè)備上。當后續(xù)要查詢某一時間的錄像時,系統(tǒng)能迅速定位到該錄像并自動進行播放。以下通過具體實施例來詳細描述本發(fā)明方案。
[0013]本實施例中的多媒體音視頻文件包括但不限于MP4、WMV、MR格式的文件。以下以MP4格式文件為例進行說明。
[0014]當前需要對若干個MP4文件按照適于一鍵式檢索的方式進行存儲。
[0015]首先對這若干個MP4文件按照時間順序進行排序。系統(tǒng)先獲取各個文件的媒體開始時間,按照該獲取的媒體開始時間對這些文件進行排序。獲取媒體開始時間的方式包括:讀取攜帶在MP4文件信息中的媒體創(chuàng)建時間;或者讀取以文件方式保存的媒體創(chuàng)建時間;或者可以通過獲取各個文件的第一幀視頻數(shù)據(jù),解碼出OSD時間作為媒體的開始時間。
[0016]然后依次對排好序的各個MP4文件按照塊格式進行存儲。本實施例所述的塊格式請參圖1,其包括如下幾部分:
[0017]超級塊:一般有幾十K(比如16Κ)字節(jié),用來記錄塊格式的版本號、錄像來源設(shè)備編碼。由于超級塊中的數(shù)據(jù)有限,因此通常有較多的預(yù)留空間。
[0018]—級時間索引區(qū):超級塊后面為一級時間索引區(qū),索引區(qū)中的每條時間索引與一個數(shù)據(jù)單元一一對應(yīng)(比如:第η個一級時間索引,對應(yīng)第η個數(shù)據(jù)單元),用于記錄該數(shù)據(jù)單元的最早I幀組的時間,從而可以基于時間快速定位到某個數(shù)據(jù)單元。
[0019]數(shù)據(jù)單元:一級時間索引區(qū)后面是一系列的數(shù)據(jù)單元,用于保存錄像的I幀組數(shù)據(jù)。為了保證I幀組數(shù)據(jù)的連續(xù)寫入,數(shù)據(jù)單元一般達到幾百M字節(jié)(比如256Μ字節(jié))。每個數(shù)據(jù)單元是以一個二級時間索引區(qū)開始的,其中每條時間索引項與一個I幀組—對應(yīng)(比如:第η個二級時間索引,對應(yīng)本數(shù)據(jù)單元的第η個I幀組),用于記錄該I幀組的開始時間,從而可以基于時間快速定位某個I幀組。二級索引區(qū)之后,就是本數(shù)據(jù)單元中的所有I幀組數(shù)據(jù)。I幀組:一個I幀組通常就是I秒的錄像數(shù)據(jù)。在I幀組中,存儲的是該I幀組的所有視頻、音頻數(shù)據(jù)包。I幀組中的視頻、音頻數(shù)據(jù)以ES數(shù)據(jù)的形式進行存儲,ES數(shù)據(jù)具有 ES 頭,該 ES 頭包括 PTS (Presentat1n Time Stamp 顯示時間戳)、DTS (DecodingTime Stamp解碼時間戳)。
[0020]將一個MP4文件按照塊格式進行存儲時要考慮如何生成塊格式中的一級時間索弓1、二級時間索引以及I幀組中的ES頭部數(shù)據(jù)。
[0021]在存儲設(shè)備上,開辟出塊格式存儲區(qū)域,向其中的超級塊區(qū)域中填入對應(yīng)的超級塊信息,向其中的一級索引區(qū)填入一級時間索引,數(shù)據(jù)單元的二級時間索引區(qū)中填入二級時間索引,數(shù)據(jù)單元的數(shù)據(jù)區(qū)中填入對應(yīng)的I幀組數(shù)據(jù)。
[0022]在對排序后的第一個MP4文件按照塊格式進行轉(zhuǎn)存時,一級時間索引區(qū)中的第一條一級時間索引中填入步驟Sll中獲取的該MP4文件的媒體開始時間Tl。對于第一個數(shù)據(jù)單元的二級時間索引區(qū)中第一條二級時間索引(表示為Inl.1)仍然填入上述媒體開始時間Tl,對于Inl.η (第一個數(shù)據(jù)單元的二級時間索引區(qū)中的第η條二級時間索引,η從2開始直到某一個數(shù)值)填入的時間值為Τη,該Tn = Τ1+(η-1)*Ι幀組的幀數(shù)/幀率。第一個數(shù)據(jù)單元的數(shù)據(jù)區(qū)則填入各個二級時間索引對應(yīng)的各個I幀組數(shù)據(jù),比如說Inl.1對應(yīng)的第一個I幀組。如果一個數(shù)據(jù)單元的大小是256Μ,那么當該數(shù)據(jù)單元被存滿時,則在下一個數(shù)據(jù)單元中存儲時間索引和對應(yīng)的數(shù)據(jù)。此時,一級時間索引區(qū)中需要填入一條新的一級時間索引,同樣的二級時間索引區(qū)中也要填入相應(yīng)的二級時間索引。如果一級時間索引區(qū)中設(shè)定存儲256條一級時間索引,對應(yīng)的數(shù)據(jù)單元也有256個,那么當該空間都被存滿時,需要在另外的存儲空間中按照同樣的方式存儲MP4文件中的數(shù)據(jù)。
[0023]為了提高檢索精度,本發(fā)明實施例利用I幀數(shù)據(jù)解碼獲取到的OSD時間對該二級索引時間進行校準。為了提高存儲速率,可以每隔一定的時間間隔進行一次校準。比如說,每隔10個GOP就進行一次校準。例如,Inl.1的時間值是Tl,則計算得到的第11個二級時間索引Inl.11的時間值為Τ1+10*Ι幀組的幀數(shù)/幀率,在利用OSD進行校準時,可以解碼第11個I幀組中的I幀,然后將解碼得到的OSD時間與計算得到的Inl.11時間值進行比較,若兩者的差值大于設(shè)定閾值時,則以當前的OSD時間作為該I幀的二級時間索引中的時間值。后續(xù)二級索引時間的計算以該OSD時間為基準進行計算。上述計算得到的二級時間索引中的時間值精度不準的原因有獲取到的幀率不準、MP4文件部分數(shù)據(jù)丟失等。
[0024]在生成每個幀的ES頭部時,先確定各ES頭部中的PTS、DTS間隔值。PTS間隔值為90*1000/幀率;假設(shè)I幀的PTS時間為tl,則其后的第一個P幀的PTS值為tl+90*1000/幀率;第二個P幀的PTS值為tl+2*90*1000/幀率,以此類推。同樣的,DTS間隔值也為90*1000/幀率;假設(shè)I幀的DTS時間為t2,則其后的第一個P幀的DTS值為t2+90*1000/幀率;第二個P幀的DTS值為t2+2*90*1000/幀率,依次類推。除了 PTS和DTS之外,ES頭中還需要進一步填充幀內(nèi)包序號、幀首包標識、幀結(jié)尾標識、幀類型、碼流類型、ES凈長度、幀率等。請參圖2給出的一個例子。packCnt表示幀內(nèi)包序號,start