當重新編碼器以某個位元速率、編解碼器和容器寫入全新串流,而非僅僅重新封裝來源位元組時,壓縮後的輸出可能會超過來源大小。即使是使用 VP9 在 WebM 中重新編碼的影片壓縮器,也必須遵守最低品質底線、在畫面之間分配位元,並決定每秒要保留多少畫面,因此它所寫入的位元組很容易超過原本就很有效率的來源所使用的數量。Lizely 的本地影片壓縮器會在每次執行後回報實際的輸入位元組與輸出位元組,以及一個帶正負號的百分比變化,因此較大的結果會在結果面板中誠實顯示,而不是被重新標示為縮減。像是底片顆粒、攝影機晃動、快速變動的細節、火花、流動的水,或是已經被其他編碼器緊密編碼的來源,可能會擊敗該工具用來挑選目標位元速率的「每像素位元」啟發式,因此同一個預設值可能會在某一段影片上輸出小於來源的檔案,卻在另一段影片上輸出大於來源的檔案。

why can the output be larger when i use video compression
為什麼使用影片壓縮時輸出會變大

為什麼重新編碼會超過來源大小

每個現代影片壓縮器實際上都是一個重新編碼器:它解碼來源、將其繪製到工作緩衝區中,並要求編解碼器產生全新的位元組串流。輸出的位元組取決於編碼器所選擇的位元速率、畫面速率、解析度、編解碼器設定檔和容器,而不是您提供給它的檔案位元組數。如果您的來源已經使用了有效率的編解碼器並設定在低位元速率,而新的編碼器決定使用不同的預設位元速率底線,則輸出可能會高於來源原本的位置,即使解析度已經降低。

瀏覽器端的重新編碼比桌面工具受到更多限制。網頁無法執行兩次掃描、無法鎖定關鍵畫面距離,也無法符合任意的編解碼器設定檔。它會向當前瀏覽器的 MediaRecorder 要求一個 VP9、再來 VP8、再來通用的 WebM 串流,並讓瀏覽器挑選內部參數。編碼器仍然必須保留足夠的每像素位元以避免明顯破壞畫面,而這個底線往往就是造成在來源資料夾中看起來很小的影片,在誠實的「結果變大了」報告中出現的原因。

強制產生較大輸出的內容特性

壓縮並非僅僅是解析度的函數。編碼器會把位元花在三件事上:畫面之間的動態、每個畫面中的殘留細節,以及編解碼器無法與紋理區分的雜訊。含有大量底片顆粒的影片、逐畫面晃動的手持拍攝、快速剪輯、火花、水、風中的樹葉,或是充滿微小游標與文字動態的螢幕錄影,即使在 640 像素寬的情況下,也會讓編碼器的位元速率居高不下。相反地,一個顏色平坦的乾淨動畫解說影片,則可以壓縮成原始大小的一小部分。

第二個原因是來源編解碼器。手機以 4K HEVC 匯出的 MP4 在每像素位元上可能已經很精簡。當要求 WebM 編碼器處理同樣的內容時,它可能會以比 HEVC 串流更高的每像素位元為目標,特別是在網頁的啟發式是針對典型高雜訊影片進行調整時更是如此。結果面板中回報的帶正負號的百分比變化,反映的是編碼器實際寫入的內容,即使在解析度明顯下降之後,輸出仍可能大於來源。

第三個因素是位元速率上限。本地工具會將要求的影片位元速率限制在 180 kbps 到 8 Mbps 之間,因此啟發式落在該範圍上緣附近的影片所產生的輸出,至少會等於上限乘以持續時間,無論來源多麼精簡。

影片壓縮器如何告訴您真實的結果

本地的 Video Compressor 並不會宣稱保證的百分比縮減。在網頁停止錄製後,它會回報實際的輸入位元組、實際的輸出位元組,以及一個僅由這兩個值計算出來的帶正負號的百分比變化。如果輸出較大,數字就是正的,表示大小增加;網頁永遠不會將增長重新標示為縮減。結果面板也會回報輸出尺寸,讓您能夠確認預設值並未在背後偷偷將來源放大。

輸出尺寸是第二個誠實的信號。三個選項分別將寬度上限設為 640、1280 和 1920 像素,並且絕不會放大來源。因此,如果您提供一個 1280×720 的影片給工具使用 Balanced 預設值,卻在報告中看到輸出尺寸為 1280×720,這表示編碼器將解析度保持不變,卻仍然產生了比來源更大的串流。光是位元速率底線,就足以在一部短而有效的來源上造成這種情況。若需要以有結構的方式在刪除原始檔之前檢查檔案,可參考 使用影片壓縮後要檢查什麼 指南,其中更詳細地說明了同樣的檢查項目。

使用 Video Compressor 驗證為何輸出變大

要確切了解執行結果為何變大,最快的方法是讓相同的來源通過每個預設值並比較位元組。該工具在當前分頁中一次處理一段影片,因此比較是在本地進行,來源也永遠不會離開您的裝置。

  1. 挑選瀏覽器可解碼、不超過 500 MiB、5 分鐘或 3840 × 2160 像素的影片。如果您的影片更長或更大,請先修剪或裁剪,以便網頁能完整解碼。
  2. 選擇 Small 預設值(640 像素寬、24 fps)並開始壓縮。在來源以即時速度播放時保持分頁開啟;編碼以播放速度進行。
  3. 當結果面板出現時,記下輸入位元組、輸出位元組、帶正負號的百分比變化,以及輸出尺寸。
  4. 再次選擇同一個檔案,切換到 Balanced(1280 px、30 fps),並開始第二次執行。記下新的數字。
  5. 使用 Quality(1920 px、30 fps)重複同樣步驟。現在您就有了同一來 source 的三組誠實測量結果。
  6. 將三個百分比與解析度和 fps 欄位進行比較。在較低解析度下檔案大小卻增加的執行結果,確認了驅動位元速率的是內容而非尺寸。
  7. 下載每次執行的 WebM、從頭到尾完整播放檔案,並在確認影像、聲音、持續時間和大小符合您目的地的要求後,才刪除來源。

如果三次執行的結果都大於來源,則該影片不適合用通用的重新編碼來處理,可以透過修剪、裁剪或使用具備兩次掃描控制的桌面工具來獲得改善。如果 Small 執行結果較小但 Balanced 變大,則表示啟發式落在了較雜訊、較大畫面的位元速率上限附近;對該影片來說,選擇 Small 就是正確的做法。

預設值的限制與各預設值容易使輸出變大的情況

三個預設值是透明的產品選擇,並非通用的最佳解。每個預設值都有硬性的解析度上限、目標畫面速率,以及同樣的 180 kbps 到 8 Mbps 位元速率範圍;實際上不同之處在於挑選實際位元速率的「每像素位元」啟發式。

預設值最大寬度目標 fps輸出超過來源的常見原因
Small640 px24接近 180 kbps 的位元速率底線,仍然超過短而已經有效率的影片的來源位元速率。
Balanced1280 px30由於影片含有大量顆粒、晃動或快速變動的細節,啟發式選擇了接近 8 Mbps 上限的位元速率。
Quality1920 px30來源已經是 1080p 且經過緊密編碼;由於解析度實際上並未降低,啟發式仍將位元速率維持在高檔。

輸出尺寸會向下取整為偶數像素值,以保持串流與解碼器的廣泛相容性,且網頁永遠不會放大來源,因此在 Quality 預設下,1280×720 的來源會回報 1280×720 的輸出。每個預設值都會保留來源的長寬比。

當輸出變大代表您需要不同的工作流程

輸出變大代表該工具在告訴您,僅靠重新編碼無法將該影片縮減到比來源更小。第一個可以嘗試的工作流程變更,是將影片修剪到您真正需要的那部分,因為持續時間會直接乘入位元組總數。第二個是裁剪掉黑邊或不需要以全幅編碼的固定背景。第三個是選擇目標解析度遠低於來源的預設值,讓「每像素位元」啟發式真正有更少的像素可以分配位元。至於歸檔母片、專業交付規格、嚴格的編解碼器設定檔、兩次掃描速率控制、固定關鍵畫面間隔、字幕保留,或確定性的跨平台輸出,正確的工具是經過維護的桌面編碼器,例如搭配審慎指令使用的 FFmpeg,而不是任何瀏覽器端的重新編碼器。

相關閱讀:音訊、字幕、元資料:影片壓縮保留了什麼。