Android opengl 實(shí)現(xiàn)動(dòng)態(tài)貼紙(仿QQ的拍攝)

回顧

在前面視頻錄制篇尾(http://www.reibang.com/p/4f63b2436401)中有提到視頻錄制+人臉識(shí)別+貼紙的想法,而上一篇(http://www.reibang.com/p/6d2d4f00b43c)中也使用opengl實(shí)現(xiàn)了多種特效炕倘,在這些技術(shù)與理論基礎(chǔ)上能否實(shí)現(xiàn)市面上常見的動(dòng)態(tài)貼紙效果呢钧大?

效果圖

先來個(gè)效果圖,這個(gè)是抓取QQ的資源包來做的:


視頻動(dòng)態(tài)貼紙?zhí)匦?gif

分析

素材解析

剛開始看到QQ的這個(gè)拍攝特效時(shí)激才,覺得很有意思拓型,又正好之前就想著研究一下動(dòng)態(tài)貼紙的做法,于是在sd卡中找到QQ的文件目錄.../tencent/MobileQQ/capture_ptv_template/ptv_template_usable/video_qiuhongbaowu3_iOS/,里面有bgm瘸恼、hongbao兩個(gè)目錄和params.json文件劣挫,bgm中是背景音樂mp3文件,hongbao中是80張素材圖片东帅,params.json是規(guī)則配置文件压固。

至此大體能知道,其實(shí)視頻動(dòng)效是由一系列圖片連續(xù)顯示的效果靠闭。查看params.json帐我,里面包含類型定義、顯示時(shí)間間隔愧膀、素材列表及顯示順序拦键,同時(shí)每個(gè)素材信息還包括鏤空中心點(diǎn)、鏤空區(qū)域大小檩淋、旋轉(zhuǎn)角度等信息芬为。顯然這個(gè)鏤空區(qū)域是用來填充人臉的,這樣人臉圖像放在底層蟀悦,貼紙?jiān)谏蠈用碾枰岀U空區(qū)域與人臉重合,以便看起來就像是人臉在貼紙上的效果日戈。

原理與關(guān)鍵點(diǎn)分析

解析素材后可以看出询张,根據(jù)配置文件,對(duì)素材列表根據(jù)順序及時(shí)間間隔浙炼,不斷替換顯示出來份氧,其實(shí)視頻也是這個(gè)原理∥ò溃現(xiàn)在有個(gè)問題:怎么讓素材圖片隔段時(shí)間替換一張,不斷顯示出來呢蜗帜?

前面文章中的視頻錄制越妈,就是需要設(shè)置幀率,也就是說每隔一段時(shí)間都會(huì)刷新畫面钮糖,如果我們?cè)O(shè)置filter,那么每個(gè)filter的draw就會(huì)在刷新時(shí)被調(diào)用酌住。所以我們寫一個(gè)filter店归,解析配置文件得到文件列表及其他信息,這樣在draw函數(shù)中酪我,每次根據(jù)時(shí)間來判斷當(dāng)前應(yīng)該畫哪一張圖:

...
if (this.loopStartTime == -1L) {
    this.loopStartTime = System.currentTimeMillis();
}
int currentIndex = (int) ((System.currentTimeMillis() - this.loopStartTime) / this.mSticker.frameDuration);
if (currentIndex >= this.mSticker.frameCount) {
    if (!this.mSticker.looping) {
        this.loopStartTime = -1L;
        this.lastIndex = -1;
        return;
    }
    currentIndex = 0;//新一輪中從第一張開始顯示消痛,并重新計(jì)時(shí)
    this.loopStartTime = System.currentTimeMillis();
}
if (currentIndex < 0) {
    currentIndex = 0;
}
StaticImage image = mSticker.images.get(currentIndex);
if (this.lastIndex != currentIndex) {
    mTexture.load(image.path);//加載圖片
}
...

對(duì)于渲染圖片,在之前的demo中已經(jīng)有現(xiàn)成源碼可以使用都哭,那如何把頭像繪制到貼紙的鏤空位置呢秩伞?

頭像摳圖

人臉識(shí)別可以借助第三方的sdk,face++欺矫、商湯等收費(fèi)的纱新,識(shí)別效果比較好,主要是識(shí)別到的關(guān)鍵點(diǎn)比較多穆趴,或者訊飛的免費(fèi)脸爱,基本能夠滿足。
根據(jù)識(shí)別結(jié)果的頭像區(qū)域未妹,再計(jì)算貼紙鏤空區(qū)域位置與大小簿废,使用glsl做渲染位置計(jì)算:

precision highp float;
varying highp vec2 vCamTextureCoord;
uniform sampler2D uCamTexture;
uniform vec4 srcRect;//頭像在源畫面(畫布)中的位置
uniform vec4 dstRect;//頭像在新畫布中的位置

void main(){
    lowp vec4 c1 = texture2D(uCamTexture, vCamTextureCoord);

    //注意這個(gè)y坐標(biāo)的計(jì)算,因?yàn)槠聊蛔鴺?biāo)第的Y軸方向與紋理的Y軸方向是相反的
    lowp vec2 vCamTextureCoord2 = vec2(vCamTextureCoord.x,1.0 - vCamTextureCoord.y);
    vec2 point = vCamTextureCoord2;

    if(point.x>dstRect.r && point.x<dstRect.b && point.y>dstRect.g && point.y<dstRect.a)
    {
        //這個(gè)需要根據(jù)縮放比例來計(jì)算真實(shí)位置
        vec2 imagexy = vec2(
            (srcRect.b - srcRect.r) * (point.x - dstRect.r) / (dstRect.b - dstRect.r) + srcRect.r,
            1.0 - ((srcRect.a - srcRect.g) * (point.y - dstRect.g) / (dstRect.a - dstRect.g) + srcRect.g)
        );
        c1 = texture2D(uCamTexture, imagexy);
    }

    gl_FragColor = c1;
}

至此络它,我們可以這樣理解這個(gè)過程:
原始畫面 -> 摳頭像 -> 畫貼紙
即兩次渲染族檬,得到合成的畫面,再加上時(shí)間間隔及不同貼紙的顯示化戳,就得到上術(shù)的效果单料。
由于我們?cè)趽割^像后是繪制到當(dāng)前貼紙的鏤空位置,這樣無論頭像在原始畫面的什么位置迂烁,只要能識(shí)別出來看尼,都不會(huì)影響摳圖操作及最終效果。

總結(jié)

現(xiàn)在來看盟步,動(dòng)態(tài)貼紙從原理上其實(shí)也是很簡(jiǎn)單的藏斩,而且組合方式很多,所以才能看到很多APP上有那么多的貼紙模版却盘,當(dāng)然有些是有加入肢體識(shí)別的狰域,比如QQ媳拴,這方便鵝廠坐的很好。
其實(shí)也要“感謝”那些第三方SDK的收費(fèi)兆览,還有XXX的UOK屈溉,促使我們自己來研究這些。

吐槽一下抬探,對(duì)于那些本來沒有基礎(chǔ)子巾、不想花錢,而還想要達(dá)到別人的精致效果的小压,那就只能呵呵了线梗。

本文相關(guān)的代碼暫時(shí)不會(huì)更新到DEMO中,其實(shí)思想比較重要怠益。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仪搔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜻牢,更是在濱河造成了極大的恐慌烤咧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抢呆,死亡現(xiàn)場(chǎng)離奇詭異煮嫌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)镀娶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門立膛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梯码,你說我怎么就攤上這事宝泵。” “怎么了轩娶?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵儿奶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鳄抒,道長(zhǎng)闯捎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任许溅,我火速辦了婚禮瓤鼻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贤重。我一直安慰自己茬祷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布并蝗。 她就那樣靜靜地躺著祭犯,像睡著了一般秸妥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沃粗,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天粥惧,我揣著相機(jī)與錄音,去河邊找鬼最盅。 笑死突雪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涡贱。 我是一名探鬼主播挂签,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盼产!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勺馆,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤戏售,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后草穆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灌灾,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年悲柱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锋喜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豌鸡,死狀恐怖嘿般,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涯冠,我是刑警寧澤炉奴,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蛇更,受9級(jí)特大地震影響瞻赶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜派任,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一砸逊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掌逛,春花似錦师逸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)对湃。三九已至,卻和暖如春遗淳,著一層夾襖步出監(jiān)牢的瞬間拍柒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工屈暗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拆讯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓养叛,卻偏偏與公主長(zhǎng)得像种呐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弃甥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)爽室、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,120評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,284評(píng)論 25 707
  • 與哥大風(fēng)格完全不同淆攻,紐約大學(xué)沒有獨(dú)立封閉的阔墩、圍墻般的校園,因?yàn)樗男@與整個(gè)紐約市融為一體瓶珊,也可以說紐約大學(xué)是以整...
    午后窗臺(tái)的貓閱讀 433評(píng)論 0 0
  • 1.現(xiàn)在的你在哪啸箫,在干什么? 2.四年后的你在哪伞芹,和誰在一起忘苛? 3.如果你遇見十年后的你,會(huì)對(duì)自己說些什么唱较? ——...
    懶羊羊?qū)W長(zhǎng)閱讀 386評(píng)論 0 3
  • 誰的青春不迷茫扎唾,沒有看過這本書,甚至也沒有看過劉同的其他書南缓,不過我身邊的很多朋友倒是蠻喜歡劉同的稽屏。那為什么會(huì)去看這...
    半__夏_閱讀 167評(píng)論 0 0