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