我們如何將視訊編碼速度提高八倍

我們如何將視訊編碼速度提高八倍

每天都有數百萬觀眾在網路上觀看影片。但要使影片可用,不僅必須將其上傳到伺服器,還必須對其進行處理。這種情況發生得越快,對服務及其使用者就越好。

我叫 Askar Kamalov,一年前我加入了 Yandex 視訊技術團隊。今天,我將向 Habr 讀者簡要介紹我們如何透過並行化編碼過程來顯著加快向用戶傳送影片的速度。

這篇文章主要是那些以前沒有考慮過視頻服務背後發生的事情的人感興趣的。在評論中,您可以提出問題並建議未來帖子的主題。

關於任務本身的幾句話。 Yandex 不僅可以幫助您搜尋其他網站上的視頻,還可以為自己的服務儲存視頻。無論是原創節目還是直播的體育比賽、KinoPoisk 上的電影還是 Zen 和 News 上的視訊 - 所有這些都會上傳到我們的伺服器。為了讓用戶觀看視頻,需要做好準備:轉換為所需的格式、創建預覽、甚至透過技術運行 深度高清。未準備好的文件只會佔用空間。此外,我們談論的不僅是硬體的最佳使用,還包括向用戶交付內容的速度。範例:可以在比賽結束後一分鐘內搜尋曲棍球比賽決定性時刻的記錄。

順序編碼

因此,用戶的幸福感在很大程度上取決於影片可用的速度。而這主要是由轉碼速度決定的。當對影片上傳速度沒有嚴格要求時,那麼就沒有問題。您取得一個不可分割的文件,對其進行轉換並上傳。在我們的旅程開始時,我們是這樣工作的:

我們如何將視訊編碼速度提高八倍

客戶端將影片上傳到存儲,Analyzer元件收集元資訊並將影片傳輸到Worker元件進行轉換。所有階段均依序執行。在這種情況下,可以有許多編碼伺服器,但只有一個忙於處理特定視訊。簡單、透明的圖表。這就是它的優點所在。該方案只能垂直擴展(由於購買了更強大的伺服器)。

具有中間結果的順序編碼

為了以某種方式緩解痛苦的等待,業界提出了快速編碼選項。這個名稱具有誤導性,因為事實上,完整的編碼是按順序發生的,並且需要同樣長的時間。但有一個中間結果。這個想法是這樣的:盡快準備並發布影片的低解析度版本,然後才發布更高解析度的版本。

一方面,影片變得更快。它對於重要事件很有用。但另一方面,影像變得模糊,這讓觀眾感到惱火。

事實證明,您不僅需要快速處理視頻,還需要保持其品質。這就是用戶現在對視訊服務的期望。購買最高效的伺服器(並定期一次全部升級)似乎就足夠了。但這是一個死胡同,因為總有一個視頻會讓即使是最強大的硬體變慢。

平行編碼

將一個複雜的問題分成許多不太複雜的問題並在不同的伺服器上並行解決它們會更有效。這是用於影片的 MapReduce。在這種情況下,我們不受一台伺服器效能的限制,並且可以水平擴展(透過添加新機器)。

順便說一句,將影片分割成小塊,並行處理它們並將它們粘合在一起的想法並不是什麼秘密。您可以找到許多對此方法的參考(例如,在 Habré 上,我推薦了一篇關於該專案的帖子 分散式VIDc)。但這並沒有讓事情變得更容易,因為你不能直接採用現成的解決方案並將其建置到你的家中。我們需要適應我們的基礎設施、視訊甚至負載。一般來說,自己寫會比較容易。

因此,在新架構中,我們將順序編碼的單體Worker區塊劃分為微服務Segmenter、Tcoder、Combiner。

我們如何將視訊編碼速度提高八倍

  1. 分段器將影片分成大約 10 秒的片段。片段由一個或多個 GOP 組成(一組圖片)。每個 GOP 都是獨立的並單獨編碼,因此可以在不參考其他 GOP 的幀的情況下對其進行解碼。也就是說,片段可以彼此獨立播放。這種分片減少了延遲,從而可以更早開始處理。
  2. Tcoder 處理每個片段。它從隊列中獲取一個任務,從存儲中下載一個片段,將其編碼為不同的分辨率(請記住,玩家可以根據連接速度選擇版本),然後將結果放回存儲中並將片段標記為已處理在資料庫中。處理完所有片段後,Tcoder 發送任務以產生下一個元件的結果。
  3. Combiner將結果收集在一起:下載Tcoder製作的所有片段,產生不同解析度的串流。

關於聲音的幾句話。最受歡迎的 AAC 音訊編解碼器有一個令人不快的功能。如果您單獨對片段進行編碼,那麼您根本無法將它們無縫地粘合在一起。過渡將會很明顯。視訊編解碼器不存在這個問題。理論上,您可以尋找複雜的技術解決方案,但這款遊戲根本得不償失(音訊的重量明顯小於影片)。因此,只有視訊被並行編碼,而整個音軌被處理。

Результаты

借助平行視訊處理,我們顯著減少了視訊上傳給我們和供用戶使用之間的延遲。例如,以前可能需要兩個小時才能為一部時長一個半小時​​的全高清電影創建多個不同品質的完整版本。現在這一切只需要15分鐘。此外,透過並行處理,我們創建高解析度版本的速度甚至比使用舊的中間結果方法創建低解析度版本的速度還要快。

還有一件事。使用舊方法,要么沒有足夠的伺服器,要么沒有任務而閒置。並行編碼可以增加鐵回收的份額。現在我們的叢集有一千多台伺服器,總是忙著處理一些事情。

事實上,仍有改進的空間。例如,如果我們在影片完整到達之前開始處理影片片段,就可以節省大量時間。正如他們所說,還會有更多。

在評論中寫下您想閱讀的影片處理領域的哪些任務。

行業同事經驗的有用鏈接

來源: www.habr.com

添加評論