火山引擎:“數(shù)據(jù)驅(qū)動”視頻編輯器背后的原理
9月16日,在北京舉行的“火山引擎增長沙龍-人工智能專場” 上,火山引擎智能視頻編輯相關(guān)技術(shù)人員出席活動,詳細(xì)講解了字節(jié)跳動音視頻編輯中間件非線性編輯器的核心原理。
火山引擎認(rèn)為,對于任何一款移動端APP產(chǎn)品來說,優(yōu)質(zhì)的內(nèi)容生態(tài)都離不開優(yōu)秀的創(chuàng)作者,也離不開優(yōu)秀的工具加持。火山引擎的非線性編輯器采用了一種新型的“數(shù)據(jù)驅(qū)動模型”。與傳統(tǒng)的事件驅(qū)動范式相比,這一模型通過對五種模型的組合使用,即可實現(xiàn)各種各樣的編輯能力。
那么,在這一“新潮”的產(chǎn)品理念的背后,原理是怎樣的呢?為什么更改一些數(shù)據(jù)或模型,就可以最終影響視頻生成的效果呢?它背后的引擎是如何操作、如何與數(shù)據(jù)關(guān)聯(lián)起來的呢?
火山引擎智能視頻編輯相關(guān)技術(shù)人員在講解中表示,在編輯器中,如果將定義的模型抽象開來,可以認(rèn)為它是一棵樹,其根接點就是NLEModel,在它的字節(jié)點下面可以定義不同的Track,Track下面又可以定義不同的片段Slot,每個Slot可以定義它的資源。基于這一基礎(chǔ),再去做最終引擎的操作和數(shù)據(jù)的對應(yīng)就非常方便。
在編輯過程中,用戶對視頻編輯的每一次操作都會生成一棵新的樹,有了這棵新的樹之后,再和原始的樹做對比,就知道這個中間發(fā)生了哪些過程,最終要呈現(xiàn)給用戶的是一種什么樣的形態(tài)。
詳細(xì)來說,本來這棵樹的每個節(jié)點定義了兩個屬性,一個是name,一個是ID。name相同,ID發(fā)生了變化,說明它的屬性或者它的子節(jié)點發(fā)生了變化。舉例來說,如果拿原始的樹跟生成的新樹進(jìn)行對比,發(fā)現(xiàn)前者的NLETrack2沒有了,但多了一款NLETrack3,就可以知道,它刪掉了Track2,添加了Track3。那么,基于這些增量的信息,就可以對整個模型進(jìn)行一次增量的重演,就達(dá)到了數(shù)據(jù)和底層引擎的映射。
此外,redo/undo的實現(xiàn)是另一個關(guān)鍵操作。用戶在添加完軌道以后,每一次都會基于當(dāng)前的狀態(tài)生成一個新樹。此時這個樹處于只讀狀態(tài),當(dāng)用戶操作完之后、需要生成redo/undo記錄點時,就可以調(diào)用done的方法,編輯器就會把這棵樹包裝成NLECommit,存儲到redo/undo隊列里面。之后用戶切換不同的狀態(tài),撤銷重做這些動作實際上是切換不同的NLECommit,將其對應(yīng)的樹做一次重演就達(dá)到了恢復(fù)的狀態(tài)。
基于用戶的實際需求,火山引擎在編輯器中還對Commit和done做了分離。具體出發(fā)點很簡單,以調(diào)節(jié)濾鏡為例,用戶在一次調(diào)節(jié)中可能做了多次嘗試,最終確定了某種效果。但如果想要恢復(fù)的時候,用戶并不需要記錄中間的每一次操作,只需要知道他做了“一次”濾鏡調(diào)節(jié)的動作即可。
所以正是基于這一理解,火山引擎在redo/undo隊列里面存儲了不同的數(shù)據(jù)模型,這些數(shù)據(jù)模型可以非常方便的做序列化和反序列化存儲本地的草稿。換句話說,草稿里面已經(jīng)存儲好了它的redo/undo的功能,所以它是一個非常完整的從草稿到當(dāng)時編輯狀態(tài)的模式。這也正是火山引擎視頻編輯器的另外一個特點。
據(jù)悉,火山引擎增長沙龍邀請了火山引擎內(nèi)部技術(shù)專家,從技術(shù)、產(chǎn)品、 應(yīng)用和體驗4大維度,剖析智能互動特效和智能編輯在泛娛樂行業(yè)中的業(yè)務(wù)增長邏輯,探討泛娛樂行業(yè)增長的新引擎。未來,火山引擎還會繼續(xù)將成熟的技術(shù)探索、實踐經(jīng)驗和產(chǎn)品方法論分享給行業(yè),共創(chuàng)行業(yè)技術(shù)繁榮。