1.基于幀圖像合成的實時視頻混屏的關鍵技術
1.1 并發解碼
實時視頻流混屏處理多路實時視頻流輸入,并輸出實時視頻流。解碼處理的數據量大,實時性要求高,對服務器的解碼能力提出很高要求。高度并發解碼,充分利用多核CPU計算能力是實現實時視頻流混屏的關鍵。為提高并發度,并發解碼至少包括兩級并發,一級是多個實時流解碼器的并發解碼,二級是解碼器Frame級別的并發解碼。
多個解碼器分別對不同的視頻源進行處理,并將分別獨立輸出數據幀,以隊列的方式保存,供后續模塊調用。解碼器之間相互獨立,不存在制約關系,可并發處理,提高CPU利用率。
解碼器Frame級別的并發,解碼器采用線程池方式進行解碼。在解碼器初始化時,根據服務器CPU核數,初始化相應數目的解碼線程。解碼線程接收輸入數據,并對數據進行解碼。外部程序通過解碼器提供的調用入口decode(),進入解碼器的主線程。解碼器結構及主線程和解碼線程的同步關系如圖1所示。
1.2 圖像合成
將多個視頻混屏,可通過圖像合成的方式,將多個實時流的數據幀圖像合成新圖像,將合成后的視頻幀作為輸入進行編碼得到實時視頻流輸出。多個數據幀的圖像合成必須采用統一的圖像格式。
圖像數據在存儲中的存儲格式主要包括RGB和YUV。YUV格式所需存儲空間比RGB格式存儲空間小,因此YUV格式主要用于多媒體數據傳輸。高清實時視頻流多采用H.264編碼方式,其采用的色彩空間是YUV。在合成過程中,如發現視頻源的圖像采用RGB方式,則需要將其轉換成YUV才可合成。
RGB圖像和YUV圖像可相互轉換,從RGB到YUV的轉換公式見公式(1)。
Y=0.30R+0.59G+0.11
BU=0.493\\(B-Y\\)
V=0.877\\(R-Y\\) (1)
另外,YUV格式也存在多種不同的采樣比。在實際應用中,為減少運算量,可選擇使用視頻源中最普遍使用的格式,而將其他格式的圖像進行轉換,形成統一格式。
將多個YUV圖像合成一個YUV圖像,可根據各個圖像排列的位置,對圖像的三個分量重新進行排列組合成新圖像。以Planar格式為例,將多個YUV圖像合成一個YUV圖像,可將YUV三個通道各自分開處理,對每個通道的分量,按照每行分量的位置從左到右排列,各行從上到下排列。
1.3 視頻同步
圖像合成組成新的視頻需解決多視頻間的同步問題。由于多路高清視頻流的來源不一致,解碼后獲得包含圖像的數據幀的幀率不一致,為確保合成后視頻的質量,必須將多路視頻的輸出圖像進行同步處理。同步方法如下。
選取一個實時視頻流的輸出數據幀作為基準序列,在單位時間內,對其他實時視頻流解碼后獲得的數據幀序列,通過插幀或丟棄的方式,將視頻幀的個數與基準源保持一致,以基準序列的時間戳作為合成后數據幀序列的時間戳。為提高視頻質量,在對數據幀進行插幀或丟棄時,可根據對視頻對象做真實運動的估值結果進行處理。
1.4 編碼輸出
將合并后的數據幀序列作為原始數據,輸入到編碼器中。編碼器根據目標輸出設置的參數,生成實時流,將實時流發布到流媒體服務器中??蛻舳酥恍枰L問流媒體服務器即可播放合成后的視頻。圖像合成只考慮視頻處理。根據實際應用需要,選擇某個視頻源的音頻或多個音頻混音,作為目標輸出流的音頻,合并輸出。
1.5 內存管理
數據幀的內存管理機制對數據幀提供創建、銷毀、引用、撤銷引用、引用遷移等操作,并增加數據區的引用計數器。在引用、撤銷引用、引用遷移時,不重新申請數據區,而是建立、修改或撤銷對數據區的引用關系,保持數據區指針在數據幀對象中,并修改數據區的引用計數器。當數據幀Buffer被創建時,計數初始化為1。當該Buffer被數據幀引用時,計數+1,當數據幀撤銷引用時,計數-1。
每數據幀撤銷引用時,檢查計數器數值,只有當發現計數器被清零時,才釋放該數據區。通過采用引用計數器的機制,有效防止內存泄露,并大大減少重復的內存申請和數據復制操作,提高處理性能。
2.基于幀圖像合成的實時流混屏解決方案
基于上文的關鍵技術研究成果,提出基于視頻幀合成的實時流混屏的解決方案。該方案采用高度并發解碼方式,將實時視頻流解碼成為視頻幀序列;并通過將多個視頻幀中的YUV圖像合成,生成新視頻幀,再對新視頻幀進行編碼,輸出目標格式的實時視頻流。該解決方案的系統架構圖如2所示。
解碼模塊包括多個解碼器,一個解碼器負責對一個實時視頻流進行解碼,獲得數據幀后,由預處理模塊對視頻幀進行以下處理。
首先,根據目標輸出視頻的像素比例,計算該視頻畫面在目標畫面所占的實際大小,對視頻幀進行縮放操作,在此縮放視頻幀,可以減少后續處理的數據量,而不影響轉換后的視頻質量。然后,檢查圖像的色彩空間格式,如果不是YUV格式,統一為YUV格式。最后,將處理好的視頻幀從隊列尾部加入到待處理的視頻幀隊列中。
視頻合成模塊,訪問各個編碼器輸出的待處理的視頻幀隊列,從隊列頭部取出視頻幀,進行合并。在合并過程中,為保證視頻同步,以其中一個視頻流為基準,對其他視頻流的數據幀采用插幀或丟棄,保證所有數據幀的時間戳一致。解碼模塊和視頻合成模塊對視頻幀隊列分別進行處理,解碼模塊輸出數據幀插入到隊列尾,而視頻合成模塊從視頻幀隊列頭開始處理,將解碼和編碼的耦合度降到最低,解碼與編碼可以同時進行。
編碼器對視頻合成模塊輸出的視頻幀序列進行編碼,轉換生成混屏后的實時視頻流。
基于該解決方案實現混屏,在服務器測試,單臺服務器可以支持32路高清實時視頻流的混屏。服務器型號HP BL460C G8,CPU型號Intel\\(R\\)Xeon\\(R\\) CPU E5-2620 0 @ 2.00GHz\\(6 Cores\\),雙CPU超線程24核。測試使用的輸入實時視頻源1080p,碼率是12Mbit/s;輸出是720p,碼率為2Mbit/s。
測試結果證明,服務器CPU的利用率隨著輸入源的數量線性增加。多路實時視頻源輸入下的混屏的CPU使用率如圖3所示。
3.結束語
以上提出基于視頻幀合成的實時流視頻混屏的方法,多個解碼器間互不干擾,為高度并發解碼提供可能;并采用視頻幀隊列管理的方式,使得解碼和編碼的耦合降到最低,解碼與編碼可以同時進行。高度并發使服務器的多核CPU運算能力得到充分利用,僅依靠軟件解碼的方式就能實現多個高清視頻的混屏,不依賴于高端定制的硬件服務器才能實現?;炱撂幚砗?,以實時視頻流的方式輸出,客戶端只需接收視頻流進行播放即可,對客戶端的配置要求低。
參考文獻:
[1]黃東君,陳松喬.基于源根組播的多點視頻會議系統模型及其實現.電子學報,2005\\(1\\).
[2]劉峰.視頻圖像編碼技術及國際標準.北京郵電大學出版社,2005\\(7\\).
[3]肖永豪,余英林.基于視頻對象的自適應去幀/插幀視頻處理.華南理工大學學報\\(自然科學版\\),2003\\(8\\).