歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~性能優化
做者:常青, 2008 年畢業加入騰訊,一直從事客戶端研發相關工做,前後參與過 PC QQ、手機QQ、QQ物聯 等產品項目,目前在騰訊視頻雲團隊負責音視頻終端解決方案的優化和落地工做,幫助客戶在可控的研發成本投入之下,得到業內一流的音視頻解決方案,目前咱們的產品線包括:互動直播、點播、短視頻、實時視頻通話,圖像處理,AI 等等。微信
在 AlphaGo 名聲大噪以前,圍棋是一項少有人問津的娛樂項目,不信你能夠在記憶裏細數一下,當時身邊有多少個朋友會下圍棋(AlphaGo 出名後一時興起下兩把的我們就不算數了)。相比之下,德州撲克的普及程度就要好的多,以致於咱們團隊有一次年會就放棄傳統抽獎方式,而是靠德州撲克決定獎品名單的。編輯器
爲何高大上的圍棋比不上德州撲克受歡迎呢?規則太複雜嗎?工具
真正的緣由是圍棋的門檻過高了。在圍棋裏,水平的高低說帶來勝率差別是碾壓式的。對於兩個圍棋選手而言,若是棋藝差一級,那麼對弈時弱者幾乎沒有贏的可能。這就讓圍棋變成了一羣高智商玩家的小圈子游戲,剛入門的進來感受就是找虐。而德州撲克則不是,無論你是否是行家,運氣的成分總仍是起了很大的做用,這就讓它自己適合成爲一款全部人都容易接受的遊戲。性能
視頻編輯也是如此,在電腦可以處理多媒體工做以後不久,就出現了不少的視頻編輯軟件。好比我過年回家,就能在長輩的書架上看到一本《會聲會影 從入門到精通》。長輩退休了在家搞搞攝影,想要給本身拍的照片和視頻加點特效或者作個剪輯,就會用到這類專業軟件。我隨手翻了幾頁,很快就沒興趣了,裏面太多流程化的操做,須要我花很多的時間去研究和練習,而我缺少學習這款軟件的動力。學習
因而可知,入門門檻的高低,決定了一項活動或是一款產品,是被大衆所廣泛接受,仍是停留在一個很小的專業圈子裏。優化
就在不久以前,視頻編輯仍是一個小圈子的活動,縱使不少人有興趣創做本身的小視頻,在專業工具的入門門檻面前,也就選擇洗洗睡了。直到快手和抖音的出現,讓你們的入門門檻一會兒變低了,你只要會用手機,就能快速的給本身拍的視頻加一些特效,作一些個性化的編輯,進而引爆了「北快手,南抖音」這兩款現象級的 APP。動畫
但我想告訴您的是,從會聲會影式的專業軟件到普羅大衆的快手抖音,毫不是交互層面的一個簡單調整,而是一個複雜的故事。今天,我就帶您一塊兒來看一看,這背後的技術故事。ui
下圖簡單的展現了視頻編輯的一個大致流程,這在全部的視頻編輯軟件裏都是相似的:編碼
第一個須要瞭解的細節是,手機上的影片(好比 mp4 或者 mov) 都是不能直接拿來作特效編輯的,由於裏面的數據都是通過壓縮的。直接編輯這些編碼後的影片是很困難的,咱們在不解碼影片文件的狀況下,最多也就是作一下簡單的裁剪和拼接。
舉個現實生活中的例子,好比說你剛搬了新家,帶着你的愛人去宜家挑選傢俱,宜家的服務很人性化,他們會在你進門的時候會給你一張卡片和一支鉛筆,這樣你就能夠把想買的傢俱或則配件的編號記錄下來,以後你能夠去倉庫一件件的取貨,或者去辦理送貨上門服務。這一切都很方便,直到買單時你發現預算超了,因而決定要把一些比較貴的型號換成比較便宜的型號。但這個時候困難也出現了,由於只有編號你是作不到的,你得回到展現區按商品編號對號入座,而後才能知道有沒有心儀的便宜款商品可選。不然你能作的也就只有從商品列表裏把一些型號劃掉。
視頻編輯也是同樣,已經通過編碼的影片,再不通過解碼的狀況下,即便計算機也沒法解讀文件裏蘊含的畫面和聲音,咱們所能作得事情就頗有限。這也就解釋了上圖複雜性的由來:
要作音視頻的特效編輯,原始的影片(好比 mp4 或者 mov)必須先被拆解成獨立視頻流和音頻流。以視頻流爲例,咱們要先對視頻流進行逐幀逐畫面的視頻解碼,這樣解碼出來的內容纔是一副計算機能夠顯示的畫面。在這幅畫面的基礎上,計算機才能夠理解每個像素點對應的色彩數值和亮度大小。進一步地,計算機才能夠在畫面上添加字幕,作動態特效,或者疊加掛件。聲音也是同樣,編碼後的 AAC 文件只適合傳輸和存儲,計算機也是須要先將其解碼成 PCM 格式的波形文件,才能知道每個點的音調高低,進而可以編輯。
視頻特效和聲音特效都加完以後,還不算結束,由於用戶真正想要的是編輯後的視頻影片,而不是一幅幅的畫面和一段段的聲音,因此解碼出的畫面在通過特效疊加和處理以後,還要再一次地送給視頻編碼器進行編碼,進而跟音頻流一塊兒,組合成新的視頻影片。
上述的流程看似複雜,但它只是視頻編輯的最後一步,也就是編輯器的「最終生成」的這一步,在這一步以前,必需要有人經過編輯器決定在哪一段時間加什麼類型的特效。
但沒有人能夠憑空知道在影片的第幾秒把一個什麼特效恰到好處的放置進去,用戶須要根據影片的具體內容進行即興的創做和發揮,因此,咱們須要把預覽功能做爲 P0 特性加入進去。
如上圖所示,簡單的預覽在原理上是一個徹底沒有技術難度的工做,咱們只須要將通過特效處理的畫面和聲音播放出來便可。這裏真正的難點是要優化好畫面特效的性能,同時作好音畫同步的校對。
由於影片的預覽跟單張圖片的預覽不一樣,預覽過程必須是一個很流暢的體驗,不然用戶在編輯影片時就會有很明顯的卡頓感,致使用戶在使用時如骨鯁在喉,難以有好的產品體驗。
而性能優化和音畫同步也都很好解決,真正困難的是逐幀的畫面預覽,也就是用戶想要看哪一幀的效果,就能馬上如願,也就是標題裏所謂的「心隨手動」。
這裏,咱們將面對一個在技術原理上就很難逾越的困難:
雖然手機芯片的進步這兩年可謂神速,可是功耗的限制決定了 PC 機的性能依然能夠碾壓手機。但不知你有沒有發現,即便在性能這麼好的 PC 電腦上,看電影時也會遭遇「拖拽卡頓」現象,也就是當你用鼠標拖拽進度時,能明顯感受卡頓感。
這是由於簡單的視頻卡頓背後,有一個巨大的性能陷阱,也便是解碼器的解碼規則,我經過下圖來解釋一下:
假設你將鼠標從第3幅畫面拖拽到第13幅畫面,按照表面上的理解,計算機只須要讀取第13幅畫面的內容,把畫面顯示出來就好了,這並無什麼難度。
但實際上,編碼器在處理第13幅畫面的時候,爲了減小這幅畫面的存儲空間,只會保留第13幅和第12幅畫面的差別部分。這也就意味着,要想看到第13幅畫面,計算機須要先把第12幅畫面解碼出來。照此類推,要想看到第12幅畫面,計算機就須要先把第11幅畫面解碼出來...
最終,計算機須要解碼出第7幅畫面,才能將上述這個循環打破,由於第7幅畫面比較特殊,編碼器在處理這一副畫面的時候,並無參考其它畫面,因此這幅畫面的內容在還原時,不須要依賴其它畫面的內容(也正是由於如此,這幅畫面在硬盤上的存儲空間比其餘畫面都要大)。
固然,這裏說的都是最簡單的狀況,因爲技術的進步,如今廣泛使用的編碼器都已經在用 main profile 和 high profile 這種高級的編碼模式,畫面與畫面之間的參考關係更加複雜,不只僅參考前面的畫面,也會參考後續的畫面,進一步提高了複雜度和計算量。
這就解釋了爲何拖拽自己的等待時間不肯定,有時候你可能運氣好,正好拖到了上圖中的第7幅畫面,那麼如你所願,畫面馬上就切到第7幅;但也有可能,你拖拽到了第14幅畫面,那麼計算機只能認倒黴,它要把前面的7幅畫面全都解碼完成,才能切到你想要的那一幅畫面上。
爲了解決這個問題,咱們只有兩條路能夠走:
一條路是等待摩爾定律進步處處理十幾幅畫面也只需彈指一揮間的事情,但安迪比爾定理也告訴你,摩爾定律所帶來的那點進步會瞬間被 4K、8K 給吃掉。
另外一條路就是工程思惟解決問題了,咱們的作法是:若是是編輯一個已經生成好的 MP4 或者 MOV 影片,咱們會先對影片進行一輪預處理,也就是影片在送給編輯器以前,先要通過一輪提早的加工處理,把視頻處理的更加易於編輯。
固然,若是你認爲僅僅是爲了提高逐幀預覽的性能就要耗費這麼大的精力是不值得的,那實際上是多慮了。由於咱們的工程師團隊會充分利用這段新引入的時間,把不少耗時但又必需要作的事情在這個階段也完成了,好比,下面圖中的預覽工具條,就是在預處理過程當中每隔一段時間截圖拼接實現的。
咱們都知道動畫的原理自己就是一幅畫面到另外一幅畫面的快速變化,畫面之間的微小差別通過累加,令人產生畫面運動的錯覺。畫面變化的越快,人越不容易察覺,由於畫面的流暢性也就越好。
咱們在短視頻編輯器上說添加的各類特效也是遵循這兩個原則:
以咱們在Demo中提供的第三個視頻特效爲例,它是這樣實現的:
(1)取原始畫面第一幅圖像,對其作1.1倍的圖像放大,以後截取中心的部分,而後去掉 50% 的透明度,這樣就能獲得一張新的半透明圖片,這張新的半透明圖片是用來造成虛影效果的。它會被疊加在原始圖像上,這樣一來,咱們就獲得了處理後的第一幅圖像(帶虛影特效)。
(2)照此步驟,咱們對第二幅圖像也作一樣的處理,但此次稍有不一樣的是,再也不作 1.1 倍放大,此次咱們把放大倍數改爲1.2倍,這樣疊加出來的圖像,50%透明度所造成的虛化部分,就相比於上一幅就要擴大了一圈。這擴大出來的一圈若是疊加起來,就能夠製造出一種畫面向外放射的錯覺。
(3)對第三幅畫面也是相似的操做,此次咱們將放大倍數改成 1.3 倍,所以虛影部分又擴大了一圈...
(4)如此逐步作下去,處理後的圖像就會造成一組新的連續動畫,而這組新的動畫已經包含了咱們所指望的視頻特效。
相比於其餘的部分,特效自己的技術難度是比較簡單的,尤爲是視頻特效的實現。
真正的困難則是來自於定製上的靈活性,因爲抽象能力比價若,咱們目前尚未把視頻特效的製做能力開放出來供開發者自行設計,而是隻能用更直接的辦法,想到一個作一個。真正要作到客戶隨意定製,還須要一段時間的努力。
好,說了這麼多,都尚未給本身團隊的產品打廣告的,爲了不引發各位看官的不是(^—^),這個部分留在最後了:
若是您想給本身的產品快速添加短視頻功能,同時又不但願重複造輪子,請訪問 騰訊視頻雲-短視頻官網,快速獲取你想要的零部件。
此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/developer/article/1148310?fromSource=waitui
歡迎你們前往騰訊雲+社區或關注雲加社區微信公衆號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~