多媒體播放器的音軌切換方法、系統(tǒng)及對應(yīng)播放器和設(shè)備的制作方法
【專利摘要】本發(fā)明公開了一種多媒體播放器的音軌切換方法、系統(tǒng)及對應(yīng)播放器和設(shè)備,所述方法創(chuàng)建與音軌相同個(gè)數(shù)的先進(jìn)先出的數(shù)據(jù)管理模塊;之后,對于數(shù)據(jù)解析端所傳送的音頻數(shù)據(jù),根據(jù)對應(yīng)的音軌索引值,將音頻數(shù)據(jù)寫入對應(yīng)的數(shù)據(jù)管理模塊中;之后,在用戶播放時(shí),將記錄當(dāng)前音軌索引值的變量賦值為當(dāng)前需要播放的音頻數(shù)據(jù)的音軌索引值,以從數(shù)據(jù)管理模塊中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放;之后,清除每個(gè)數(shù)據(jù)管理模塊中過時(shí)的音頻數(shù)據(jù)。本發(fā)明可采用較小的內(nèi)存空間保存多路音頻數(shù)據(jù),并實(shí)現(xiàn)音軌的無縫切換。
【專利說明】多媒體播放器的音軌切換方法、系統(tǒng)及對應(yīng)播放器和設(shè)備
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)存儲領(lǐng)域,特別是一種多媒體播放器的音軌切換方法、系統(tǒng)及對應(yīng)播放器和設(shè)備。
【背景技術(shù)】
[0002]在多媒體播放過程中,如何實(shí)現(xiàn)音頻的無縫切換是用戶面臨的難題。因此,為了存儲、管理多路音頻數(shù)據(jù),必須采用一種高效、實(shí)用的數(shù)據(jù)存儲方法。
[0003]現(xiàn)有的音軌切換技術(shù)主要有兩種,一種是只將目前正在播放的音頻數(shù)據(jù)傳輸?shù)揭纛l緩沖buffer中,進(jìn)行音軌切換時(shí),先清空音頻緩沖buffer,然后數(shù)據(jù)解析端開始傳送屬于新音軌的音頻數(shù)據(jù)。但在播放過程中,為了保證音頻播放的流暢性,數(shù)據(jù)解析端會將數(shù)據(jù)提前送入(一般會提前2s)音頻緩沖buffer,這種方式切完音軌后,buffer中新的緩沖數(shù)據(jù)對應(yīng)的播放時(shí)間會比當(dāng)前多媒體播放時(shí)間晚2s,切換后會出現(xiàn)接近2s時(shí)間的斷音,同時(shí)這種方式?jīng)]有考慮不同音軌對應(yīng)的數(shù)據(jù)幀的大小,會導(dǎo)致音頻buffer的利用率比較低。另一種方法是根據(jù)音軌總個(gè)數(shù)開辟多個(gè)音頻緩沖buffer,緩沖每一路音頻數(shù)據(jù)。這種方法可以解決上述音軌切換出現(xiàn)斷音的問題,但無法解決緩沖buffer利用率低的問題,相反,這種方法申請的buffer越多,buffer利用率越低。
[0004]為此,需要一種更有效的方法解決以上兩種方法存在的缺陷。
【發(fā)明內(nèi)容】
[0005]為解決上述問題,本發(fā)明的目的在于提供一種多媒體播放器的音軌切換方法、系統(tǒng)及對應(yīng)播放器和設(shè)備,動態(tài)分配每一路音頻中音頻數(shù)據(jù)的內(nèi)存空間,在有效的利用存儲空間的基礎(chǔ)上,實(shí)現(xiàn)音頻的無縫音軌切換。
[0006]本發(fā)明解決其問題所采用的技術(shù)方案是:
一種多媒體播放器的音軌切換方法,包括:
(1)根據(jù)碼流所包含的音軌的總個(gè)數(shù)η創(chuàng)建相同個(gè)數(shù)的先進(jìn)先出的數(shù)據(jù)管理模塊StreamManager [η-1],所述數(shù)據(jù)管理模塊StreamManager [η-1]用于對音頻數(shù)據(jù)的進(jìn)行存儲管理;
(2)對于數(shù)據(jù)解析端所傳送的音頻數(shù)據(jù),根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager [m]中,其中,0〈=m〈n ;
(3)在用戶播放時(shí),若用戶選擇的當(dāng)前需要播放的音頻數(shù)據(jù)的音軌索引值為i,則將記錄當(dāng)前音軌索引值的變量k賦值為i,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=i〈n;
(4)清除每個(gè)數(shù)據(jù)管理模塊StreamManager[η-1]中過時(shí)的音頻數(shù)據(jù)。
[0007]優(yōu)選的,所述方法還包括:
(5)當(dāng)用戶進(jìn)行音軌切換時(shí),將當(dāng)前播放的音軌索引值i修改為需要播放的音軌索引值j,并將記錄當(dāng)前音軌索引值的變量k賦值為j,之后,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=j〈n。
[0008]優(yōu)選的,所述創(chuàng)建的每個(gè)數(shù)據(jù)管理模塊StreamManager[n-1]包括有以下用于對音頻數(shù)據(jù)對應(yīng)的數(shù)據(jù)幀進(jìn)行存儲管理的變量:
用于限定允許存儲的最大數(shù)據(jù)幀個(gè)數(shù)nMaxFrameNum ;
所存儲的有效數(shù)據(jù)幀個(gè)數(shù)nValidFrameNum ;
對應(yīng)的用于存儲數(shù)據(jù)幀信息的結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1],所述結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1]包含有以下用于描述數(shù)據(jù)幀信息的變量:
數(shù)據(jù)幀存儲的地址指針pData,
數(shù)據(jù)幀的存儲長度nLength,和數(shù)據(jù)幀對應(yīng)的顯示時(shí)間戳nPts ;
將要讀取的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nReadPos,且0〈=nReadPos〈nMaxFrameNum ;
將要寫入的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nWritePos,且0〈=nWritePos〈nMaxFrameNum ;
將要移除的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nFlushPos。
[0009]優(yōu)選的,所述步驟(2)中,當(dāng)根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager[m]中時(shí),StreamManager[m]首先根據(jù)該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度申請一段內(nèi)存空間,再將音頻數(shù)據(jù)存儲至所申請的內(nèi)存空間,同時(shí),該內(nèi)存空間的地址會被存儲至對應(yīng)pFrames [nWritePos]的pData中,該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度和顯示時(shí)間戳分別存儲在pFrames [nWritePos]的nLength和nPts變量中,然后將nValidFrameNum 加 1,nWritePos 力P 1,若 nWritePos 等于 nMaxFrameNum,則將 nWritePos置為O。
[0010]優(yōu)選的,所述步驟(3)和步驟(5)中,當(dāng)需要從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù)時(shí),具體包括:
從StreamManager [k]的pFrames [nReadPos]中得到對應(yīng)音頻數(shù)據(jù)的數(shù)據(jù)幀的內(nèi)存空間地址、數(shù)據(jù)長度和數(shù)據(jù)的顯示時(shí)間戳,同時(shí)將nValidFrameNum減1,nReadPos加1,若nReadPos 等于 nMaxFrameNum,則將 nReadPos 置為 O。
[0011]優(yōu)選的,所述步驟(4)中,當(dāng)需要清除數(shù)據(jù)管理模塊StreamManager[n_l]中過時(shí)的音頻數(shù)據(jù)時(shí),對于需要清除的音頻數(shù)據(jù),對應(yīng)StreamManager釋放為該音頻數(shù)據(jù)申請的內(nèi)存空間,即清除pFrames [nFlushPos]的pData對應(yīng)的內(nèi)存空間,同時(shí)將nFlushPos加1,若 nFlushPos 等于 nMaxFrameNum,則將 nFlushPos 置為 O。
[0012]一種多媒體播放器的音軌切換系統(tǒng),包括:
模塊創(chuàng)建裝置,用于根據(jù)碼流所包含的音軌的總個(gè)數(shù)η創(chuàng)建相同個(gè)數(shù)的先進(jìn)先出的數(shù)據(jù)管理模塊StreamManager [η-1],所述數(shù)據(jù)管理模塊StreamManager [η-1]用于對音頻數(shù)據(jù)的進(jìn)行存儲管理;
寫入裝置,用于對于數(shù)據(jù)解析端所傳送的音頻數(shù)據(jù),根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager [m]中,其中,0<=m<n ;
讀取播放裝置,用于在用戶播放時(shí),若用戶選擇的當(dāng)前需要播放的音頻數(shù)據(jù)的音軌索弓丨值為i,則將記錄當(dāng)前音軌索引值的變量k賦值為i,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=i〈n ;
清除裝置,用于清除每個(gè)數(shù)據(jù)管理模塊StreamManager [η-1]中過時(shí)的音頻數(shù)據(jù)。
[0013]優(yōu)選的,還包括:
切換裝置,用于當(dāng)用戶進(jìn)行音軌切換時(shí),將當(dāng)前播放的音軌索引值i修改為需要播放的音軌索引值j,并將記錄當(dāng)前音軌索引值的變量k賦值為j,之后,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=j〈no
[0014]優(yōu)選的,所述模塊創(chuàng)建裝置創(chuàng)建的每個(gè)數(shù)據(jù)管理模塊StreamManager [n-1]包括有以下用于對音頻數(shù)據(jù)對應(yīng)的數(shù)據(jù)幀進(jìn)行存儲管理的變量:
用于限定允許存儲的最大數(shù)據(jù)幀個(gè)數(shù)nMaxFrameNum ;
所存儲的有效數(shù)據(jù)幀個(gè)數(shù)nValidFrameNum ;
對應(yīng)的用于存儲數(shù)據(jù)幀信息的結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1],所述結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1]包含有以下用于描述數(shù)據(jù)幀信息的變量:
數(shù)據(jù)幀存儲的地址指針pData,
數(shù)據(jù)幀的存儲長度nLength,和數(shù)據(jù)幀對應(yīng)的顯示時(shí)間戳nPts ;
將要讀取的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nReadPos,且0〈=nReadPos〈nMaxFrameNum ;
將要寫入的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nWritePos,且0〈=nWritePos〈nMaxFrameNum ;
將要移除的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nFlushPos。
[0015]優(yōu)選的,所述寫入裝置根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager[m]中時(shí),StreamManager[m]首先根據(jù)該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度申請一段內(nèi)存空間,再將音頻數(shù)據(jù)存儲至所申請的內(nèi)存空間,同時(shí),該內(nèi)存空間的地址會被存儲至對應(yīng)pFrames [nWritePos]的pData中,該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度和顯示時(shí)間戳分別存儲在 pFrames [nWritePos]的 nLength 和 nPts 變量中,然后將 nValidFrameNum 加 1,nWritePos 加 1,若 nWritePos 等于 nMaxFrameNum,則將 nWritePos 置為 O。
[0016]優(yōu)選的,當(dāng)所述讀取播放裝置和切換裝置需要從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù)時(shí),具體包括:
從StreamManager [k]的pFrames [nReadPos]中得到對應(yīng)音頻數(shù)據(jù)的數(shù)據(jù)幀的內(nèi)存空間地址、數(shù)據(jù)長度和數(shù)據(jù)的顯示時(shí)間戳,同時(shí)將nValidFrameNum減1,nReadPos加1,若nReadPos 等于 nMaxFrameNum,則將 nReadPos 置為 O。
[0017]優(yōu)選的,當(dāng)所述清除裝置需要清除數(shù)據(jù)管理模塊StreamManager[n_l]中過時(shí)的音頻數(shù)據(jù)時(shí),對于需要清除的音頻數(shù)據(jù),對應(yīng)StreamManager釋放為該音頻數(shù)據(jù)申請的內(nèi)存空間,即清除pFrames [nFlushPos]的pData對應(yīng)的內(nèi)存空間,同時(shí)將nFlushPos加1,若nFlushPos 等于 nMaxFrameNum,則將 nFlushPos 置為 O。
[0018]一種播放器,所述播放器采用以上所述的音軌切換系統(tǒng)。
[0019]一種智能設(shè)備,所述智能設(shè)備安裝有以上所述的播放器。
[0020]本發(fā)明的有益效果是: 本發(fā)明采用一種多媒體播放器的音軌切換方法、系統(tǒng)及對應(yīng)播放器和設(shè)備,對每一路音軌分別創(chuàng)建數(shù)據(jù)管理模塊,數(shù)據(jù)管理模塊采用先進(jìn)先出方式,達(dá)到了采用較小的內(nèi)存空間保存多路音頻數(shù)據(jù)的目的;由于各路音頻數(shù)據(jù)都存儲在StreamManager中,用戶在進(jìn)行音軌切換時(shí),可以實(shí)時(shí)地實(shí)現(xiàn)將新的音軌數(shù)據(jù)送入音頻解碼器解碼后進(jìn)行播放,從而達(dá)到無縫切換。
【專利附圖】
【附圖說明】
[0021]下面結(jié)合附圖和實(shí)例對本發(fā)明作進(jìn)一步說明。
[0022]圖1是本發(fā)明所述方法的流程示意圖;
圖2是本發(fā)明所述數(shù)據(jù)管理模塊進(jìn)行數(shù)據(jù)管理的示意框圖。
【具體實(shí)施方式】
[0023]參照圖1所示,本發(fā)明提供了一種多媒體播放器的音軌切換方法,包括:
(1)根據(jù)碼流所包含的音軌的總個(gè)數(shù)η創(chuàng)建相同個(gè)數(shù)的先進(jìn)先出的數(shù)據(jù)管理模塊StreamManager [η-1],所述數(shù)據(jù)管理模塊StreamManager [η-1]用于對音頻數(shù)據(jù)的進(jìn)行存儲管理;
(2)對于數(shù)據(jù)解析端所傳送的音頻數(shù)據(jù),根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager [m]中,其中,0〈=m〈n ;
(3)在用戶播放時(shí),若用戶選擇的當(dāng)前需要播放的音頻數(shù)據(jù)的音軌索引值為i,則將記錄當(dāng)前音軌索引值的變量k賦值為i,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=i〈n;
(4)清除每個(gè)數(shù)據(jù)管理模塊StreamManager[n-1]中過時(shí)的音頻數(shù)據(jù);
(5)當(dāng)用戶進(jìn)行音軌切換時(shí),將當(dāng)前播放的音軌索引值i修改為需要播放的音軌索引值j,并將記錄當(dāng)前音軌索引值的變量k賦值為j,之后,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=j〈n。
[0024]為具體實(shí)現(xiàn)以上所述方法,所述創(chuàng)建的每個(gè)數(shù)據(jù)管理模塊StreamManager [n-1]包括有以下用于對音頻數(shù)據(jù)對應(yīng)的數(shù)據(jù)幀進(jìn)行存儲管理的變量:
用于限定允許存儲的最大數(shù)據(jù)幀個(gè)數(shù)nMaxFrameNum ;
所存儲的有效數(shù)據(jù)幀個(gè)數(shù)nValidFrameNum ;
對應(yīng)的用于存儲數(shù)據(jù)幀信息的結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1],所述結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1]包含有以下用于描述數(shù)據(jù)幀信息的變量:
數(shù)據(jù)幀存儲的地址指針pData,
數(shù)據(jù)幀的存儲長度nLength,和數(shù)據(jù)幀對應(yīng)的顯示時(shí)間戳nPts ;
將要讀取的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nReadPos,且0〈=nReadPos〈nMaxFrameNum,當(dāng)從StreamManager中讀取完一幀數(shù)據(jù)后,nReadPos將自動加1,nValidFrameNum 將自動減 I ;
將要寫入的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nWritePos,且0〈=nWritePos〈nMaxFrameNum,當(dāng)將一幀數(shù)據(jù)添加到 StreamManager 中后,nValidFrameNum 將自動加 1,nWritePos將自動加I ;
將要移除的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nFlushPos,當(dāng)從StreamManager中移除一筆數(shù)據(jù)后,nFlushPos將自動加I。
[0025]其中,所述步驟(2)中,當(dāng)根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager[m]中時(shí),StreamManager[m]首先根據(jù)該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度申請一段內(nèi)存空間,再將音頻數(shù)據(jù)存儲至所申請的內(nèi)存空間,同時(shí),該內(nèi)存空間的地址會被存儲至對應(yīng)pFrames [nWritePos]的pData中,該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度和顯示時(shí)間戮分別存儲在pFrames [nWritePos]的nLength和nPts變量中,然后將nValidFrameNum加 1,nWritePos 加 1,若 nWritePos 等于 nMaxFrameNum,則將 nWritePos 置為 O。
[0026]其中,所述步驟(3)和步驟(5)中,當(dāng)需要從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù)時(shí),具體包括:
從StreamManager [k]的pFrames [nReadPos]中得到對應(yīng)音頻數(shù)據(jù)的數(shù)據(jù)幀的內(nèi)存空間地址、數(shù)據(jù)長度和數(shù)據(jù)的顯示時(shí)間戳,同時(shí)將nValidFrameNum減1,nReadPos加1,若nReadPos 等于 nMaxFrameNum,則將 nReadPos 置為 O。
[0027]其中,所述步驟(4)中,當(dāng)需要清除數(shù)據(jù)管理模塊StreamManager[n_l]中過時(shí)的音頻數(shù)據(jù)時(shí),對于需要清除的音頻數(shù)據(jù),對應(yīng)StreamManager釋放為該音頻數(shù)據(jù)申請的內(nèi)存空間,即清除pFrames [nFlushPos]的pData對應(yīng)的內(nèi)存空間,同時(shí)將nFlushPos加1,若nFlushPos 等于 nMaxFrameNum,則將 nFlushPos 置為 O。
[0028]本發(fā)明在對音頻數(shù)據(jù)處理時(shí),首先根據(jù)音軌的個(gè)數(shù)創(chuàng)建對應(yīng)數(shù)目的先進(jìn)先出的數(shù)據(jù)管理模塊,對應(yīng)的數(shù)據(jù)管理模塊存儲對應(yīng)的音頻數(shù)據(jù)。創(chuàng)建的先進(jìn)先出的數(shù)據(jù)管理模塊動態(tài)的為每一路音頻數(shù)據(jù)分配內(nèi)存空間,可有效的利用存儲空間;由于各路音頻數(shù)據(jù)是單獨(dú)存儲,因此,在進(jìn)行音軌切換時(shí),可以實(shí)時(shí)地實(shí)現(xiàn)將新的音軌數(shù)據(jù)送入音頻解碼器解碼后進(jìn)行播放,實(shí)現(xiàn)音頻的無縫切換,消除延遲。
[0029]本發(fā)明還提供了一種多媒體播放器的音軌切換系統(tǒng),包括:
模塊創(chuàng)建裝置,用于根據(jù)碼流所包含的音軌的總個(gè)數(shù)η創(chuàng)建相同個(gè)數(shù)的先進(jìn)先出的數(shù)據(jù)管理模塊StreamManager [η-1],所述數(shù)據(jù)管理模塊StreamManager [η-1]用于對音頻數(shù)據(jù)的進(jìn)行存儲管理;
寫入裝置,用于對于數(shù)據(jù)解析端所傳送的音頻數(shù)據(jù),根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager [m]中,其中,0<=m<n ;
讀取播放裝置,用于在用戶播放時(shí),若用戶選擇的當(dāng)前需要播放的音頻數(shù)據(jù)的音軌索弓丨值為i,則將記錄當(dāng)前音軌索引值的變量k賦值為i,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=i〈n ;
清除裝置,用于清除每個(gè)數(shù)據(jù)管理模塊StreamManager [n-1]中過時(shí)的音頻數(shù)據(jù);以及切換裝置,用于當(dāng)用戶進(jìn)行音軌切換時(shí),將當(dāng)前播放的音軌索引值i修改為需要播放的音軌索引值j,并將記錄當(dāng)前音軌索引值的變量k賦值為j,之后,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=j〈no
[0030]其中,所述模塊創(chuàng)建裝置創(chuàng)建的每個(gè)數(shù)據(jù)管理模塊StreamManager[n_l]包括有以下用于對音頻數(shù)據(jù)對應(yīng)的數(shù)據(jù)幀進(jìn)行存儲管理的變量: 用于限定允許存儲的最大數(shù)據(jù)幀個(gè)數(shù)nMaxFrameNum ;
所存儲的有效數(shù)據(jù)幀個(gè)數(shù)nValidFrameNum ;
對應(yīng)的用于存儲數(shù)據(jù)幀信息的結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1],所述結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1]包含有以下用于描述數(shù)據(jù)幀信息的變量:
數(shù)據(jù)幀存儲的地址指針pData,
數(shù)據(jù)幀的存儲長度nLength,和數(shù)據(jù)幀對應(yīng)的顯示時(shí)間戳nPts ;
將要讀取的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nReadPos,且0〈=nReadPos〈nMaxFrameNum ;
將要寫入的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nWritePos,且0〈=nWritePos〈nMaxFrameNum ;
將要移除的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nFlushPos。
[0031]所述寫入裝置根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager[m]中時(shí),StreamManager[m]首先根據(jù)該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度申請一段內(nèi)存空間,再將音頻數(shù)據(jù)存儲至所申請的內(nèi)存空間,同時(shí),該內(nèi)存空間的地址會被存儲至對應(yīng)pFrames [nWritePos]的pData中,該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度和顯示時(shí)間戳分別存儲在 pFrames [nWritePos]的 nLength 和 nPts 變量中,然后將 nValidFrameNum 加 1,nWritePos 加 1,若 nWritePos 等于 nMaxFrameNum,則將 nWritePos 置為 O。
[0032]其中,當(dāng)所述讀取播放裝置和切換裝置需要從StreamManager[k]中讀取對應(yīng)的音頻數(shù)據(jù)時(shí),具體包括:
從StreamManager [k]的pFrames [nReadPos]中得到對應(yīng)音頻數(shù)據(jù)的數(shù)據(jù)幀的內(nèi)存空間地址、數(shù)據(jù)長度和數(shù)據(jù)的顯示時(shí)間戳,同時(shí)將nValidFrameNum減1,nReadPos加1,若nReadPos 等于 nMaxFrameNum,則將 nReadPos 置為 O。
[0033]其中,當(dāng)所述清除裝置需要清除數(shù)據(jù)管理模塊StreamManager[n_l]中過時(shí)的音頻數(shù)據(jù)時(shí),對于需要清除的音頻數(shù)據(jù),對應(yīng)StreamManager釋放為該音頻數(shù)據(jù)申請的內(nèi)存空間,即清除pFrames [nFlushPos]的pData對應(yīng)的內(nèi)存空間,同時(shí)將nFlushPos加1,若nFlushPos 等于 nMaxFrameNum,則將 nFlushPos 置為 O。
[0034]本發(fā)明還提供了一種播放器,所述播放器采用以上所述的音軌切換系統(tǒng)。
[0035]本發(fā)明還提供了一種智能設(shè)備,所述智能設(shè)備安裝有以上所述的播放器。
[0036]以上所述,只是本發(fā)明的較佳實(shí)施例而已,本發(fā)明并不局限于上述實(shí)施方式,只要其以相同的手段達(dá)到本發(fā)明的技術(shù)效果,都應(yīng)屬于本發(fā)明的保護(hù)范圍。
【權(quán)利要求】
1.一種多媒體播放器的音軌切換方法,其特征在于,包括: (1)根據(jù)碼流所包含的音軌的總個(gè)數(shù)η創(chuàng)建相同個(gè)數(shù)的先進(jìn)先出的數(shù)據(jù)管理模塊StreamManager [η-l],所述數(shù)據(jù)管理模塊StreamManager [η-1]用于對音頻數(shù)據(jù)的進(jìn)行存儲管理; (2)對于數(shù)據(jù)解析端所傳送的音頻數(shù)據(jù),根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager [m]中,其中,0〈=m〈n ; (3)在用戶播放時(shí),若用戶選擇的當(dāng)前需要播放的音頻數(shù)據(jù)的音軌索引值為i,則將記錄當(dāng)前音軌索引值的變量k賦值為i,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=i〈n; (4)清除每個(gè)數(shù)據(jù)管理模塊StreamManager[η-1]中過時(shí)的音頻數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的音軌切換方法,其特征在于,所述方法還包括: (5)當(dāng)用戶進(jìn)行音軌切換時(shí),將當(dāng)前播放的音軌索引值i修改為需要播放的音軌索引值j,并將記錄當(dāng)前音軌索引值的變量k賦值為j,之后,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=j〈n。
3.根據(jù)權(quán)利要求2所述的音軌切換方法,其特征在于,所述創(chuàng)建的每個(gè)數(shù)據(jù)管理模塊StreamManager [η-1]包括有以下用于對音頻數(shù)據(jù)對應(yīng)的數(shù)據(jù)幀進(jìn)行存儲管理的變量: 用于限定允許存儲的最大數(shù)據(jù)幀個(gè)數(shù)nMaxFrameNum ; 所存儲的有效數(shù)據(jù)幀個(gè)數(shù)nValidFrameNum ; 對應(yīng)的用于存儲數(shù)據(jù)幀信息的結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1],所述結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1]包含有以下用于描述數(shù)據(jù)幀信息的變量: 數(shù)據(jù)幀存儲的地址指針pData, 數(shù)據(jù)幀的存儲長度nLength,和 數(shù)據(jù)幀對應(yīng)的顯示時(shí)間戳nPts ; 將要讀取的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nReadPos,且0〈=nReadPos〈nMaxFrameNum ; 將要寫入的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nWritePos,且0〈=nWritePos〈nMaxFrameNum ; 將要移除的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nFlushPos。
4.根據(jù)權(quán)利要求3所述的音軌切換方法,其特征在于,所述步驟(2)中,當(dāng)根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager [m]中時(shí),StreamManager [m]首先根據(jù)該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度申請一段內(nèi)存空間,再將音頻數(shù)據(jù)存儲至所申請的內(nèi)存空間,同時(shí),該內(nèi)存空間的地址會被存儲至對應(yīng)pFrames [nWritePos]的pData中,該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度和顯示時(shí)間戳分別存儲在pFrames [nWritePos]的 nLength 和 nPts 變量中,然后將 nValidFrameNum 加 1,nWritePos加 1,若 nWritePos 等于 nMaxFrameNum,則將 nWritePos 置為 O。
5.根據(jù)權(quán)利要求4所述的音軌切換方法,其特征在于,所述步驟(3)和步驟(5)中,當(dāng)需要從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù)時(shí),具體包括: 從StreamManager [k]的pFrames [nReadPos]中得到對應(yīng)音頻數(shù)據(jù)的數(shù)據(jù)幀的內(nèi)存空間地址、數(shù)據(jù)長度和數(shù)據(jù)的顯示時(shí)間戳,同時(shí)將nValidFrameNum減1,nReadPos加1,若nReadPos 等于 nMaxFrameNum,則將 nReadPos 置為 O。
6.根據(jù)權(quán)利要求4或5所述的音軌切換方法,其特征在于,所述步驟(4)中,當(dāng)需要清除數(shù)據(jù)管理模塊StreamManager [η-1]中過時(shí)的音頻數(shù)據(jù)時(shí),對于需要清除的音頻數(shù)據(jù),對應(yīng)StreamManager釋放為該音頻數(shù)據(jù)申請的內(nèi)存空間,即清除pFrames [nFlushPos]的pData對應(yīng)的內(nèi)存空間,同時(shí)將nFlushPos加1,若nFlushPos等于nMaxFrameNum,則將nFlushPos 置為 O。
7.一種多媒體播放器的音軌切換系統(tǒng),其特征在于,包括: 模塊創(chuàng)建裝置,用于根據(jù)碼流所包含的音軌的總個(gè)數(shù)η創(chuàng)建相同個(gè)數(shù)的先進(jìn)先出的數(shù)據(jù)管理模塊StreamManager [η-1],所述數(shù)據(jù)管理模塊StreamManager [η-1]用于對音頻數(shù)據(jù)的進(jìn)行存儲管理; 寫入裝置,用于對于數(shù)據(jù)解析端所傳送的音頻數(shù)據(jù),根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager [m]中,其中,0<=m<n ; 讀取播放裝置,用于在用戶播放時(shí),若用戶選擇的當(dāng)前需要播放的音頻數(shù)據(jù)的音軌索弓丨值為i,則將記錄當(dāng)前音軌索引值的變量k賦值為i,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=i〈n ; 清除裝置,用于清除每個(gè)數(shù)據(jù)管理模塊StreamManager [η-1]中過時(shí)的音頻數(shù)據(jù)。
8.根據(jù)權(quán)利要求7所述的音軌切換系統(tǒng),其特征在于,還包括: 切換裝置,用于當(dāng)用戶進(jìn)行音軌切換時(shí),將當(dāng)前播放的音軌索引值i修改為需要播放的音軌索引值j,并將記錄當(dāng)前音軌索引值的變量k賦值為j,之后,從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù),并將讀取的音頻數(shù)據(jù)傳送至音頻解碼模塊進(jìn)行解碼后播放,其中,0〈=j〈no
9.根據(jù)權(quán)利要求8所述的音軌切換系統(tǒng),其特征在于,所述模塊創(chuàng)建裝置創(chuàng)建的每個(gè)數(shù)據(jù)管理模塊StreamManager [η-1]包括有以下用于對音頻數(shù)據(jù)對應(yīng)的數(shù)據(jù)幀進(jìn)行存儲管理的變量: 用于限定允許存儲的最大數(shù)據(jù)幀個(gè)數(shù)nMaxFrameNum ; 所存儲的有效數(shù)據(jù)幀個(gè)數(shù)nValidFrameNum ; 對應(yīng)的用于存儲數(shù)據(jù)幀信息的結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1],所述結(jié)構(gòu)體數(shù)組pFrames [nMaxFrameNum-1]包含有以下用于描述數(shù)據(jù)幀信息的變量: 數(shù)據(jù)幀存儲的地址指針pData, 數(shù)據(jù)幀的存儲長度nLength,和 數(shù)據(jù)幀對應(yīng)的顯示時(shí)間戳nPts ; 將要讀取的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nReadPos,且0〈=nReadPos〈nMaxFrameNum ; 將要寫入的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nWritePos,且0〈=nWritePos〈nMaxFrameNum ; 將要移除的數(shù)據(jù)幀在pFrames數(shù)組中的位置索引nFlushPos。
10.根據(jù)權(quán)利要求9所述的音軌切換系統(tǒng),其特征在于,所述寫入裝置根據(jù)該音頻數(shù)據(jù)對應(yīng)的音軌索引值m,將該音頻數(shù)據(jù)寫入對應(yīng)的StreamManager [m]中時(shí),StreamManager [m]首先根據(jù)該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度申請一段內(nèi)存空間,再將音頻數(shù)據(jù)存儲至所申請的內(nèi)存空間,同時(shí),該內(nèi)存空間的地址會被存儲至對應(yīng)pFrames [nWritePos]的pData中,該音頻數(shù)據(jù)對應(yīng)數(shù)據(jù)幀的長度和顯示時(shí)間戳分別存儲在pFrames [nWritePos]的 nLength 和 nPts 變量中,然后將 nValidFrameNum 加 I,nWritePos加 I,若 nWritePos 等于 nMaxFrameNum,則將 nWritePos 置為 O0
11.根據(jù)權(quán)利要求10所述的音軌切換系統(tǒng),其特征在于,當(dāng)所述讀取播放裝置和切換裝置需要從StreamManager [k]中讀取對應(yīng)的音頻數(shù)據(jù)時(shí),具體包括: 從StreamManager [k]的pFrames [nReadPos]中得到對應(yīng)音頻數(shù)據(jù)的數(shù)據(jù)幀的內(nèi)存空間地址、數(shù)據(jù)長度和數(shù)據(jù)的顯示時(shí)間戳,同時(shí)將nValidFrameNum減1,nReadPos加1,若nReadPos 等于 nMaxFrameNum,則將 nReadPos 置為 O0
12.根據(jù)權(quán)利要求10或11所述的音軌切換系統(tǒng),其特征在于,當(dāng)所述清除裝置需要清除數(shù)據(jù)管理模塊StreamManager [η-l]中過時(shí)的音頻數(shù)據(jù)時(shí),對于需要清除的音頻數(shù)據(jù),對應(yīng)StreamManager釋放為該音頻數(shù)據(jù)申請的內(nèi)存空間,即清除pFrames [nFlushPos]的pData對應(yīng)的內(nèi)存空間,同時(shí)將nFlushPos加I,若nFlushPos等于nMaxFrameNum,則將nFlushPos 置為 O。
13.—種播放器,其特征在于,所述播放器采用如權(quán)利要求12所述的音軌切換系統(tǒng)。
14.一種智能設(shè)備,其特征在于,所述智能設(shè)備安裝有如權(quán)利要求13所述的播放器。
【文檔編號】G11B20/10GK104505109SQ201410849953
【公開日】2015年4月8日 申請日期:2014年12月29日 優(yōu)先權(quán)日:2014年12月29日
【發(fā)明者】劉小燕, 陳小川 申請人:珠海全志科技股份有限公司