對多媒體文件進行按需跳轉的方法與流程
2023-06-13 14:59:36

本發明涉及一種對多媒體文件進行按需跳轉的方法,尤其涉及一種綜合利用英特爾多媒體軟體開發包(intel media sdk)與ffmpeg軟體開發包來實現視音頻同步跳轉(seek)的方法。
背景技術:
目前市面上有很多多媒體視音頻處理軟體開發包,這些開發包各有自己的優勢與劣勢,例如,ffmpeg軟體開發包,它能夠提供包括視音頻採集、視音頻格式轉換、視頻抓圖、視頻加水印等功能,具有功能強大、覆蓋面廣的優點。但ffmpeg在硬體編解碼加速方面卻較少涉及,尚很不完善,遠不及intel media sdk的性能優越。intelmedia sdk在硬體加速解碼、編碼方面提供了卓越的性能,其能充分利用圖形處理器(GPU)來進行硬體加速。經過測試,對於同一段素材,與ffmpeg sdk相比,利用intel media sdk來轉碼,速度能提高百分之三十左右而其CPU佔用效率卻大大降低。相同運行環境下,採用ffmpeg sdk與採用intel media sdk來對相同素材進行解碼的性能測試結果如下:
顯然intel media sdk在硬體加速方面具有明顯優勢。然而,intel media sdk卻不能基於多媒體文件流進行seek操作,只能提供基於ES流(Elementary Stream,基本碼流)的硬體加速的順序解碼操作。
在廣電領域,在對多媒體文件進行解碼播放過程或者非線性編輯系統中,人們經常將播放或預覽位置從文件的一個時間點拖動到另一個時間點。來查看自己關心的內容。這一過程就稱為seek。這種操作較為常見,若不能對文件流按需seek,則即使具有優越的硬體加速功能,在產品的應用中也會非常受限。
技術實現要素:
本發明提供一種對多媒體文件進行按需跳轉的方法,以解決現有技術中的一項或多項缺失。
本發明實施例提供一種對多媒體文件進行按需跳轉的方法,包括:接收用戶輸入的多媒體文件,通過ffmpeg對所述多媒體文件進行解復用,得到所述多媒體文件的ES流,並獲取所述多媒體文件的視音頻信息;利用所述視音頻信息對英特爾解碼器進行初始化;根據一跳轉精確性需求信息和一目標幀的信息,確定所述ES流中目標幀的時間戳;通過所述ffmpeg對所述ES流進行流操作,並從所述目標幀的一左側關鍵幀的位置開始讀取視音頻幀數據;利用初始化後的所述英特爾解碼器對讀取的所述視音頻幀數據進行解碼,得到所述視音頻幀的時間戳;判斷所述視音頻幀的時間戳大於或等於所述目標幀的時間戳時,將所述視音頻幀數據放入視音頻輸出隊列,以進行輸出。
一個實施例中,根據一跳轉精確性需求信息和一目標幀的信息,確定所述ES流中目標幀的時間戳,包括:根據所述跳轉精確性需求信息設定所述ES流中的幀發生跳轉的閾值;判斷所述目標幀與所述ES流中當前解碼輸出幀的幀號差值是否大於或等於所述閾值;如果是,根據所述當前解碼輸出幀的位置計算得到所述目標幀的時間戳。
一個實施例中,還包括:根據所述ES流中的第一幀視頻幀的時間戳對所述目標幀中的視頻幀的時間戳進行校正,根據所述ES流中的第一幀音頻幀的時間戳對所述目標幀中的音頻幀的時間戳進行校正。
一個實施例中,還包括:判斷所述視音頻幀的時間戳小於所述目標幀的時間戳時,丟棄時間戳小於所述目標幀的時間戳的視音頻幀數據,並繼續讀取下一幀的視音頻幀數據,直到讀取的視音頻幀的時間戳大於或等於所述目標幀的時間戳。
一個實施例中,當所述視音頻流數據為視頻數據時,所述英特爾解碼器為視頻解碼器;當所述視音頻流數據為音頻數據時,所述英特爾解碼器為音頻解碼器。
一個實施例中,當所述視音頻流數據為視頻數據時,所述目標幀的時間戳為:vt=((目標視頻幀幀號*(1.0/視頻幀率)*基準時間)*基準時間的倒數/視頻流的時間基)。
一個實施例中,當所述視音頻流數據為音頻數據時,所述目標幀的時間戳為:at=((目標音頻幀幀號*(1.0*一幀音頻的採樣數*基準時間/目標音頻採樣率)*基準時間的倒數/音頻流的時間基),其中,一幀音頻的採樣數=目標音頻採樣率/視頻幀率,目標音頻幀幀號=目標音頻採樣索引值/一幀音頻的採樣數,目標音頻採樣索引值可通過seek操作發生時接口調用者傳入的接口參數中得到。
一個實施例中,將讀取的所述視音頻幀數據放入視音頻輸出隊列,以進行輸出,包括:將時間戳大於或等於所述目標幀的讀取的所述視音頻幀數據中的視頻數據放入視頻輸出隊列,以進行視頻輸出;將時間戳大於或等於所述目標幀的讀取的所述視音頻幀數據中的音頻數據放入音頻輸出隊列,以進行音頻輸出;判斷所述視頻輸出隊列和所述音頻輸出隊列均含有進行輸出的視音頻幀數據時,所述ffmpeg停止讀取視音頻幀數據。
一個實施例中,所述多媒體文件的視音頻信息包括:多媒體文件總長度、多媒體文件封裝格式、視頻編碼方式、視頻幀率、視頻流長度、視頻顏色格式、視頻碼率、音頻編碼格式、音頻採樣率、音頻採樣格式及音頻流長度中的一個或多個。
一個實施例中,所述左側關鍵幀為位於所述目標幀左側且最接近所述目標幀的關鍵幀。
本發明實施例,能夠既可以充分利用英特爾解碼器(intel media sdk)進行硬體加速解碼,又能允許使用者對被解碼播放的多媒體文件進行按需跳轉(seek),可以很好地實現基於英特爾解碼器intel media sdk的多媒體文件的硬體加速解碼播放與按需跳轉seek。本發明能夠綜合利用intel media sdk與ffmpeg sdk來實現視音頻同步seek的方法。同時,由於對目標視頻幀、目標音頻幀的匹配採用最接近原則(最左側關鍵幀),因而對於有一些存在時間戳漂移現象的多媒體素材,同樣能進行較為準確的seek操作。
附圖說明
為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對於本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其它的附圖。在附圖中:
圖1是本發明實施例的對多媒體文件進行按需跳轉的方法的流程示意圖;
圖2是本發明一實施例中的目標幀時間戳的獲取方法的流程示意圖;
圖3是本發明另一實施例的目標幀時間戳的獲取方法的流程示意圖;
圖4是本發明一實施例中的將視音頻幀數據放入視音頻輸出隊列的方法的流程示意圖;
圖5是本發明一實施例對多媒體文件進行按需跳轉的方法的流程示意圖。
具體實施方式
為使本發明實施例的目的、技術方案和優點更加清楚明白,下面結合附圖對本發明實施例做進一步詳細說明。在此,本發明的示意性實施例及其說明用於解釋本發明,但並不作為對本發明的限定。
本發明實施例提供一種對多媒體文件進行按需跳轉的方法,該方法既可以利用英特爾解碼器(intel media sdk)進行硬體加速解碼,又能對被解碼播放的多媒體文件進行按需跳轉(seek)。
圖1是本發明實施例的對多媒體文件進行按需跳轉的方法的流程示意圖。如圖1所示,對多媒體文件進行按需跳轉的方法,可包括步驟:
S110:接收用戶輸入的多媒體文件,通過ffmpeg對所述多媒體文件進行解復用,得到所述多媒體文件的ES流,並獲取所述多媒體文件的視音頻信息;
S120:利用所述視音頻信息對英特爾解碼器進行初始化;
S130:根據一跳轉精確性需求信息和一目標幀的信息,確定所述ES流中目標幀的時間戳;
S140:通過所述ffmpeg對所述ES流進行流操作,並從所述目標幀的一左側關鍵幀的位置開始讀取視音頻幀數據;
S150:利用初始化後的所述英特爾解碼器對讀取的所述視音頻幀數據進行解碼,得到所述視音頻幀的時間戳;
S160:判斷所述視音頻幀的時間戳大於或等於所述目標幀的時間戳時,將所述視音頻幀數據放入視音頻輸出隊列,以進行輸出。
在上述步驟S120中,該多媒體文件的視音頻信息可包括多種信息。例如,上述多媒體文件的視音頻信息可包括多媒體文件總長度、多媒體文件封裝格式、視頻編碼 方式、視頻幀率、視頻流長度、視頻顏色格式、視頻碼率、音頻編碼格式、音頻採樣率、音頻採樣格式及音頻流長度的能夠信息中的一個或多個。
本發明實施例通過上述步驟S120,利用步驟S110得到的視音頻信息對英特爾解碼器進行初始化,可以準備好硬體加速解碼上下文。
本發明實施例中,例如上述S120和S150中,對於不同的多媒體數據,可使用不同的解碼器。例如,當讀取的視音頻流數據為視頻數據時,上述英特爾解碼器為視頻解碼器;當讀取的視音頻流數據為音頻數據時,上述英特爾解碼器為音頻解碼器。同樣地,利用視頻信息對視頻解碼器進行初始化,利用音頻信息對音頻解碼器進行初始化。
在上述步驟S140中,該目標幀的左側可包括許多由多個幀構成的成組的幀,每一組幀的最左側的第一幀可為關鍵幀,則可從目標幀左側的各個不同的關鍵幀開始讀取視音頻數據。較佳地,步驟S140中的左側關鍵幀為位於該目標幀左側且最接近所述目標幀的關鍵幀,以此,可減少ffmpeg的流操作任務量,從而提高seek效率。而且,對於有一些存在時間戳漂移現象的多媒體素材,同樣能進行較為準確的seek操作。
本發明實施例,針對現有技術中ffmpeg的硬體編碼加速缺陷和英特爾解碼器(intel media sdk)不能基於流進行跳轉(seek)的缺陷,通過有效地一併利用ffmpeg進行流操作和利用英特爾解碼器(intel media sdk)讀取視音頻幀數據,能夠既可以利用英特爾解碼器(intel media sdk)進行硬體加速解碼,又能對被解碼播放的多媒體文件進行按需跳轉(seek)。
圖2是本發明一實施例中的目標幀時間戳的獲取方法的流程示意圖。如圖2所示,在上述步驟S130中,根據一跳轉精確性需求信息和一目標幀的信息,確定所述ES流中目標幀的時間戳的方法,可包括步驟:
S131:根據所述跳轉精確性需求信息設定所述ES流中的幀發生跳轉的閾值;
S132:判斷所述目標幀與所述ES流中當前解碼輸出幀的幀號差值是否大於或等於所述閾值;
S133:如果是,根據所述當前解碼輸出幀的位置計算得到所述目標幀的時間戳。
在上述步驟S131中,幀發生跳轉的閾值,例如是最小時間間隔或最小幀號差值間隔。在上述步驟S132中,上述跳轉精確性需求信息可以是跳轉前(seek)視音頻 幀的幀號與所需跳轉(seek)的目標幀的幀號的差值Δt,例如可以用時間差或幀號差表示。若幀發生跳轉的閾值為Δm,可當Δt≥Δm時,才計算目標幀的時間戳,以進行seek操作。
本發明實施例中,通過根據跳轉精確性需求信息設定發生跳轉的閾值,並根據閾值判斷是否發生跳轉,可以滿足各種跳轉精確性要求。通過根據當前解碼輸出幀的位置可以有效計算出目標幀的時間戳。
圖3是本發明另一實施例的目標幀時間戳的獲取方法的流程示意圖。如圖3所示,由圖2所示的目標幀時間戳的獲取方法,還可包括步驟:
S134:根據所述ES流中的第一幀視頻幀的時間戳對所述目標幀中的視頻幀的時間戳進行校正,根據所述ES流中的第一幀音頻幀的時間戳對所述目標幀中的音頻幀的時間戳進行校正。
在該較佳實施例中,通過對目標幀的時間戳進行校正,可以得到更準確的目標幀的時間戳。在上述步驟S140~S160中,可以根據校正後的目標幀時間戳讀取視音頻幀數據。
再如圖1所示,本發明實施例的對多媒體文件進行按需跳轉的方法,還可包括步驟:
S170:判斷所述視音頻幀的時間戳小於所述目標幀的時間戳時,丟棄時間戳小於所述目標幀的時間戳的視音頻幀數據,並繼續讀取下一幀的視音頻幀數據,直到讀取的視音頻幀的時間戳大於或等於所述目標幀的時間戳。
本發明實施例中,根據視音頻幀的時間戳小於目標幀的時間戳,可以判斷所讀取的視音頻幀還在目標幀的左側,尚未達到跳轉播放位置。丟棄時間戳小於目標幀的時間戳的視音頻幀數據,有助於節省解碼器的緩存空間。
圖4是本發明一實施例中的將視音頻幀數據放入視音頻輸出隊列的方法的流程示意圖。如圖4所示,在上述步驟S160中,將讀取的所述視音頻幀數據放入視音頻輸出隊列,以進行輸出,可包括步驟:
S161:將時間戳大於或等於所述目標幀的讀取的所述視音頻幀數據中的視頻數據放入視頻輸出隊列,以進行視頻輸出;
S162:將時間戳大於或等於所述目標幀的讀取的所述視音頻幀數據中的音頻數據放入音頻輸出隊列,以進行音頻輸出;
S163:判斷所述視頻輸出隊列和所述音頻輸出隊列均含有進行輸出的視音頻幀數據時,所述ffmpeg停止讀取視音頻幀數據。
本發明實施例中,在上述步驟S161和S162中,放入隊列的視音頻數據用於等待輸出。在上述步驟S163中,根據視、音頻均有輸出時,停止讀取視音頻幀數據,即結束seek,不僅能夠跳轉到目標幀處,而且能夠同時可使用戶通過聲音或畫面任一個都可以確定已跳轉完成,進而能夠帶給用戶較好的聽覺和視覺體驗。
值得說明的是,本發明各實施例中關於「視音頻」的描述,例如視音頻幀、視音頻幀數據、視音頻信息,可以對於音頻和視頻中的至少一個而言。各步驟、操作或處理中,音頻數據可視需要與音頻操作相對應,視頻數據可視需要與視頻操作相對應,例如音頻數據通過音頻解碼器進行解碼,視頻數據通過視頻進行解碼,目標幀中音頻幀的時間戳可通過第一幀中的音頻幀的時間戳進行校正,目標幀中的視頻幀的時間戳可通過第一幀中的視頻幀的時間戳進行校正。
圖5是本發明一實施例對多媒體文件進行按需跳轉的方法的流程示意圖。如圖5所示,首先,利用ffmpeg對輸入的多媒體文件進行解復用操作,得到ES流,通過解復用操作可以獲取到文件總長度、文件封裝格式、視頻編碼方式、視頻幀率、視頻流長度、視頻顏色格式、視頻碼率,音頻編碼格式、音頻採樣率、音頻採樣格式、音頻流長度等編碼相關信息(步驟S201)。
然後,利用獲取到的這些編碼相關信息對intel解碼器進行初始化,準備好硬體加速解碼上下文相關信息(步驟S202)。接下來,根據對seek操作精確性的需求,設定判斷seek操作發生的閾值為Δm,例如,設定Δm=5幀(步驟S203)。計算當前目標幀與上一幀幀號的差值Δt,若Δt≥Δm則進入seek操作邏輯(步驟S204)。根據目標幀幀號計算出目標視音頻幀的時間戳,並利用首幀視音頻的時間戳對該值進行校正(步驟S205~S206)。
具體地,可根據目標幀幀號計算初始目標視頻幀的時間戳vt,再利用首幀視頻的時間戳vs對該初始目標視頻幀的時間戳vt進行校正,得到目標視頻幀的時間戳VT。例如,目標視頻幀的時間戳VT的計算公式可為:
VT=vt+vs, (1)
根據目標幀幀號計算初始目標視頻幀的時間戳vt的計算公式可為多種表達形式或計算方式,例如該計算公式可為:
vt=((目標視頻幀幀號*(1.0/視頻幀率)*基準時間)*基準時間的倒數/視頻流的時間基), (2)
其中,目標視頻幀幀號可根據一目標幀的信息中得到,視頻幀率、基準時間AV_TIME_BASE、及視頻流的時間基,可通過解復用得到的多媒體文件的視音頻信息得到。基準時間AV_TIME_BASE的具體值可視需要進行選擇,例如,AV_TIME_BASE=1000000。
類似地,可根據目標幀幀號計算初始目標音頻幀的時間戳at,再利用首幀音頻的時間戳as對該初始目標音頻幀的時間戳at進行校正,得到目標音頻幀的時間戳AT。例如,目標音頻幀的時間戳AT的計算公式可為:
AT=at+as。 (3)
根據目標幀幀號計算初始目標音頻幀的時間戳at的計算公式可為多種表達形式或計算方式,例如該計算公式可為:
at=((目標音頻幀幀號*(1.0*一幀音頻的採樣數*基準時間/目標音頻採樣率)*基準時間的倒數/音頻流的時間基) (4)
其中,公式(4)可滿足:一幀音頻的採樣數=目標音頻採樣率/視頻幀率,目標音頻幀幀號=目標音頻採樣索引值/一幀音頻的採樣數。目標音頻採樣索引值可通過seek操作發生時接口調用者傳入的接口參數中得到。目標音頻採樣率是指調用者所需要的音頻採樣率,目標音頻採樣率可根據接口調用者設置的目標解碼參數結構體中得到。基準時間AV_TIME_BASE的具體值可視需要進行選擇,例如,AV_TIME_BASE=1000000。
上述實施例中,通過步驟S205~S206,例如,通過公式(1)~(2),可得到準確的基於視頻流時間基的目標視頻時間戳VT;類似地,通過公式(3)~(4),可得到準確的目標音頻幀的時間戳AT。
在得到準確的目標視頻幀的時間戳VT與目標音頻幀的時間戳AT後,可利用ffmpeg進行流操作。較佳地,先跳轉到距離目標視音頻幀(可為目標視頻幀或目標音頻幀)最近的左側關鍵幀位置,並可通知intel解碼器清空其內部緩存,以便後續讀取數據(步驟S207)。
利用ffmpeg由該最近的左側關鍵幀位置開始,從文件流(ES流)中讀取音視頻幀數據(步驟S208)。若讀到的為視頻幀,則送入intel視頻解碼器解碼,判斷該視 頻幀的時間戳是否小於VT,若是,則直接丟棄,否則,放入視頻輸出隊列等待輸出(步驟S209~S211)。若讀到的為音頻幀,則送入intel音頻解碼器解碼,並判斷輸出的音頻幀是否小於AT,若是,則直接拋棄,否則,放入音頻輸出隊列,等待輸出(步驟S212~S214)。當視頻幀和音頻幀均有輸出時,seek結束。
本發明實施例,能夠既可以充分利用英特爾解碼器(intel media sdk)進行硬體加速解碼,又能允許使用者對被解碼播放的多媒體文件進行按需跳轉(seek),可以很好地實現基於英特爾解碼器intel media sdk的多媒體文件的硬體加速解碼播放與按需跳轉seek。本發明能夠綜合利用intel media sdk與ffmpeg sdk來實現視音頻同步seek的方法。同時,由於對目標視頻幀、目標音頻幀的匹配採用最接近原則(最左側關鍵幀),因而對於有一些存在時間戳漂移現象的多媒體素材,同樣能進行較為準確的seek操作。
本領域內的技術人員應明白,本發明的實施例可提供為方法、系統、或電腦程式產品。因此,本發明可採用完全硬體實施例、完全軟體實施例、或結合軟體和硬體方面的實施例的形式。而且,本發明可採用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限於磁碟存儲器、CD-ROM、光學存儲器等)上實施的電腦程式產品的形式。
本發明是參照根據本發明實施例的方法、設備(系統)、和電腦程式產品的流程圖和/或方框圖來描述的。應理解可由電腦程式指令實現流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結合。可提供這些電腦程式指令到通用計算機、專用計算機、嵌入式處理機或其它可編程數據處理設備的處理器以產生一個機器,使得通過計算機或其它可編程數據處理設備的處理器執行的指令產生用於實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些電腦程式指令也可存儲在能引導計算機或其它可編程數據處理設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產生包括指令裝置的製造品,該指令裝置實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些電腦程式指令也可裝載到計算機或其它可編程數據處理設備上,使得在計算機或其它可編程設備上執行一系列操作步驟以產生計算機實現的處理,從而在計算 機或其它可編程設備上執行的指令提供用於實現在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
以上所述的具體實施例,對本發明的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上所述僅為本發明的具體實施例而已,並不用於限定本發明的保護範圍,凡在本發明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發明的保護範圍之內。