基於騰訊雲的視頻聊天研究

歡迎你們前往雲+社區,獲取更多騰訊海量技術實踐乾貨哦~html

做者:歐彥興java

簡介

最近有個需求是與視頻聊天相關,以前有看到過騰訊雲有視頻直播的產品,不清楚是否也支持視頻聊天。通過一番查找,發現除了直播的demo,還專門有一個視頻聊天的demo,因而便下下來研究一下。git

這是文檔:www.qcloud.com/document/pr…github

這是視頻直播demo工程:github.com/zhaoyang21c…算法

這是視頻聊天demo工程:github.com/zhaoyang21c…c#

本文只討論視頻聊天的demo,下載下來簡單配置一下,工程就能跑起來。註冊兩個帳號後,就能夠互相呼叫了。這裏注意一下,須要開啓相機權限,不然會是一片黑屏。界面大概是這樣的,會有兩個渲染窗口,一個本身的,一個對方的,右邊一些操做的按鈕,能夠操做美顏、切換攝像頭等等(這裏只有本身的窗口)。網絡

遮罩與蒙層

工程跑起來之後,就要作一些定製的事情了。需求要求有遮罩和模糊的效果(不要問爲何,反正有就是了)。遮罩比較簡單,直接蓋一層ImageView就行了。模糊的話,若是要作高斯模糊,就要對視頻數據進行處理。首先嚐試一下用最簡單的蓋一層黑色蒙層看一下效果如何。爲了方便測試,在右側加了兩個操做的按鈕。在佈局裏面添加了對應的item。ide

遮罩的效果:佈局

蒙層的效果:(50%的黑色蒙層)性能

灰階、旋轉、模糊

從效果上看,蒙層確實差,看來只能從視頻數據入手了。翻了一遍文檔,終於找到定製視頻的方法(www.qcloud.com/document/pr… 有兩種方式能夠處理視頻數據,來達到想要的效果。

一、攔截sdk的相機數據,進行處理後,再傳回到sdk。

二、本身採集相機數據,進行處理後,傳給sdk進行上傳。

嘗試使用第一種方式,須要調用setLocalVideoPreProcessCallback來攔截相機回調的數據,注意視頻數據格式爲I420(視頻數據格式相關知識能夠參考這篇文章《圖文詳解YUV420數據格式》), 並且須要在相機初始化之後調用,不然會失敗。

針對視頻數據,首先嚐試了灰階化和旋轉的修改。

灰階化:

旋轉:(注意寬高也要反過來)

模糊:

真正的高斯模糊性能要求較高,比較難達到實時的要求,須要使用Shader來實現,這裏打算先體驗一下模糊的效果,因此選擇最簡單的方式來實現。爲了進行模糊操做,須要先轉換爲RGB格式,處理完了之後再轉換爲YUV數據。流程是這樣的:YUV -> RGB -> blur ->YUV,這裏的blur採用近似的算法來代替(網上找到fastBlur方法)。對於數據轉換的方法,能夠參考這篇文章《圖像RGB2YUV與YUV2RGB格式互轉介紹》,測試了一下,騰訊雲的數據是YUV而不是YCbCr,因此這裏採用的是二、3的轉換。

(模糊半徑:10)

(模糊半徑:30)

模糊處理耗時:150 ~200 ms

後續工做

本文使用的都是直接在java層進行處理,數據處理起來性能效率不好(150-200ms),界面會很卡(掉幀)。要真能用於實際的業務,必需要使用第二種方式來進行數據處理,就是自行採集數據,利用硬件GPU進行數據處理,而後提交sdk渲染和傳輸,方能達到性能與效果的平衡,固然這種方式開發量和質量保證的難度也會相應地增長。

詳細代碼請查看附件。

參考文獻

騰訊雲文檔:www.qcloud.com/document/pr…

YUV數據格式:www.cnblogs.com/azraelly/ar…

YUV與RGB轉換:www.cnblogs.com/qiqibaby/p/…

相關閱讀

unity引擎與c#腳本簡介

在Keras中如何對超參數進行調優?

從Traceroute看網絡問題

此文已由做者受權雲加社區發佈,轉載請註明文章出處

相關文章
相關標籤/搜索