視頻倒放方法、裝置、電子設備及存儲介質與流程
2024-04-15 04:43:05 1
1.本技術實施例涉及視頻處理技術領域,具體而言,涉及一種視頻倒放方法、裝置、電子設備及存儲介質。
背景技術:
2.在安防領域,錄像回放功能是不可或缺的功能之一,在回溯某一時間點的錄像時,通常會跳轉到期望時間點附近正向播放,當到達事件發生點時,需要來回正向、逆向進行反覆播放。因此視頻倒放功能是錄像回放功能中的一個重要功能點。
3.目前,安防主流視頻編碼協議為h264、h265編碼,其主要有i幀、p幀幾種幀類型。i幀為幀內編碼,可以獨立進行解碼,p幀為幀間編碼,需要參考前面最近一個i幀進行解碼,兩個i幀之間通常包含多個p幀,通常稱之為gop(group of pictures,畫面組)。例如,存在圖像序列i0-p1-p2-p3-p4-p5-i6-p7-p8-p9-p10-p11,其中i0-p1-p2-p3-p4-p5為一個gop,在視頻正放時,是按照i0-p1-p2-p3-p4-p5的順序進行解碼,顯示也按照i0-p1-p2-p3-p4-p5的順序進行顯示,但是,在視頻倒放時,是按照i0-p1-p2-p3-p4-p5的順序進行解碼,顯示卻是按照p5-p4-p3-p2-p1-i0的順序進行顯示,由於在解碼完i0、p1、p2、p3、p4時p5還未解碼,因此必須將i0、p1、p2、p3、p4解碼後的數據緩存起來,待p5解碼完畢後,再按照p5-p4-p3-p2-p1-i0的順序進行渲染,通常最少需要緩存一個gop的解碼後的數據。
4.同時,由於解碼後的數據一般為yuv420格式,4k解析度下一幀所消耗的內存為3840*2160*3/2=12m,按照安防主流50幀的gop大小計算,需要至少消耗12*50=600m的內存,而為了播放的流暢性,一般要緩存一個gop以上的數據幀,導致一些內存不足的設備,基本無法滿足視頻倒放需求。
技術實現要素:
5.本技術實施例的目的在於提供一種視頻倒放方法、裝置、電子設備及存儲介質,用以解決現有的視頻倒放無法兼顧播放性能和內存使用的問題。
6.為了實現上述目的,本技術實施例採用的技術方案如下:
7.第一方面,本技術實施例提供了一種視頻倒放方法,應用於電子設備,所述方法包括:
8.響應視頻倒放指令,獲取目標視頻碼流中的首個畫面組gop;
9.基於首個gop的碼流參數和所述電子設備的當前可用內存值,判斷所述電子設備的當前內存餘量是否充足;
10.若所述電子設備的當前內存餘量不足,則採用實時視頻低內存倒放模式對所述首個gop進行視頻倒放;其中,所述實時視頻低內存倒放模式用於對所述首個gop解碼後的視頻幀並行的進行縮放及重編碼處理;
11.若所述電子設備的當前內存餘量充足,則採用實時視頻高內存倒放模式對所述首個gop進行視頻倒放;其中,所述實時視頻高內存倒放模式用於對所述首個gop解碼後的視
頻幀並行的進行縮放處理。
12.可選地,所述採用實時視頻低內存倒放模式對所述首個gop進行視頻倒放的步驟,包括:
13.對所述首個gop中的每一視頻幀逐幀進行解碼,得到每一解碼視頻幀;其中,每一所述解碼視頻幀均具有幀序號,所述幀序號表徵所述解碼視頻幀對應的所述視頻幀在所述首個gop中的順序;
14.針對任一所述解碼視頻幀,從預先建立的多線程縮放重編碼線程池中確定第一可用線程;
15.基於所述解碼視頻幀的類型,利用所述第一可用線程對所述解碼視頻幀進行縮放及重編碼處理得到重編碼視頻幀,並按照所述解碼視頻幀的幀序號對所述重編碼視頻幀進行倒序存儲;
16.在完成所有所述解碼視頻幀的處理後,對每一所述重編碼視頻幀逐幀進行重解碼及渲染,以完成所述首個gop的視頻倒放。
17.可選地,所述基於所述解碼視頻幀的類型,利用所述第一可用線程對所述解碼視頻幀進行縮放及重編碼處理得到重編碼視頻幀,並按照所述解碼視頻幀的幀序號對所述重編碼視頻幀進行倒序存儲的步驟,包括:
18.當所述解碼視頻幀的類型為硬體解碼數據時,所述第一可用線程通過圖形處理器gpu對所述解碼視頻幀進行縮放處理得到縮放視頻幀,並將所述縮放視頻幀存儲至預先申請的離屏表面,再按照設定圖片格式對所述離屏表面的所述縮放視頻幀進行重編碼得到所述重編碼視頻幀;
19.當所述解碼視頻幀的類型為軟體解碼數據時,所述第一可用線程通過中央處理器cpu對所述解碼視頻幀進行縮放處理得到縮放視頻幀,並按照設定圖片格式對所述縮放視頻幀進行重編碼得到所述重編碼視頻幀;
20.所述第一可用線程按照所述幀序號,對所述重編碼視頻幀進行倒序存儲。
21.可選地,所述採用實時視頻高內存倒放模式對所述首個gop進行視頻倒放的步驟,包括:
22.對所述首個gop中的每一視頻幀逐幀進行解碼,得到每一解碼視頻幀;其中,每一所述解碼視頻幀均具有幀序號,所述幀序號表徵所述解碼視頻幀對應的所述視頻幀在所述首個gop中的順序;
23.針對任一所述解碼視頻幀,從預先建立的多線程縮放線程池中確定第二可用線程;
24.基於所述解碼視頻幀的類型,利用所述第二可用線程對所述解碼視頻幀進行縮放處理得到縮放視頻幀,並按照所述解碼視頻幀的幀序號對所述縮放視頻幀進行倒序存儲;
25.在完成所有所述解碼視頻幀的處理後,對每一所述縮放視頻幀逐幀進行渲染,以完成所述首個gop的視頻倒放。
26.可選地,所述基於所述解碼視頻幀的類型,利用所述第二可用線程對所述解碼視頻幀進行縮放處理得到縮放視頻幀,並按照所述解碼視頻幀的幀序號對所述縮放視頻幀進行倒序存儲的步驟,包括:
27.從預先建立的緩存池中申請所述解碼視頻幀對應的緩存塊,所述緩存塊的類型與
所述解碼視頻幀的類型一致;
28.當所述解碼視頻幀的類型為硬體解碼數據時,所述第二可用線程通過gpu對所述解碼視頻幀進行縮放處理得到所述縮放視頻幀,並將所述縮放視頻幀存儲至對應的所述緩存塊;
29.當所述解碼視頻幀的類型為軟體解碼數據時,所述第二可用線程通過cpu對所述解碼視頻幀進行縮放處理得到所述縮放視頻幀,並將所述縮放視頻幀存儲至對應的所述緩存塊;
30.所述第二可用線程按照所述幀序號,對存儲有所述縮放視頻幀的所述緩存塊進行倒序排列。
31.可選地,所述碼流參數包括視頻幀數、解析度和數據格式;
32.所述基於所述首個gop的碼流參數和所述電子設備的當前可用內存值,判斷所述電子設備的當前內存餘量是否充足的步驟,包括:
33.根據所述解析度和所述數據格式,計算單個視頻幀需消耗的緩存值;
34.按照預設公式memuse=framesize*(framenum+deltaframenum)計算所述首個gop的內存預計使用值;
35.其中,memuse表示所述首個gop的內存預計使用值,framenum表示所述首個gop的視頻幀數,framesize表示單個視頻幀需消耗的緩存值,deltaframenum表示預先設定的緩存餘量值;
36.判斷所述電子設備的當前可用內存值與所述首個gop的內存預計使用值的差值是否小於所述電子設備的內存安全值;
37.若是,則確定所述電子設備的當前內存餘量不足;
38.若否,則確定所述電子設備的當前內存餘量充足。
39.可選地,所述方法還包括:
40.若當前處於所述實時視頻高內存倒放模式,則針對所述目標視頻碼流中除所述首個gop之外的每個其它gop,基於所述其它gop的碼流參數、所述其它gop的前一個gop的內存預計使用值和所述電子設備的當前可用內存值,判斷所述電子設備的當前內存餘量是否充足;
41.若所述電子設備的當前內存餘量充足,則繼續採用實時視頻高內存倒放模式對所述其它gop進行視頻倒放;
42.若所述電子設備的當前內存餘量不足,則將所述實時視頻高內存倒放模式切換為所述實時視頻低內存倒放模式,並採用所述實時視頻低內存倒放模式對所述其它gop進行視頻倒放。
43.可選地,所述碼流參數包括視頻幀數、解析度和數據格式;
44.所述基於所述其它gop的碼流參數、所述其它gop的前一個gop的內存預計使用值和所述電子設備的當前可用內存值,判斷所述電子設備的當前內存餘量是否充足的步驟,包括:
45.根據所述解析度和所述數據格式,計算單個視頻幀需消耗的緩存值;
46.按照預設公式memusenew=framesize*(framenumnew+deltaframenum)計算所述其它gop的內存預計使用值;
47.其中,memusenew表示所述其它gop的內存預計使用值,framenumnew表示所述其它gop的視頻幀數,framesize表示單個視頻幀需消耗的緩存值,deltaframenum表示預先設定的緩存餘量值;
48.計算所述電子設備的當前可用內存值與所述其它gop的內存預計使用值之間的差值;
49.判斷所述差值與所述其它gop的前一個gop的內存預計使用值的和是否小於所述電子設備的內存安全值;
50.若是,則確定所述電子設備的當前內存餘量不足;
51.若否,則確定所述電子設備的當前內存餘量充足。
52.第二方面,本技術實施例還提供了一種視頻倒放裝置,應用於電子設備,所述裝置包括:
53.響應模塊,用於響應視頻倒放指令,獲取目標視頻碼流中的首個畫面組gop;
54.判斷模塊,用於基於首個gop的碼流參數和所述電子設備的當前可用內存值,判斷所述電子設備的當前內存餘量是否充足;
55.第一執行模塊,用於若所述電子設備的當前內存餘量不足,則採用實時視頻低內存倒放模式對所述首個gop進行視頻倒放;其中,所述實時視頻低內存倒放模式用於對所述首個gop解碼後的視頻幀並行的進行縮放及重編碼處理;
56.第二執行模塊,用於若所述電子設備的當前內存餘量充足,則採用實時視頻高內存倒放模式對所述首個gop進行視頻倒放;其中,所述實時視頻高內存倒放模式用於對所述首個gop解碼後的視頻幀並行的進行縮放處理。
57.第三方面,本技術實施例還提供了一種電子設備,包括處理器和存儲器,所述存儲器用於存儲程序,所述處理器用於在執行所述程序時,實現上述第一方面中的視頻倒放方法。
58.第四方面,本技術實施例還提供了一種計算機可讀存儲介質,其上存儲有電腦程式,該電腦程式被處理器執行時實現上述第一方面中的視頻倒放方法。
59.相對現有技術,本技術實施例提供的一種視頻倒放方法、裝置、電子設備及存儲介質,在進行視頻倒放時,基於碼流參數和電子設備的當前可用內存值判斷電子設備的當前內存餘量是否充足,如果電子設備的當前內存餘量不足,則採用實時視頻低內存倒放模式對解碼後的視頻幀並行的進行縮放及重編碼處理;如果電子設備的當前內存餘量充足,則採用實時視頻高內存倒放模式對解碼後的視頻幀並行的進行縮放處理。也就是,根據碼流參數和電子設備的當前可用內存值動態的選擇倒放模式,使得視頻倒放在播放性能和內存使用上達到動態平衡,從而可以實現兼顧播放性能和內存使用的效果。
附圖說明
60.圖1示出了現有技術提供的視頻重編碼倒放策略的示例圖。
61.圖2示出了本技術實施例提供的一種視頻倒放方法的流程示意圖一。
62.圖3為圖2所述的步驟s104的一種流程示意圖。
63.圖4示出了本技術實施例提供的實時視頻低內存倒放模式的示例圖。
64.圖5為圖2所述的步驟s105的一種流程示意圖。
65.圖6示出了本技術實施例提供的實時視頻高內存倒放模式的示例圖一。
66.圖7示出了本技術實施例提供的申請緩存塊的流程示意圖。
67.圖8示出了本技術實施例提供的實時視頻高內存倒放模式的示例圖二。
68.圖9示出了本技術實施例提供的一種視頻倒放方法的流程示意圖二。
69.圖10示出了本技術實施例提供的一種視頻倒放裝置的方框示意圖。
70.圖11示出了本技術實施例提供的一種電子設備的方框示意圖。
71.圖標:100-視頻倒放裝置;101-響應模塊;102-判斷模塊;103-第一執行模塊;104-第二執行模塊;105-處理模塊;10-電子設備;11-處理器;12-存儲器;13-總線。
具體實施方式
72.下面將結合本技術實施例中附圖,對本技術實施例中的技術方案進行清楚、完整地描述。
73.在視頻倒放過程中,需要以gop為基本單位,將視頻碼流幀序列按照正序進行解碼,然後對解碼後的幀序列進行倒序顯示,以實現視頻倒放。通常,視頻倒放時為了播放的流暢性,一般要緩存一個gop以上的數據幀,導致內存消耗大,一些內存不足的設備,基本無法滿足視頻倒放需求。
74.針對這一問題,現有技術中存在以下幾種解決方式:
75.1、對解碼後的數據進行抽幀,緩存gop中的部分幀,但是這種方式會降低視頻的播放幀率,影響播放體驗。
76.2、對解碼後的數據全部進行i幀重編碼,即,對解碼後的數據全部重新進行一次幀內編碼,相當於重新做一次數據壓縮,這樣可以減少內存消耗。
77.例如,如圖1所示,對於i0-p1-p2-p3-p4-p5的一個h264/h265編碼的gop,在視頻倒放時,解碼線程按照i0-p1-p2-p3-p4-p5的順序逐幀解碼後,將解碼後的數據發送給重編碼線程進行處理。重編碼線程逐幀對解碼後的數據進行i幀重編碼,重編碼完一幀後壓棧,待整個gop重編碼完成後,再將整個重編碼的gop發送給重解碼線程。重解碼線程對重編碼後的gop逐幀出棧重解碼,重解碼完成後再送給渲染器渲染,從而實現按照p5-p4-p3-p2-p1-i0的順序進行顯示。
78.但是,h264、h265的i幀編碼複雜度較高,尤其是4k等高解析度碼流,編碼耗時會比較長,例如,假設視頻倒放幀率為25幀,如果要保證實時性,則必須要在40ms內重編碼完一幀,這對於4k等高解析度碼流來說是很難實現的,導致實時性難以保證,並且安防領域還存在視頻錄像倍速回放的功能,對實時性的要求將會更高。
79.因此,這種方式在cpu(central processing unit,中央處理器)性能較弱、或者視頻倒放幀率較高時,將無法滿足實時性要求,會導致播放卡頓。
80.綜上所述,現有的視頻倒放技術在播放體驗及性能上存在一定的局限性,無法兼顧播放性能和內存使用。
81.為了解決這一技術問題,本技術實施例在進行視頻倒放時,基於碼流參數和電子設備的當前可用內存值判斷電子設備的當前內存餘量是否充足,如果電子設備的當前內存餘量不足,則採用實時視頻低內存倒放模式對解碼後的視頻幀並行的進行縮放及重編碼處理;如果電子設備的當前內存餘量充足,則採用實時視頻高內存倒放模式對解碼後的視頻
幀並行的進行縮放處理。即,根據碼流參數和電子設備的當前可用內存值動態的選擇倒放模式,使得視頻倒放在播放性能和內存使用上達到動態平衡,從而可以實現兼顧播放性能和內存使用的效果。
82.下面結合附圖對本技術實施例進行詳細介紹。
83.請參照圖2,圖2示出了本技術實施例提供的視頻倒放方法的一種流程示意圖。該視頻倒放方法應用於電子設備,可以包括以下步驟:
84.s101,響應視頻倒放指令,獲取目標視頻碼流中的首個畫面組gop。
85.在本實施例中,視頻倒放指令可以是用戶通過操作電子設備上的客戶端觸發的。電子設備可以是伺服器、個人計算機、智慧型手機、平板電腦等,客戶端可以是瀏覽器客戶端、app(application,應用程式)等。
86.可選地,視頻倒放指令可以包括需要倒放的視頻的標識,還可以包括需要倒放的視頻的開始時刻和結束時刻。基於視頻倒放指令,就可以找到需要倒放的目標視頻碼流,目標視頻碼流是指與視頻倒放指令對應的需要進行倒放的視頻碼流。
87.s102,基於首個gop的碼流參數和電子設備的當前可用內存值,判斷電子設備的當前內存餘量是否充足。
88.實際應用中,不同設備的內存餘量、同一設備在不同狀態下的內存餘量都可能會不一致,並且視頻碼流的gop大小也是不斷變化的,因此,需要根據實際系統運行情況,適當的選擇不同的倒放模式,使視頻倒放在播放性能和內存使用上達到動態平衡。
89.在本實施例中,碼流參數包括視頻幀數、解析度和數據格式。對於一個gop而言,其視頻幀數是固定的,例如,50幀。
90.這裡的解析度和數據格式,指的是視頻倒放過程中需要緩存的單個視頻幀的解析度和數據格式。例如,如果按照先正序解碼再倒序播放的方式進行視頻倒放,則需要緩存的視頻幀是每個解碼後的視頻幀。又如,如果按照圖1所示的視頻重編碼倒放策略進行視頻倒放,則需要緩存的視頻幀是每個重編碼後的視頻幀,即,i-p5、i-p4等。
91.本領域技術人員應當了解,視頻倒放過程中需要緩存的單個視頻幀的解析度是固定的,同時,就單個視頻幀而言,其數據格式不同,所需消耗的緩存值也會不同。因此,就能根據單個視頻幀的解析度和數據格式,計算出單個視頻幀需消耗的緩存值。
92.可選地,在獲取到目標視頻碼流中的首個gop之後,就能基於首個gop的碼流參數和電子設備的當前可用內存值,判斷電子設備的當前內存餘量是否充足,該過程可以包括s1021~s1025。
93.s1021,根據解析度和數據格式,計算單個視頻幀需消耗的緩存值。
94.例如,假設單個視頻幀的大小為1920
×
1080,如果是yuv格式,則單個視頻幀需消耗的緩存值為:3/2*1920*1080;如果是argb格式,則單個視頻幀需消耗的緩存值為:4*1920*1080。
95.s1022,按照預設公式memuse=framesize*(framenum+deltaframenum)計算首個gop的內存預計使用值;
96.其中,memuse表示首個gop的內存預計使用值,framenum表示首個gop的視頻幀數,framesize表示單個視頻幀需消耗的緩存值,deltaframenum表示預先設定的緩存餘量值。
97.在本實施例中,緩存餘量值deltaframenum是為了抵抗播放卡頓,增加播放流暢性
設定的,用戶可以根據實際需要靈活設置,例如,10幀。
98.假設單個視頻幀的大小為1920
×
1080,視頻幀數為50,緩存餘量值為10,如果視頻幀為yuv格式,則memuse=3/2*1920*1080*(50+10)=180m,如果視頻幀為argb格式,則memuse=4*1920*1080*(50+10)=480m。
99.s1023,判斷電子設備的當前可用內存值與首個gop的內存預計使用值的差值是否小於電子設備的內存安全值。
100.在本實施例中,為保證系統運行穩定,可以給定一個內存安全值,其可以由用戶根據實際情況靈活設置,例如,200m。也就是,判斷memtotal
–
memuse《memsafe是否成立,memtotal表示電子設備的當前可用內存值,memsafe表示內存安全值。
101.s1024,若差值小於電子設備的內存安全值,即,memtotal
–
memuse《memsafe成立,則確定電子設備的當前內存餘量不足;
102.s1025,若差值不小於電子設備的內存安全值,即,memtotal
–
memuse《memsafe不成立,則確定電子設備的當前內存餘量充足。
103.在本實施例中,如果電子設備的當前內存餘量不足,即,memtotal
–
memuse《memsafe,則選擇實時視頻低內存倒放模式;如果電子設備的當前內存餘量充足,即,memtotal
–
memuse≥memsafe,則選擇實時視頻高內存倒放模式。
104.s103,若電子設備的當前內存餘量不足,則採用實時視頻低內存倒放模式對首個gop進行視頻倒放;其中,實時視頻低內存倒放模式用於對首個gop解碼後的視頻幀並行的進行縮放及重編碼處理。
105.從前文介紹的內容可知,現有的視頻重編碼倒放策略(如圖1所示)是先對解碼後的數據全部進行i幀重編碼,來減少內存消耗。但是,h264、h265的i幀編碼複雜度較高,編碼耗時會比較長。
106.針對這一問題,本技術實施例可以採用複雜度較低的編碼器進行重編碼,例如,jpeg、bmp、pcx編碼器作為重編碼格式,jpeg、bmp、pcx編碼的編碼複雜度比i幀編碼低,可以一定程度上縮短重編碼耗時。下述實施例以jpeg編碼器為例進行說明。
107.對解碼後的數據全部進行jpeg重編碼可以一定程度上縮短重編碼耗時,但是,發明人經過研究發現,在對4k等高解析度碼流進行jpeg重編碼時,耗時依然會比較大,會超過幀間隔時間。基於此,本技術實施例可以先對解碼後的數據進行縮放,再對縮放後的數據進行jpeg重編碼。
108.例如,以1920像素的視頻寬度為界限,如果h264/h265解碼後的數據的寬度大於1920,則按照1920寬度對解碼後的數據進行縮放處理;如果寬度小於1920,則不進行縮放處理。如此,縮放處理後的數據,再進行jpeg重編碼操作,這樣能夠有效提高重編碼效率,並且後續的解碼速度也會有一定提升。同時,由於縮放的寬度為1920像素,所以縮放後的畫面質量也能得到保證,不會存在太大的圖像損失。
109.但是,發明人經過進一步研究發現,如果採用單線程進行縮放處理及jpeg重編碼,在i7-7700 8核cpu的pc條件下,400w解析度只有50幀/s的處理效率,針對幀率偏低的問題,由於視頻倒放每次需要重編碼完一個gop才可以進行播放,並且解碼後數據的前後幀無參考關係,因此,本技術實施例可以利用cpu多核性能,並行的對gop解碼後的數據進行縮放及重編碼處理。
110.例如,使用最大4線程並行處理的方式,將h264/h265解碼後的數據當作異步任務,送入縮放及jpeg重編碼處理線程池中進行處理,利用多線程性能加快gop整體的處理速度,經過測試可以將gop重編碼速度提升4倍,解決了由於縮放重編碼速度低導致的倒放幀率不足的問題。
111.下面對步驟s103進行詳細介紹。
112.在圖2的基礎上,請參照圖3,步驟s103中採用實時視頻低內存倒放模式對首個gop進行視頻倒放的過程,可以包括s1031~s1034。
113.s1031,對首個gop中的每一視頻幀逐幀進行解碼,得到每一解碼視頻幀;其中,每一解碼視頻幀均具有幀序號,幀序號表徵解碼視頻幀對應的視頻幀在首個gop中的順序。
114.s1032,針對任一解碼視頻幀,從預先建立的多線程縮放重編碼線程池中確定第一可用線程。
115.s1033,基於解碼視頻幀的類型,利用第一可用線程對解碼視頻幀進行縮放及重編碼處理得到重編碼視頻幀,並按照解碼視頻幀的幀序號對重編碼視頻幀進行倒序存儲。
116.s1034,在完成所有解碼視頻幀的處理後,對每一重編碼視頻幀逐幀進行重解碼及渲染,以完成首個gop的視頻倒放。
117.在本實施例中,在開啟實時視頻低內存倒放模式之前,可以先根據cpu核數創建多線程縮放重編碼線程池。可選地,如果cpu核數≥4,則設定多線程縮放重編碼線程池的最大線程數為4;如果cpu核數<4,則設定多線程縮放重編碼線程池的最大線程數等於cpu核數。例如,假設cpu核數為8,則設定多線程縮放重編碼線程池的最大線程數為4。
118.下面結合圖4,對實時視頻低內存倒放模式進行詳細介紹。如圖4所示,假設首個gop是一個h264/h265編碼的gop,且包括i0-p1-p2-p3-p4-p5這6個視頻幀,在開啟實時視頻低內存倒放模式後,視頻倒放流程包括:
119.首先,解碼線程按照i0-p1-p2-p4-p4-p5的順序逐幀對首個gop進行解碼,得到解碼視頻幀。
120.然後,將解碼視頻幀送入重編碼線程,重編碼線程根據首個gop解碼後的視頻幀信息(例如,視頻的寬高、類型、幀率等)封裝一個異步任務,每個異步任務均具備一個幀序號,幀序號用於表徵解碼視頻幀對應的視頻幀在首個gop中的順序,幀序號遇到i幀時清零,後續幀累計加一。例如,對i0-p1-p2-p4-p4-p5進行解碼,得到的解碼視頻幀,其對應的幀序號依次為0、1、2、3、4、5。
121.接下來,將異步任務送入多線程縮放重編碼線程池,如果多線程縮放重編碼線程池中存在可用線程,則利用該可用線程對異步任務進行縮放及重編碼得到重編碼視頻幀(例如,jpeg圖片),並按照幀序號倒序的將jpeg圖片存入輸出隊列;如果多線程縮放重編碼線程池中不存在可用線程,則等待並不斷重試。
122.如此,重編碼線程不斷將異步任務送入多線程縮放重編碼線程池進行縮放及重編碼處理,直到重編碼線程收到下一個為i幀的解碼視頻幀,則說明此時已將首個gop的解碼視頻幀全部送入多線程縮放重編碼線程池。因此,重編碼線程先等待多線程縮放重編碼線程池處理完所有未完成的異步任務,待完成所有異步任務後,將輸出隊列中的所有jpeg圖片,壓入一個新的重編碼gop棧中。
123.之後,重解碼線程在檢測到有新的重編碼gop棧產生時,則對jpeg圖片逐幀出棧並
進行解碼操作,再將解碼後的數據送至渲染器進行渲染,最終的渲染順序為p5-p4-p3-p2-p1-i0,如此,則完成了對首個gop的視頻倒放。
124.可選地,步驟s1033中基於解碼視頻幀的類型,利用第一可用線程對解碼視頻幀進行縮放及重編碼處理得到重編碼視頻幀,並按照解碼視頻幀的幀序號對重編碼視頻幀進行倒序存儲的過程,可以包括s10331~s10333。
125.s10331,當解碼視頻幀的類型為硬體解碼數據時,第一可用線程通過gpu對解碼視頻幀進行縮放處理得到縮放視頻幀,並將縮放視頻幀存儲至預先申請的離屏表面,再按照設定圖片格式對離屏表面的縮放視頻幀進行重編碼得到重編碼視頻幀。
126.s10332,當解碼視頻幀的類型為軟體解碼數據時,第一可用線程通過cpu對解碼視頻幀進行縮放處理得到縮放視頻幀,並按照設定圖片格式對縮放視頻幀進行重編碼得到重編碼視頻幀。
127.s10333,第一可用線程按照幀序號,對重編碼視頻幀進行倒序存儲。
128.也就是,結合到圖4,如果多線程縮放重編碼線程池中存在可用線程,則利用該可用線程處理異步任務。具體來說,如果該異步任務是硬體解碼數據,即,為argb格式,則先使用gpu將argb數據縮放操作縮放至預先申請的離屏表面(surface),然後再對離屏表面的argb數據進行jpeg編碼操作,最後再根據幀序號倒序的將編碼完的jpeg圖片存入輸出隊列。如果該異步任務是軟體解碼數據,即,為yuv格式,則先使用軟體對yuv數據進行縮放,然後再進行jpeg編碼操作,最後再根據幀序號倒序的將編碼完的jpeg圖片存入輸出隊列。
129.根據前述內容可知,實時視頻低內存倒放模式採用了多線程縮放及jpeg重編碼方法,通常,jpeg重編碼後的一幀大小基本在150k左右,那麼,一個50幀大小的gop,起內存使用量為150k*50=7500k,對於pc設備,其內存消耗較小。同時,由於首先對h264/h265解碼後的數據進行了縮放,所以後續jpeg重編碼和重解碼的速度也得到了一定的提升。並且採用了多線程處理方式,整個gop的整體速度又得到了進一步的提升,經過測試,在i7-7700 8核cpu的pc條件下,400w解析度達到了300幀/s左右的重編碼效率。
130.但是,實時視頻低內存倒放模式下,為了保證內存使用量,重解碼完一幀jpeg圖片後,會立即送入渲染器進行渲染,沒有做額外的緩存,所以無法進行多線程重解碼處理。經測試,重解碼線程在i7-7700 8核cpu的pc條件下,400w解析度的h265碼流只有72幀/s左右的處理效率。
131.綜上所述,實時視頻低內存倒放模式,能夠較大的提升整體視頻實時倒放性能,尤其能夠極大的提升重編碼流程性能,但是,由於重解碼線程的性能限制,該模式仍然無法達到4倍速情況下100幀/s的倒放性能需求,存在一定的性能瓶頸。
132.基於此,在電子設備的當前內存餘量充足時,本技術實施例採用實時視頻高內存倒放模式進行視頻倒放,實時視頻高內存倒放模式不進行重編碼和重解碼操作,但是保留縮放操作,能夠減小在高解析度情況下內存的消耗,同時,由於不進行重編碼和重解碼操作,gop的處理速度會得到較大的提升。
133.s104,若電子設備的當前內存餘量充足,則採用實時視頻高內存倒放模式對首個gop進行視頻倒放;其中,實時視頻高內存倒放模式用於對首個gop解碼後的視頻幀並行的進行縮放處理。
134.在本實施例中,實時視頻高內存倒放模式不進行重編碼和重解碼操作,gop的處理
速度會得到較大的提升。同時,為了減小4k等高解析度情況下內存的消耗,可以保留對解碼後的數據進行縮放處理的過程。並且,由於視頻倒放時,會先對gop進行解碼,並且解碼後數據的前後幀無參考關係,所以,仍然可以利用cpu多核性能,並行的對gop解碼後的數據進行縮放處理。
135.例如,以1920像素的視頻寬度為界限,如果h264/h265解碼後的數據的寬度大於1920,則按照1920寬度對解碼後的數據進行縮放處理;如果寬度小於1920,則不進行縮放處理。
136.下面對步驟s104進行詳細介紹。
137.在圖2的基礎上,請參照圖5,步驟s104中採用實時視頻高內存倒放模式對首個gop進行視頻倒放的過程,可以包括s1041~s1044。
138.s1041,對首個gop中的每一視頻幀逐幀進行解碼,得到每一解碼視頻幀;其中,每一解碼視頻幀均具有幀序號,幀序號表徵解碼視頻幀對應的視頻幀在首個gop中的順序。
139.s1042,針對任一解碼視頻幀,從預先建立的多線程縮放線程池中確定第二可用線程。
140.s1043,基於解碼視頻幀的類型,利用第二可用線程對解碼視頻幀進行縮放處理得到縮放視頻幀,並按照解碼視頻幀的幀序號對縮放視頻幀進行倒序存儲。
141.可選地,步驟s1043中基於解碼視頻幀的類型,利用第二可用線程對解碼視頻幀進行縮放處理得到縮放視頻幀,並按照解碼視頻幀的幀序號對縮放視頻幀進行倒序存儲的過程,可以包括s10431~s10434。
142.s10431,從預先建立的緩存池中申請解碼視頻幀對應的緩存塊,緩存塊的類型與解碼視頻幀的類型一致。
143.s10432,當解碼視頻幀的類型為硬體解碼數據時,第二可用線程通過gpu對解碼視頻幀進行縮放處理得到縮放視頻幀,並將縮放視頻幀存儲至對應的緩存塊。
144.s10433,當解碼視頻幀的類型為軟體解碼數據時,第二可用線程通過cpu對解碼視頻幀進行縮放處理得到縮放視頻幀,並將縮放視頻幀存儲至對應的緩存塊。
145.s10434,第二可用線程按照幀序號,對存儲有縮放視頻幀的緩存塊進行倒序排列。
146.s1044,在完成所有解碼視頻幀的處理後,對每一縮放視頻幀逐幀進行渲染,以完成首個gop的視頻倒放。
147.在本實施例中,在開啟實時視頻高內存倒放模式之前,可以先根據cpu核數創建多線程縮放線程池。可選地,如果cpu核數≥4,則設定多線程縮放線程池的最大線程數為4;如果cpu核數<4,則設定多線程縮放線程池的最大線程數等於cpu核數。例如,假設cpu核數為8,則設定多線程縮放線程池的最大線程數為4。
148.下面結合圖6,對實時視頻高內存倒放模式進行詳細介紹。如圖6所示,假設首個gop是一個h264/h265編碼的gop,且包括i0-p1-p2-p3-p4-p5這6個視頻幀,在開啟實時視頻高內存倒放模式後,視頻倒放流程包括:
149.第一步,解碼線程按照i0-p1-p2-p4-p4-p5的順序逐幀對首個gop進行解碼,得到解碼視頻幀。
150.第二步,將解碼視頻幀送入縮放線程,由於h264/h265解碼後的數據為yuv或argb,那麼縮放後的數據也是yuv或argb,其消耗的內存比較大,因此,為減小大塊內存分配消耗
的時間以及減少內存碎片的產生,實時視頻高內存倒放模式可以採用緩存池的方式,縮放線程在接收到解碼視頻幀時,從緩存池中申請一個緩存塊用於存儲對解碼視頻幀進行縮放處理後的視頻幀。
151.可選地,可以預先建立緩存池,緩存池中設置多個緩存塊,每個緩存塊均設置有引用計數,所有緩存塊均默認引用計數為1,引用計數為1表示此緩存塊可使用,引用計數為2表示此緩存塊使用中,引用計數個數為0表示此緩存塊需要進行銷毀。
152.如圖7所示,縮放線程在接收到解碼視頻幀時,從緩存池中申請緩存塊的過程,可以包括:
153.s1,根據引用計數查詢當前緩存池是否存在可用緩存塊。
154.在本實施例中,如果存在可用緩存塊,則執行s21;如果不存在可用緩存塊,則執行s22。
155.s21,可用緩存塊與解碼視頻幀的數據參數是否匹配。
156.在本實施例中,可用緩存塊與解碼視頻幀的數據參數是否匹配,是指可用緩存塊與解碼視頻幀是否為同一格式,也就是,如果解碼視頻幀為argb,則所申請的緩存塊也應當是argb格式;如果解碼視頻幀為yuv,則所申請的緩存塊也應當是yuv格式。
157.在本實施例中,如果可用緩存塊與解碼視頻幀的數據參數匹配,則將該可用緩存塊作為解碼視頻幀的緩存塊,即執行s31;如果可用緩存塊與解碼視頻幀的數據參數不匹配,則需要修改該可用緩存塊的格式,即執行s32。
158.s31,返回此緩存塊,該緩存塊即為申請所得的緩存塊。
159.s32,銷毀舊的緩存塊,按照新參數申請新的緩存塊。
160.在本實施例中,新參數指的是解碼視頻幀的格式,例如,argb或者yuv。按照新參數申請新的緩存塊,即執行s5。
161.s22,輸出棧大小是否小於等於緩存餘量值。
162.在本實施例中,緩存餘量值是為了增加播放流暢性而設定的,可以由用戶根據實際情況靈活設置,例如,10。
163.在本實施例中,如果輸出棧大小小於等於緩存餘量值,則可以申請新的緩存塊,即執行s41;如果輸出棧大小小於等於緩存餘量值,則不能繼續申請緩存塊,此時申請失敗,即執行s42。
164.在本實施例中,輸出棧大小小於等於緩存餘量值時不能繼續申請緩存塊,是為了保證最大只能申請gop視頻幀數+緩存餘量值(例如,50+10幀)的緩存,從而防止無休止的申請內存導致內存使用過大。同時,在申請失敗時,可以等待一段時間(例如,20ms左右)後再次進行申請,以此循環,直至渲染端消耗一些緩存幀後,即可申請成功。
165.s41,按照參數申請新的緩存塊並添加進緩存池。
166.在本實施例中,參數指的是解碼視頻幀的格式,例如,argb或者yuv。按照參數申請新的緩存塊,即執行s5。
167.s42,緩存塊申請失敗。
168.s5,判斷解碼視頻幀是否是硬體解碼數據。
169.在本實施例中,如果解碼視頻幀是硬體解碼數據,則執行s61;如果解碼視頻幀是軟體解碼數據,則執行s62。
170.s61,申請gpu離屏表面。
171.s62,申請yuv內存。
172.s7,緩存塊申請成功。
173.在本實施例中,縮放線程在接收到解碼視頻幀時,按照圖7所示的流程申請一個緩存塊,如果申請成功,則繼續下一步;如果申請失敗,則不斷重複申請流程。
174.第三步,將上一步申請的緩存塊的引用計數加一,然後根據首個gop解碼後的視頻幀信息(例如,視頻的寬高、類型、幀率等)封裝一個異步任務,每個異步任務均具備一個幀序號,幀序號用於表徵解碼視頻幀對應的視頻幀在首個gop中的順序,幀序號遇到i幀時清零,後續幀累計加一。例如,對i0-p1-p2-p4-p4-p5進行解碼,得到的解碼視頻幀,其對應的幀序號依次為0、1、2、3、4、5。
175.第四步,將異步任務送入多線程縮放碼線程池,如果多線程縮放線程池中存在可用線程,則利用該可用線程對異步任務進行縮放處理得到縮放視頻幀,並按照幀序號倒序的將縮放視頻幀存入輸出隊列;如果多線程縮放線程池中不存在可用線程,則等待並不斷重試。
176.第五步,多線程縮放線程池不斷處理異步任務,如果該異步任務是硬體解碼數據,即,為argb格式,則使用gpu將argb數據縮放至第三步申請的緩存塊中,再根據幀序號倒序的將縮放視頻幀存入輸出隊列。如果該異步任務是軟體解碼數據,即,為yuv格式,則先使用軟體將yuv數據縮放至第三步申請的緩存塊中,再根據幀序號倒序的將縮放視頻幀存入輸出隊列。
177.第六步,不斷循環上述第五步和第六步,直到縮放線程收到下一個為i幀的解碼視頻幀,則說明此時已將首個gop的解碼視頻幀全部送入多線程縮放線程池。因此,縮放線程先等待多線程縮放線程池處理完所有未完成的異步任務,待完成所有異步任務後,將輸出隊列中的所有縮放視頻幀,壓入圖6所示的縮放gop ping-pong棧中的輸入棧中,待輸出隊列中的所有數據幀取出完畢後,如果當前輸出棧為空,則將輸出棧和輸入棧互換;如果當前輸出棧不為空,則不斷等待,直到輸出棧為空時,再將輸出棧和輸入棧互換。
178.例如,圖6中的輸出棧為空,則將輸出棧和輸入棧互換,互換之後輸入棧為空。如圖8所示,此時,縮放線程就能對另一個gop(i6-p7-p8-p9-p10-p11)解碼後的數據進行處理,並將處理後的縮放視頻幀壓入輸入棧。
179.第七步,縮放輸出線程從輸出棧中逐幀取出縮放視頻幀,並送至渲染器渲染,最終的渲染順序為p5-p4-p3-p2-p1-i0,每次渲染完一幀後,將此幀使用的緩存塊引用計數減一。
[0180][0181]
根據前述內容可知,在內存餘量充足時採用實時視頻高內存倒放模式,由於沒有進行重編碼和重解碼操作,所以倒放性能較實時視頻低內存倒放模式有較大提升。經測試,i7-7700 8核cpu的pc條件下,400w解析度h265碼流在4倍速情況下,能夠達到100幀/s的幀率。並且相對於現有技術,由於限制了最大視頻寬度為1920像素,假設倒放視頻解析度為400w,那麼會首先將其縮放為1920
×
1080的數據幀,如果gop為50,緩存餘量值設為10,那麼硬體解碼所需緩存大小為:4*1920*1080*(50+10)=480m,軟體解碼所需緩存大小為:3/2*1920*1080*(50+10)=180m,並且在硬體解碼時,縮放操作均使用gpu完成,省去了數據從gpu到cpu的耗時,硬體解碼的倒放性能得到了極大的提升。
[0182]
在本實施例中,由於不同設備的內存餘量、同一設備在不同狀態下的內存餘量都可能會不一致,並且視頻碼流的gop大小也是不斷變化的,所以,根據實際系統運行情況,適當的選擇不同的倒放模式,可以使視頻倒放在播放性能和內存使用上達到動態平衡。
[0183]
需要指出的是,上述步驟s103和s104中採用不同的倒放模式對gop進行視頻倒放的過程,是為了便於理解,以首個gop為例進行說明的,但本領域技術人員應當理解,針對目標視頻碼流中的每個gop,在選定具體的倒放模式之後,都是按照步驟s103和s104中的過程進行視頻倒放的,本技術實施例對此不再贅述。
[0184]
在本實施例中,如果當前使用的是實時視頻高內存模式,為保證系統安全性,防止在實時碼流參數(解析度、gop)變化時,出現內存消耗過大的問題,後續每接收完一個完整gop後,均需要判斷電子設備的當前內存餘量是否充足,如果當前內存餘量不足則切換到實時視頻低內存倒放模式。
[0185]
因此,在圖2的基礎上,請參照圖9,在步驟s104之後,本技術實施例提供的視頻倒放方法還包括步驟s105~s107。
[0186]
s105,若當前處於實時視頻高內存倒放模式,則針對目標視頻碼流中除首個gop之外的每個其它gop,基於其它gop的碼流參數、其它gop的前一個gop的內存預計使用值和電子設備的當前可用內存值,判斷電子設備的當前內存餘量是否充足。
[0187]
在本實施例中,碼流參數包括視頻幀數、解析度和數據格式,基於其它gop的碼流參數、其它gop的前一個gop的內存預計使用值和電子設備的當前可用內存值,判斷電子設備的當前內存餘量是否充足的過程,可以包括s1051~s1056。
[0188]
s1051,根據解析度和數據格式,計算單個視頻幀需消耗的緩存值。
[0189]
在本實施例中,由於實時視頻低內存倒放模式和實時視頻高內存倒放模式都需要做縮放處理,所以這裡的解析度,指的是縮放視頻幀的解析度。
[0190]
s1052,按照預設公式memusenew=framesize*(framenumnew+deltaframenum)計算其它gop的內存預計使用值;
[0191]
其中,memusenew表示其它gop的內存預計使用值,framenumnew表示其它gop的視頻幀數,framesize表示單個視頻幀需消耗的緩存值,deltaframenum表示預先設定的緩存餘量值。
[0192]
s1053,計算電子設備的當前可用內存值與其它gop的內存預計使用值之間的差值。
[0193]
s1054,判斷差值與其它gop的前一個gop的內存預計使用值的和是否小於電子設備的內存安全值。
[0194]
也就是,判斷memtotal
–
memusenew+memuse《memsafe是否成立,memtotal表示電子設備的當前可用內存值,memsafe表示前一個gop的內存預計使用值,memusenew表示其它gop的內存預計使用值。這裡之所以要加上前一個gop的內存預計使用值,是因為在緩存其它gop的數據時,前一個gop所佔用的緩存塊會陸續釋放,故需要將該部分內存考慮在內。
[0195]
s1055,若差值與其它gop的前一個gop的內存預計使用值的和小於電子設備的內存安全值,即,memtotal
–
memusenew+memuse《memsafe成立,則確定電子設備的當前內存餘量充足。
[0196]
s1056,若差值與其它gop的前一個gop的內存預計使用值的和不小於電子設備的
內存安全值,即,memtotal
–
memusenew+memuse《memsafe不成立,則確定電子設備的當前內存餘量不足。
[0197]
s106,若電子設備的當前內存餘量充足,則繼續採用實時視頻高內存倒放模式對所述其它gop進行視頻倒放。
[0198]
s107,若電子設備的當前內存餘量不足,則將實時視頻高內存倒放模式切換為實時視頻低內存倒放模式,並採用實時視頻低內存倒放模式對其它gop進行視頻倒放。
[0199]
在本實施例中,如果電子設備的當前內存餘量充足,即,memtotal
–
memusenew+memuse≥memsafe,則繼續採用實時視頻高內存倒放模式對述其它gop進行視頻倒放。如果電子設備的當前內存餘量不足,即,memtotal
–
memusenew+memuse<memsafe,則切換為實時視頻低內存倒放模式,採用實時視頻低內存倒放模式對其它gop進行視頻倒放。
[0200]
同時,如果初始時選擇的是實時視頻低內存倒放模式,即,採用實時視頻低內存倒放模式對首個gop進行視頻倒放,則一直保持此模式進行實時倒放。
[0201]
與現有技術相比,本技術實施例具有以下有益效果:
[0202]
首先,根據碼流參數和電子設備的當前可用內存值動態的選擇倒放模式,使得視頻倒放在播放性能和內存使用上達到動態平衡,從而可以實現兼顧播放性能和內存使用的效果。
[0203]
其次,針對實時視頻低內存倒放模式,多線程處理能加快gop整體的處理速度,而採用複雜度較低的編碼器可以一定程度上縮短重編碼耗時,並且先縮放後重編碼,能夠有效提高重編碼效率,後續的解碼速度也會有一定提升,並且不會存在太大的圖像損失。
[0204]
第三,針對實時視頻高內存倒放模式,多線程處理能加快gop整體的處理速度,由於不進行重編碼和重解碼操作,gop的處理速度會得到較大的提升,同時,保留了對解碼後的數據進行縮放處理的過程,可以減小4k等高解析度情況下內存的消耗。
[0205]
第四,實時視頻高內存倒放模式採用緩存池的方式,可以減小大塊內存分配消耗的時間以及減少內存碎片的產生;同時,緩存餘量值的設置,可以抵抗播放卡頓,增加播放流暢性。
[0206]
為了執行上述方法實施例及各個可能的實施方式中的相應步驟,下面給出一種視頻倒放裝置的實現方式。
[0207]
請參照圖10,圖10示出了本技術實施例提供的視頻倒放裝置100的方框示意圖。視頻倒放裝置100應用於電子設備,其包括:響應模塊101、判斷模塊102、第一執行模塊103和第二執行模塊104。
[0208]
響應模塊101,用於響應視頻倒放指令,獲取目標視頻碼流中的首個畫面組gop。
[0209]
判斷模塊102,用於基於首個gop的碼流參數和電子設備的當前可用內存值,判斷電子設備的當前內存餘量是否充足。
[0210]
第一執行模塊103,用於若電子設備的當前內存餘量不足,則採用實時視頻低內存倒放模式對首個gop進行視頻倒放;其中,實時視頻低內存倒放模式用於對首個gop解碼後的視頻幀並行的進行縮放及重編碼處理。
[0211]
第二執行模塊104,用於若電子設備的當前內存餘量充足,則採用實時視頻高內存倒放模式對首個gop進行視頻倒放;其中,實時視頻高內存倒放模式用於對首個gop解碼後的視頻幀並行的進行縮放處理。
[0212]
可選地,碼流參數包括視頻幀數、解析度和數據格式;判斷模塊102具體用於:
[0213]
根據解析度和數據格式,計算單個視頻幀需消耗的緩存值;
[0214]
按照預設公式memuse=framesize*(framenum+deltaframenum)計算首個gop的內存預計使用值;
[0215]
其中,memuse表示首個gop的內存預計使用值,framenum表示首個gop的視頻幀數,framesize表示單個視頻幀需消耗的緩存值,deltaframenum表示緩存餘量值;
[0216]
判斷電子設備的當前可用內存值與首個gop的內存預計使用值的差值是否小於電子設備的內存安全值;
[0217]
若是,則確定電子設備的當前內存餘量不足;
[0218]
若否,則確定電子設備的當前內存餘量充足。
[0219]
可選地,第一執行模塊103具體用於:
[0220]
對首個gop中的每一視頻幀逐幀進行解碼,得到每一解碼視頻幀;其中,每一解碼視頻幀均具有幀序號,幀序號表徵解碼視頻幀對應的視頻幀在首個gop中的順序;
[0221]
針對任一解碼視頻幀,從預先建立的多線程縮放重編碼線程池中確定第一可用線程;
[0222]
基於解碼視頻幀的類型,利用第一可用線程對解碼視頻幀進行縮放及重編碼處理得到重編碼視頻幀,並按照解碼視頻幀的幀序號對重編碼視頻幀進行倒序存儲;
[0223]
在完成所有解碼視頻幀的處理後,對每一重編碼視頻幀逐幀進行重解碼及渲染,以完成首個gop的視頻倒放。
[0224]
可選地,第一執行模塊103執行基於解碼視頻幀的類型,利用第一可用線程對解碼視頻幀進行縮放及重編碼處理得到重編碼視頻幀,並按照解碼視頻幀的幀序號對重編碼視頻幀進行倒序存儲的方式,包括:
[0225]
當解碼視頻幀的類型為硬體解碼數據時,第一可用線程通過gpu對解碼視頻幀進行縮放處理得到縮放視頻幀,並將縮放視頻幀存儲至預先申請的離屏表面,再按照設定圖片格式對離屏表面的縮放視頻幀進行重編碼得到重編碼視頻幀;
[0226]
當解碼視頻幀的類型為軟體解碼數據時,第一可用線程通過cpu對解碼視頻幀進行縮放處理得到縮放視頻幀,並按照設定圖片格式對縮放視頻幀進行重編碼得到重編碼視頻幀;
[0227]
第一可用線程按照幀序號,對重編碼視頻幀進行倒序存儲。
[0228]
可選地,第二執行模塊104具體用於:
[0229]
對首個gop中的每一視頻幀逐幀進行解碼,得到每一解碼視頻幀;其中,每一解碼視頻幀均具有幀序號,幀序號表徵解碼視頻幀對應的視頻幀在首個gop中的順序;
[0230]
針對任一解碼視頻幀,從預先建立的多線程縮放線程池中確定第二可用線程;
[0231]
基於解碼視頻幀的類型,利用第二可用線程對解碼視頻幀進行縮放處理得到縮放視頻幀,並按照解碼視頻幀的幀序號對縮放視頻幀進行倒序存儲;
[0232]
在完成所有解碼視頻幀的處理後,對每一縮放視頻幀逐幀進行渲染,以完成首個gop的視頻倒放。
[0233]
可選地,第二執行模塊104執行基於解碼視頻幀的類型,利用第二可用線程對解碼視頻幀進行縮放處理得到縮放視頻幀,並按照解碼視頻幀的幀序號對縮放視頻幀進行倒序
存儲的方式,包括:
[0234]
從預先建立的緩存池中申請解碼視頻幀對應的緩存塊,緩存塊的類型與解碼視頻幀的類型一致;
[0235]
當解碼視頻幀的類型為硬體解碼數據時,第二可用線程通過gpu對解碼視頻幀進行縮放處理得到縮放視頻幀,並將縮放視頻幀存儲至對應的緩存塊;
[0236]
當解碼視頻幀的類型為軟體解碼數據時,第二可用線程通過cpu對解碼視頻幀進行縮放處理得到縮放視頻幀,並將縮放視頻幀存儲至對應的緩存塊;
[0237]
第二可用線程按照幀序號,對存儲有縮放視頻幀的緩存塊進行倒序排列。
[0238]
可選地,視頻倒放裝置100還包括處理模塊105,處理模塊105用於:
[0239]
若當前處於實時視頻高內存倒放模式,則針對目標視頻碼流中除首個gop之外的每個其它gop,基於其它gop的碼流參數、其它gop的前一個gop的內存預計使用值和電子設備的當前可用內存值,判斷電子設備的當前內存餘量是否充足;
[0240]
若電子設備的當前內存餘量充足,則繼續採用實時視頻高內存倒放模式對其它gop進行視頻倒放;
[0241]
若電子設備的當前內存餘量不足,則將實時視頻高內存倒放模式切換為實時視頻低內存倒放模式,並採用實時視頻低內存倒放模式對其它gop進行視頻倒放。
[0242]
可選地,碼流參數包括視頻幀數、解析度和數據格式;處理模塊106執行基於其它gop的碼流參數、其它gop的前一個gop的內存預計使用值和電子設備的當前可用內存值,判斷電子設備的當前內存餘量是否充足的方式,包括:
[0243]
根據解析度和數據格式,計算單個視頻幀需消耗的緩存值;
[0244]
按照預設公式memusenew=framesize*(framenumnew+deltaframenum)計算其它gop的內存預計使用值;
[0245]
其中,memusenew表示其它gop的內存預計使用值,framenumnew表示其它gop的視頻幀數,framesize表示單個視頻幀需消耗的緩存值,deltaframenum表示緩存餘量值;
[0246]
計算電子設備的當前可用內存值與其它gop的內存預計使用值之間的差值;
[0247]
判斷差值與其它gop的前一個gop的內存預計使用值的和是否小於電子設備的內存安全值;
[0248]
若是,則確定電子設備的當前內存餘量不足;
[0249]
若否,則確定電子設備的當前內存餘量充足。
[0250]
所屬領域的技術人員可以清楚地了解到,為描述的方便和簡潔,上述描述的視頻倒放裝置100的具體工作過程,可以參考前述方法實施例中的對應過程,在此不再贅述。
[0251]
請參照圖11,圖11示出了本技術實施例提供的電子設備10的方框示意圖。電子設備10可以是路由器、交換機等,包括處理器11、存儲器12及總線13,處理器11通過總線13與存儲器12連接。
[0252]
存儲器12用於存儲程序,處理器11在接收到執行指令後,執行所述程序以實現上述實施例揭示的視頻倒放方法。
[0253]
存儲器12可能包括高速隨機存取存儲器(random access memory,ram),也可能還包括非易失存儲器(non-volatile memory,nvm)。
[0254]
處理器11可能是一種集成電路晶片,具有信號的處理能力。在實現過程中,上述方
法的各步驟可以通過處理器11中的硬體的集成邏輯電路或者軟體形式的指令完成。上述的處理器11可以是通用處理器,包括中央處理器(central processing unit,cpu)、微控制單元(microcontroller unit,mcu)、複雜可編程邏輯器件(complex programmable logic device,cpld)、現場可編程門陣列(field programmable gate array,fpga)、嵌入式arm等晶片。
[0255]
本技術實施例還提供了一種計算機可讀存儲介質,其上存儲有電腦程式,電腦程式被處理器11執行時實現上述實施例揭示的視頻倒放方法。
[0256]
綜上所述,本技術實施例提供的一種視頻倒放方法、裝置、電子設備及存儲介質,在進行視頻倒放時,基於碼流參數和電子設備的當前可用內存值判斷電子設備的當前內存餘量是否充足,如果電子設備的當前內存餘量不足,則採用實時視頻低內存倒放模式對解碼後的視頻幀並行的進行縮放及重編碼處理;如果電子設備的當前內存餘量充足,則採用實時視頻高內存倒放模式對解碼後的視頻幀並行的進行縮放處理。也就是,根據碼流參數和電子設備的當前可用內存值動態的選擇倒放模式,使得視頻倒放在播放性能和內存使用上達到動態平衡,從而可以實現兼顧播放性能和內存使用的效果。
[0257]
以上所述僅為本技術的優選實施例而已,並不用於限制本技術,對於本領域的技術人員來說,本技術可以有各種更改和變化。凡在本技術的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本技術的保護範圍之內。