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

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

作者:歐彥興

簡介

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

這是文檔:https://www.qcloud.com/document/product/268/7603

這是視頻直播demo工程:https://github.com/zhaoyang21cn/ILiveSDK_Android_Suixinbo

這是視頻聊天demo工程:https://github.com/zhaoyang21cn/CallSDK_Android_Demo

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

遮罩與蒙層

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

遮罩的效果:

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

灰階、旋轉、模糊

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

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

2、自己採集相機數據,進行處理後,傳給sdk進行上傳。

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

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

灰階化:

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

模糊:

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

(模糊半徑:10)

(模糊半徑:30)

模糊處理耗時:150 ~200 ms

後續工作

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

詳細代碼請查看附件。

參考文獻

騰訊雲文檔:https://www.qcloud.com/document/product/268/7603

YUV數據格式:http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

YUV與RGB轉換:http://www.cnblogs.com/qiqibaby/p/5260167.html

相關閱讀

unity引擎與c#腳本簡介

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

從Traceroute看網絡問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章