一種wmv文件的解碼方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及音視頻解碼技術(shù)領(lǐng)域,特別涉及一種WMV文件的解碼方法和裝置。
【背景技術(shù)】
[0002]WMV(Windows Media Video)是微軟公司開(kāi)發(fā)的一組數(shù)字視頻編解碼格式的通稱,它是Windows Media架構(gòu)下的一部分。WMV可以使用如MPlayer或者Windows Media Player這樣的播放器播放,Windows Media Player只能在微軟視窗和Macintosh系統(tǒng)上使用,有許多用于如Linux這樣不同平臺(tái)上的使用FFmpeg實(shí)現(xiàn)WMV編解碼的第三方播放器。
[0003]視頻流通常與Windows Media Aud1音頻流組合在一起并且使用擴(kuò)展名為.wmv或者.asf的Advanced Streaming Format的文件進(jìn)行封裝。WMV通常使用AdvancedStreaming Format (ASF)封裝,它也可以使用AVI或者M(jìn)atroska格式封裝。如果是AVI封裝的文件結(jié)果文件可以是.avi,如果是ASF封裝的話則是.wmv或者.asf,如果是MKV封裝的話則是.mkvo
[0004]當(dāng)使用VirtualDub編碼器編碼和WMV9VCM編解碼實(shí)現(xiàn)的時(shí)候WMV可以存儲(chǔ)在AVI文件中。用于Mac的微軟公司媒體播放器不支持所有的WMV編碼的文件,因?yàn)樗恢С諥SF文件封裝,F(xiàn)lip4Mac和QuickTime或者用于MacOSX的MPlayer可以播放更多的文件。
[0005]在現(xiàn)有技術(shù)中,由于通常格式的數(shù)據(jù)包,一個(gè)數(shù)據(jù)包只包括一幀數(shù)據(jù),但在對(duì)WMV文件進(jìn)行解碼時(shí),數(shù)據(jù)包無(wú)法只解出一個(gè)幀,而是一個(gè)數(shù)據(jù)包可能包括多個(gè)幀。在WMV文件中,一個(gè)數(shù)據(jù)包可能包含多個(gè)視頻幀或者音頻幀,但是,在采用現(xiàn)有技術(shù)中的解碼方法得到數(shù)據(jù)包時(shí),無(wú)法得知原WMV文件中數(shù)據(jù)包中有多少幀,也不知道什么時(shí)候解碼結(jié)束,給實(shí)際的解碼操作和信息瀏覽帶來(lái)了不便。
【發(fā)明內(nèi)容】
[0006]本發(fā)明提供一種WMV文件的解碼方法和裝置,用以解決現(xiàn)有技術(shù)中存在的無(wú)法獲知原WMV文件包含的幀數(shù)量及解碼進(jìn)度的問(wèn)題,實(shí)現(xiàn)提高解碼效率的目的。
[0007]本發(fā)明提供一種WMV文件的解碼方法,包括:
[0008]步驟A:獲取待解碼的WMV文件的數(shù)據(jù)包描述信息,根據(jù)所述數(shù)據(jù)包描述信息獲取數(shù)據(jù)包的數(shù)據(jù)總長(zhǎng)度BI ;
[0009]步驟B:根據(jù)所述數(shù)據(jù)包描述信息中的數(shù)據(jù)格式,選擇與所述數(shù)據(jù)包中的數(shù)據(jù)格式對(duì)應(yīng)的解碼方式;
[0010]步驟C:根據(jù)所述對(duì)應(yīng)的解碼方式對(duì)數(shù)據(jù)包的一個(gè)數(shù)據(jù)幀進(jìn)行解碼,獲取解碼后的第一個(gè)數(shù)據(jù)幀,計(jì)算所述第一個(gè)數(shù)據(jù)幀在數(shù)據(jù)包中的長(zhǎng)度B2 ;
[0011]步驟D:判斷所述數(shù)據(jù)的總長(zhǎng)度BI與所述第一個(gè)數(shù)據(jù)幀在數(shù)據(jù)包中的長(zhǎng)度B2之差是否小于或等于零,如果是,則結(jié)束解碼;
[0012]如果不是,則重復(fù)所述步驟C。
[0013]本發(fā)明實(shí)施例的一些有益效果可以包括:
[0014]該實(shí)施例通過(guò)獲取數(shù)據(jù)包的描述信息,進(jìn)而獲取數(shù)據(jù)包中數(shù)據(jù)的總長(zhǎng)度和數(shù)據(jù)格式,根據(jù)數(shù)據(jù)格式,可以選擇與該數(shù)據(jù)格式相對(duì)應(yīng)的解碼方式對(duì)WMV文件進(jìn)行解碼,保證了對(duì)WMV文件解碼的快速和便捷。當(dāng)解碼出第一個(gè)數(shù)據(jù)幀時(shí),將該數(shù)據(jù)幀在數(shù)據(jù)包中的長(zhǎng)度與數(shù)據(jù)總長(zhǎng)度進(jìn)行比較,判斷其是否大于或等于數(shù)據(jù)總長(zhǎng)度,如果是,即說(shuō)明數(shù)據(jù)包中已經(jīng)全部解碼,可以直接結(jié)束解碼,節(jié)省了工作時(shí)間,提高了工作效率;如果該數(shù)據(jù)幀在數(shù)據(jù)包中的長(zhǎng)度小于數(shù)據(jù)總長(zhǎng)度,說(shuō)明還有數(shù)據(jù)包未解碼,應(yīng)當(dāng)繼續(xù)對(duì)數(shù)據(jù)包進(jìn)行解碼。該方法對(duì)每次解碼后的數(shù)據(jù)幀長(zhǎng)度與數(shù)據(jù)總長(zhǎng)度進(jìn)行比較,可以實(shí)現(xiàn)在全部數(shù)據(jù)數(shù)據(jù)包解碼完成時(shí),及時(shí)結(jié)束解碼。
[0015]在一個(gè)實(shí)施實(shí)施例中,在所述步驟C和所述步驟D之間還包括:
[0016]步驟E:監(jiān)測(cè)當(dāng)前數(shù)據(jù)包的解碼速度,判斷所述解碼速度是否達(dá)到預(yù)設(shè)的解碼速度;
[0017]步驟F:如果所述解碼速度小于預(yù)設(shè)解碼速度,則判斷當(dāng)前待解碼數(shù)據(jù)幀的類型;
[0018]步驟G:若所述當(dāng)前待解碼數(shù)據(jù)幀為非預(yù)設(shè)類型的數(shù)據(jù)幀,則丟棄所述當(dāng)前待解碼數(shù)據(jù)幀。
[0019]該實(shí)施例對(duì)解碼過(guò)程中的解碼速度與預(yù)設(shè)的解碼速度進(jìn)行比較,如果達(dá)到解碼速度,則可以正常繼續(xù)解碼;如果未達(dá)到預(yù)設(shè)的解碼速度,則說(shuō)明當(dāng)前待解碼的數(shù)據(jù)幀可能不是實(shí)際需要的WMV文件的數(shù)據(jù)幀,進(jìn)而對(duì)當(dāng)前待解碼數(shù)據(jù)幀的類型進(jìn)行判斷是否屬于預(yù)設(shè)類型的數(shù)據(jù)幀,如果不是,則直接將該數(shù)據(jù)幀丟棄,防止在解碼過(guò)程對(duì)不必要數(shù)據(jù)幀進(jìn)行解碼,造成解碼時(shí)間的浪費(fèi),降低解碼效率。
[0020]在一個(gè)實(shí)施例中,所述步驟E具體包括:
[0021]獲取解碼狀態(tài)參數(shù),所述解碼狀態(tài)參數(shù)為解碼過(guò)程中對(duì)處理器和內(nèi)存的資源利用率;
[0022]判斷所述資源利用率是否小于預(yù)設(shè)利用率,如果是則所述解碼狀態(tài)參數(shù)的數(shù)值不屬于預(yù)設(shè)數(shù)值范圍;
[0023]如果所述解碼狀態(tài)參數(shù)的數(shù)值不屬于預(yù)設(shè)數(shù)值范圍,則所述解碼速度小于預(yù)設(shè)解碼速度。
[0024]該實(shí)施例主要對(duì)如何確定解碼速度小于預(yù)設(shè)解碼速度的方法進(jìn)行了限定,首先通過(guò)獲取當(dāng)前正在解碼時(shí)的解碼狀態(tài)參數(shù),該解碼狀態(tài)參數(shù)包含了對(duì)處理器和內(nèi)存的資源利用率。判斷該資源利用率是否小于預(yù)設(shè)的資源利用率,如果是則說(shuō)明解碼狀態(tài)參數(shù)不在預(yù)設(shè)的數(shù)值范圍內(nèi),進(jìn)而說(shuō)明解碼速度小于預(yù)設(shè)的解碼速度。因?yàn)榻獯a速度本身并無(wú)具體參數(shù)表示,該實(shí)施例對(duì)如何判斷當(dāng)前解碼速度小于預(yù)設(shè)解碼速度進(jìn)行了詳細(xì)說(shuō)明,為判斷解碼速度提供了便利,節(jié)省了工作時(shí)間,提高了工作效率。
[0025]在一個(gè)實(shí)施例中,所述步驟B具體包括:
[0026]根據(jù)所述數(shù)據(jù)包的描述信息包含的音視頻標(biāo)識(shí)位,確定所述數(shù)據(jù)包中數(shù)據(jù)為音頻數(shù)據(jù)或視頻數(shù)據(jù);
[0027]根據(jù)確定后的數(shù)據(jù)包中的音頻數(shù)據(jù)或視頻數(shù)據(jù),調(diào)取與所述音頻數(shù)據(jù)或視頻數(shù)據(jù)對(duì)應(yīng)的解碼方式。
[0028]該實(shí)施例中,由于WMV文件可能是視頻文件也可能是音頻文件,因此,提取數(shù)據(jù)包描述信息中包含的音視頻標(biāo)志位,判斷WMV文件數(shù)據(jù)為視頻文件還是音頻文件,進(jìn)而調(diào)用與該視頻文件或音頻文件相對(duì)應(yīng)的解碼方式進(jìn)行解碼,防止由于調(diào)取的解碼方式與數(shù)據(jù)類型不一致,導(dǎo)致解碼時(shí)間的浪費(fèi)或解碼過(guò)程中的錯(cuò)誤解碼,提高了解碼的效率。
[0029]在一個(gè)實(shí)施例中,在所述步驟D中結(jié)束解碼之前還包括:
[0030]對(duì)已完成解碼的數(shù)據(jù)包個(gè)數(shù)A2進(jìn)行統(tǒng)計(jì),判斷所述已完成解碼的數(shù)據(jù)包個(gè)數(shù)A2是否達(dá)到預(yù)先獲得的數(shù)據(jù)包總個(gè)數(shù)Al ;
[0031]如果B1-B2 ^ O, A2 < Al,則將所述全部數(shù)據(jù)包中未解碼的數(shù)據(jù)包丟棄;
[0032]如果B1-B2彡0,A2 = Al,則結(jié)束解碼。
[0033]該實(shí)施例中,在已解碼數(shù)據(jù)幀長(zhǎng)度大于等于數(shù)據(jù)總長(zhǎng)度的同時(shí),還對(duì)已經(jīng)完成解碼的數(shù)據(jù)包個(gè)數(shù)與數(shù)據(jù)包總個(gè)數(shù)進(jìn)行比較,如果已完成解碼的數(shù)據(jù)包個(gè)數(shù)小于數(shù)據(jù)包總個(gè)數(shù),則說(shuō)明后續(xù)未解碼的數(shù)據(jù)包均為空,可以直接丟棄,節(jié)省了解碼時(shí)間;如果已完成解碼的數(shù)據(jù)包個(gè)數(shù)等于數(shù)據(jù)包總個(gè)數(shù),說(shuō)明已經(jīng)解碼完成,直接結(jié)束解碼。該方法通過(guò)比較已完成解碼的數(shù)據(jù)包個(gè)數(shù)與數(shù)據(jù)包總個(gè)數(shù),為是否直接結(jié)束解碼提供了依據(jù),提高了解碼效率。
[0034]一種WMV文件的解碼裝置,包括:
[0035]信息獲取模塊,用于獲取待解碼的WMV文件的數(shù)據(jù)包總個(gè)數(shù)Al和數(shù)據(jù)包描述信息,根據(jù)所述數(shù)據(jù)包描述信息獲取全部數(shù)據(jù)包中數(shù)據(jù)總長(zhǎng)度BI,所述描述信息包括數(shù)據(jù)格式和數(shù)據(jù)長(zhǎng)