彈幕的“原理”

寫這篇文章算柳,其實(shí)對(duì)我來說,有點(diǎn)誤人子弟泽台,額呃赏胚,因?yàn)檫@篇寫文章的角度不是對(duì)技術(shù)考量访娶,而是從一位產(chǎn)品經(jīng)理的角度思考著怎么把產(chǎn)品和功能做好,跨領(lǐng)域觉阅,嘿嘿震肮,嘗試一下我的思考 :)

在寫這篇文章之前,我已經(jīng)谷歌了很多關(guān)于彈幕的實(shí)現(xiàn)方法留拾,雖然大部分的文章介紹的很詳細(xì),但幾乎都是從開發(fā)角度去思考問題鲫尊,告訴我們借用代碼怎么去實(shí)現(xiàn)效果痴柔,可是沒說在該功能設(shè)計(jì)前的產(chǎn)品規(guī)劃和怎樣解決跟客戶對(duì)接并讓客戶也了解其實(shí)現(xiàn)原理的言辭。這里我就不過多的講怎么用技術(shù)代碼去實(shí)現(xiàn)的過程疫向,講講思考這個(gè)產(chǎn)品的定位和效果咳蔚。

彈幕的數(shù)據(jù)獲取方式:

簡(jiǎn)單總結(jié)一下開發(fā)技術(shù)實(shí)現(xiàn)的方法:
1:客戶端里的定時(shí)器走HTTP“請(qǐng)求—響應(yīng)”的方式獲得數(shù)據(jù),并刷新界面來達(dá)到效果搔驼;
2:直播軟件一般是后臺(tái)和客戶端建立socket連接谈火,來相互傳輸通信,從而達(dá)到實(shí)時(shí)顯示的效果舌涨。
小結(jié):這兩種方法具體采取哪一種糯耍,是需要結(jié)合自身的需要和成本角度去取舍的

彈幕需求種類:

1:以快手、花椒等直播APP為例,這個(gè)是后臺(tái)通過socket連接直接把彈幕數(shù)據(jù)推給客戶端并實(shí)時(shí)顯示温技;
2:以B站革为、愛奇藝等非直播類視頻為例,可以快進(jìn)后退舵鳞,這就要做到視頻幀率的時(shí)間點(diǎn)跟彈幕進(jìn)行一一綁定震檩。
小結(jié):后面這種是客戶端根據(jù)時(shí)間點(diǎn)向服務(wù)器請(qǐng)求數(shù)據(jù),并緩存在本地蜓堕,并和后面請(qǐng)求的數(shù)據(jù)相同id的彈幕進(jìn)行數(shù)據(jù)過濾抛虏,自己加的彈幕,客戶端這邊請(qǐng)求后臺(tái)之后自己插進(jìn)去套才,做到實(shí)時(shí)顯示迂猴。

結(jié)合實(shí)際的需求分析

其實(shí)我們要實(shí)現(xiàn)功能,看起來很難霜旧。因?yàn)槲覀儾荒茏鱿馚站那樣炸開屏幕错忱、五顏六色的彈幕,又不滿足現(xiàn)有的效果挂据,這就很頭疼了以清,因?yàn)樽鲂侣勵(lì)惖膹椖唬皣?yán)肅大方非娛樂”是我們的實(shí)現(xiàn)效果的標(biāo)尺崎逃,“炫酷大氣吊炸天”則不符合我們對(duì)產(chǎn)品的思考掷倔。實(shí)現(xiàn)效果如圖:

約束條件:

 戴了一雙鐐銬跳舞,難免會(huì)別扭个绍,還要求做出優(yōu)雅的動(dòng)作和輕盈似魔鬼的步伐勒葱,往往需要我們更從容的去面對(duì)眼前。
 1:從下往上飄
 2:一個(gè)彈道
 3:不能覆蓋
 4:勻速運(yùn)行
 5:效果不能太突兀巴柿,自然穩(wěn)重

計(jì)算速度

   以上的束縛已經(jīng)限定了我們凛虽,網(wǎng)上那些彈幕的方案是行不通的,我們只能在現(xiàn)有的基礎(chǔ)上進(jìn)行優(yōu)化广恢。
   數(shù)據(jù)好拿凯旋,現(xiàn)在關(guān)鍵點(diǎn)在于怎么優(yōu)雅的實(shí)現(xiàn)自上而下的彈幕,咱們還是從數(shù)據(jù)說話:
   拿iPhone手機(jī)屏幕最多的4.7寸來說(6/6s/7的尺寸)钉迷, 彈幕區(qū)域(寬高比4:3)的高度是281至非,再減去上下邊距,我們就用240的高度來計(jì)算糠聪,每條彈幕高度40荒椭,間距5,豎屏最多顯示 260 / 45 = 6.8 約等于6舰蟆,告訴我們趣惠,豎著區(qū)域狸棍,最多同時(shí)顯示6條彈幕,那如果數(shù)據(jù)量小的情況下信卡,是OK的沒問題隔缀,假如要是被刷屏了,那彈幕要顯示到什么時(shí)候傍菇,一條彈幕從出現(xiàn)到消失猾瘸,移動(dòng)6s時(shí)間(意思就是1s加載一個(gè),其實(shí)這個(gè)速度比較適中)丢习,那1000條彈幕牵触,那就嚇人了,大概要花 1000s = 15.6分鐘咐低。(PS: 線上APP的時(shí)間是2s一條)
   在狹小區(qū)域中顯示這么多的彈幕揽思。一種方法是隱瞞用戶(這也是很多家這么干的),很多家彈幕都是這么整的见擦,當(dāng)并發(fā)量特別大的時(shí)候钉汗,只能選擇性的過濾一些,但記住不能把當(dāng)前手機(jī)用戶剛剛發(fā)的那條也刪了鲤屡,這個(gè)過濾的工作损痰,是后臺(tái)和客戶端一起合作選擇性的過濾,
我自己做了一個(gè)demo酒来,僅供參考卢未,這是一個(gè)1s加載一個(gè)勻速運(yùn)行的彈幕。其實(shí)這也就解決了產(chǎn)品經(jīng)理的問題堰汉,現(xiàn)在辽社,她要了解的就是這個(gè)速度怎么去控制,我的思考:可以后臺(tái)控制速度翘鸭,也可以客戶端自己按照當(dāng)前時(shí)間節(jié)點(diǎn)上彈幕的多少進(jìn)行彈幕流速的控制滴铅,不管哪種都要求做到 “流暢不突兀”就乓。如下:
彈幕流速的控制. GIF

數(shù)據(jù)的獲取方式產(chǎn)品經(jīng)理不用管失息,研究怎么控制流速就行了

上面的這個(gè)demo,比較簡(jiǎn)單档址,iOS端原理是:scrollView的滾動(dòng)效果是一個(gè)動(dòng)畫,那么動(dòng)畫肯定會(huì)有一個(gè)執(zhí)行時(shí)間和一個(gè)加速器參數(shù)邻梆,所以只要修改到這兩個(gè)參數(shù)就可以達(dá)到想要的效果守伸。

我的總結(jié)

   彈幕比較少的時(shí)候,勻速每秒1個(gè)浦妄,運(yùn)行還是挺流暢的尼摹。彈幕少的時(shí)候见芹,想怎么整都無所謂,我們主要思考的解決同一個(gè)時(shí)間點(diǎn)上大量(比如一個(gè)時(shí)間點(diǎn)1000個(gè)彈幕)彈幕的顯示問題蠢涝,一下是我的思路:
   分兩種情況玄呛,1:直播視頻   2:回看視頻。第一種直播視頻是比較好解決的和二,開一個(gè)socke鏈接徘铝,實(shí)時(shí)推送數(shù)據(jù)流,顯示惯吕,具體顯示邏輯惕它,下面一同介紹。第二種废登,是我們大部分情況下思考的淹魄,因?yàn)槲覀児镜倪@個(gè)產(chǎn)品(保密就不說說哪款A(yù)PP了),不會(huì)存在很多個(gè)直播堡距,基本上都是視頻回顧甲锡,那我就站到視頻回顧的情形下說一說:
 1:當(dāng)用戶來到這個(gè)稿件,就開始請(qǐng)求后臺(tái)數(shù)據(jù)羽戒,把視頻剛播放時(shí)的一段時(shí)間的彈幕全部都獲取到缤沦,加以顯示。我們這里就約定半醉,每次請(qǐng)求數(shù)據(jù)是50條數(shù)據(jù)并緩存到本地疚俱,意思就是先展示最先50條數(shù)據(jù)的彈幕,當(dāng)播放到第50條彈幕播放的時(shí)間點(diǎn)的時(shí)候缩多,再去請(qǐng)求數(shù)據(jù)呆奕,再按照時(shí)間先后重新排序,過濾掉之前已經(jīng)緩存相同id的彈幕衬吆。這樣做的好處一時(shí)能減少用戶的流量梁钾,二是減少我們公司的服務(wù)器壓力,不會(huì)一次性全部都請(qǐng)求到逊抡,這樣太浪費(fèi)資源了姆泻,原則是:視頻播放多少,接口就請(qǐng)求多少冒嫡,彈幕就加載多少拇勃。
 2:流速的控制。我寫了一個(gè)demo孝凌,上面有流速的控制方咆,從0 - X,可以控制蟀架,寫這個(gè)demo的目的只是讓產(chǎn)品經(jīng)理感受一下在什么一個(gè)區(qū)間合適瓣赂,不是靠猜測(cè)榆骚。彈幕多了的時(shí)候,可以稍微快一點(diǎn)煌集,控制在每秒1 - 2個(gè)之間妓肢,平常就固定一秒一個(gè)就很好,保持勻速苫纤,加速減速就會(huì)顯得有一點(diǎn)點(diǎn)的卡頓碉钠。
 3:同一時(shí)間點(diǎn)大量的并發(fā)。后臺(tái)根據(jù)當(dāng)前用戶的id方面,不能過濾掉當(dāng)前用所發(fā)布的彈幕放钦,而且要實(shí)時(shí)顯示,其他的可以控制流量恭金,根據(jù)其他家的做法操禀,彈幕慢一點(diǎn)也沒關(guān)系,更何況我們的彈道就只有一條横腿,不控速不節(jié)流颓屑,是行不通的,當(dāng)彈幕推擠到一定程度比如某個(gè)節(jié)點(diǎn)有1000條時(shí)耿焊,我們會(huì)抽取其中的少部分顯示揪惦,其他的過濾掉(這個(gè)很合理,沒什么不能的)罗侯。
 4:彈幕和視頻播放時(shí)間是綁定在一起的器腋,發(fā)起彈幕的時(shí)候,會(huì)把當(dāng)前播放時(shí)間一起給后臺(tái)钩杰,拿到數(shù)據(jù)之后纫塌,客戶端就監(jiān)控視頻播放時(shí)間就行了,這是簡(jiǎn)單的想法讲弄,具體的還需要討教服務(wù)端同事們措左。
 5:任何功能,都不可能脫離實(shí)際需求和效益高低避除。從開發(fā)難度和后臺(tái)流量成本上來說怎披,是可以實(shí)現(xiàn)的。

希望這個(gè)小demo瓶摆,可以給你一些啟發(fā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凉逛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子群井,更是在濱河造成了極大的恐慌鱼炒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昔瞧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)菩佑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門自晰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稍坯,你說我怎么就攤上這事酬荞。” “怎么了瞧哟?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵混巧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我勤揩,道長(zhǎng)咧党,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任陨亡,我火速辦了婚禮傍衡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘负蠕。我一直安慰自己蛙埂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布遮糖。 她就那樣靜靜地躺著绣的,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欲账。 梳的紋絲不亂的頭發(fā)上屡江,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音敬惦,去河邊找鬼盼理。 笑死,一個(gè)胖子當(dāng)著我的面吹牛俄删,可吹牛的內(nèi)容都是我干的宏怔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼畴椰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼臊诊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斜脂,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤抓艳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后帚戳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玷或,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡儡首,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偏友。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔬胯。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖位他,靈堂內(nèi)的尸體忽然破棺而出氛濒,到底是詐尸還是另有隱情,我是刑警寧澤鹅髓,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布舞竿,位于F島的核電站,受9級(jí)特大地震影響窿冯,放射性物質(zhì)發(fā)生泄漏骗奖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一靡菇、第九天 我趴在偏房一處隱蔽的房頂上張望重归。 院中可真熱鬧,春花似錦厦凤、人聲如沸鼻吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)椎木。三九已至,卻和暖如春博烂,著一層夾襖步出監(jiān)牢的瞬間香椎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工禽篱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畜伐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓躺率,卻偏偏與公主長(zhǎng)得像玛界,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悼吱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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