影片壓縮器是一種工具,會將影片檔重新編碼,使其佔用更少的位元組,通常透過降低解析度、幀率或位元率,同時保持視覺內容可辨識。壓縮過程透過編解碼器(codec,為 coder/decoder 的縮寫)來完成,它是一種演算法,決定每一幀像素如何被描述並儲存於磁碟上。不同的編解碼器以不同的方式描述幀:有些幾乎保留所有資訊(視覺上無損),有些則丟棄人眼不太可能注意到的細節(感知有損),有些則為了達到目標檔案大小而積極地捨棄資料。影片壓縮器將這些編解碼器的工作包裝在一個簡單的介面中:你提供來源檔案,它會產生一個較小或編碼方式不同的輸出檔,然後你可以下載結果。因此,「壓縮影片」的實際意義並非單一的神奇步驟,而是一連串在檔案大小、影像保真度、動作流暢度,以及與稍後需要播放該檔案的裝置之間的刻意取捨。任何壓縮器中的每個預設值、滑桿和「品質」標籤實際上都在協商這些取捨,這也說明了為何兩部不同的壓縮器在接收相同輸入時,常會產生不同的輸出。

「壓縮影片」實際上會改變檔案內部的什麼
當壓縮器重新編寫影片時,它並非僅僅將原始位元組壓縮起來。它會將來源檔的每一幀解碼為原始像素,然後讓新的編碼器依照選定編解碼器的規則重新描述這些像素。三個數字決定了大部分的檔案大小變化。
解析度是每一幀以像素計算的寬度與高度。像素越少,每幀的資料量就越少;在相同的長寬比下,1920 像素寬的幀所含像素數約為 640 像素寬的幀的九倍。幀率是每秒儲存的幀數。在相同長度下,24 fps 的輸出幀數比 30 fps 的輸出少 20%。位元率是編碼器每秒鐘允許使用的位元數。較低的位元率意味著每幀可用於細節的預算較少,這迫使編解碼器僅保留其演算法認為觀眾會注意到的部分。
壓縮器可以同時縮減這三項,也可以只縮減其中一項。它也可以變更編解碼器本身——例如,將已經很精簡的 H.264 來源重新編碼為 WebM 容器中的 VP9。你在磁碟上看到的位元組,就是編碼器針對每秒畫面所決定的組合,這也就是為何相同的來源透過不同的工具會產生差異極大的輸出檔案大小。
影片壓縮器如何處理這項任務
影片壓縮器可在不上傳的情況下,將一個瀏覽器可解碼的影片重新編碼為 WebM 檔案。你選擇一個檔案,挑選一個預設值,然後開始壓縮。該頁面會在本機播放來源,將每個顯示出來的幀繪製到一個有邊界範圍的 Canvas 上,並使用目前瀏覽器提供的 WebM 編解碼器錄製該 Canvas 串流。當來源結束時,工具會回報輸出尺寸、輸入與輸出的位元組數,以及測量出的百分比變化,然後提供下載產生的檔案。
其中有趣的部分在於支撐這項功能的一連串瀏覽器技術。HTMLCanvasElement.captureStream() 會將渲染後的 Canvas 轉為 MediaStream,而 MediaRecorder 介面則將該串流錄製為 Blob。這兩種行為皆於 W3C 的 MediaStream Recording 規範中標準化,並記載於 MDN 的 MediaRecorder 參考頁面。該工具的工作在於讓 Canvas 輸出維持在預設值所定義的限制範圍內,使編碼後的檔案符合其啟發式演算法所預測的大小。
此處「在本機執行」的實際意義在於:解碼、Canvas 繪製、MediaRecorder 編碼與下載全都發生在目前的瀏覽器分頁中。來源檔從不離開裝置,這正是本機壓縮器與伺服器型壓縮器之間的實際差異。
三種預設值及其各自目標
這三種預設值是透明的產品選擇,而非對某個通用最佳值的宣稱。每個預設值皆會限制輸出寬度、設定目標幀率,並提供編碼器一個每像素位元預算,由啟發式演算法再箝制為最終介於 180 kbps 至 8 Mbps 之間的影片位元率。三者皆保留來源長寬比、永不放大來源,並將輸出尺寸向下取整為偶數像素值,以獲得更廣泛的編解碼器相容性。
| 預設值 | 最大寬度(像素) | 目標幀率 | 偏好取向 |
|---|---|---|---|
| 小型 | 640 | 24 fps | 最低位元組數,最易透過電子郵件或聊天軟體傳送 |
| 平衡 | 1280 | 30 fps | 中等大小的輸出,在多數螢幕上仍看起來合理 |
| 品質 | 1920 | 30 fps | 較高的細節與更流暢的動作,位元組數較大 |
執行結束後你實際看到的輸出尺寸,是預設值在套用來源長寬比並向下取整為偶數像素後所產生的結果,未必等於表格中的最大寬度。一段直向 9:16 的影片若由 Balanced 上限 1280 像素寬,輸出將為寬 1280、高 2274(經取整後),而一段 3840 像素寬的來源在 Quality 下會被縮放為 1920 像素寬。
使用影片壓縮器壓縮影片
- 選擇一個瀏覽器可解碼、檔案大小不超過 500 MiB、長度不超過五分鐘或解析度不超過 3840 × 2160 像素的影片。頁面會在你繼續之前驗證檔案的副檔名或 MIME 型別、位元組大小、解碼後的長度以及幀尺寸。
- 選擇小型、平衡或品質,然後開始壓縮。在來源以即時速度播放時,請保持分頁開啟——編碼以播放速度執行,因為 MediaRecorder 是在來源播放的同時觀察 Canvas 串流,因此一段兩分鐘的來源大約需要兩分鐘。
- 檢視實際尺寸與位元組變化,下載 WebM 檔,並在刪除原始檔之前完整播放一次。所回報的百分比僅根據兩個實際 Blob 大小計算,因此正負號具有意義。
為何輸出有時可能比輸入還大
壓縮結果取決於內容。低動作的動畫可能會大幅縮小;而嘈雜的影片、雜訊、攝影機晃動、快速變化的細節,或本身已經很有效率的來源,皆可能產生大小相近甚至更大的檔案。該工具會回報實際位元組數,絕不會將較大的檔案標示為「縮小」。
這點值得仔細閱讀,因為它與對壓縮器的常見假設相矛盾。許多使用者預期「壓縮」一詞能保證磁碟上的數字變小,而部分線上工具會默默地縮放、裁切或重新取樣影片,直到該保證成立。影片壓縮器並不會這樣做。它顯示真實的位元組數與兩者之間帶正負號的百分比變化,因此螢幕上的數字就是你自己可以測量出的數字。如需更深入了解頁面實際回報的內容,請參閱 影片壓縮器的準確度:它實際回報了什麼。
若某個預設值產生的檔案你不想保留,正確的做法是嘗試其他預設值或不同的來源,而非相信按鈕上的標籤。一段嘈雜的手機錄影在品質預設下可能比來源還大,而同一段錄影在小型預設下則常常能大幅縮小。
限制、錯誤以及工具不會保留的項目
輸入限制為 500 MiB、五分鐘、任一邊不超過 4096 像素,以及解碼後區域不超過 3840 × 2160 像素。檔案可命名為 MP4、WebM、MOV、M4V 或 Ogg,但能否成功解碼仍取決於目前瀏覽器中安裝的編解碼器——有效的副檔名無法讓不支援的編解碼器變得可解碼。
當工具無法履行其承諾時,它會明確地失敗,而非產出一個有問題的檔案。無效的檔案、不支援的解碼器、超過上限的長度、超過上限的幀、缺少 Canvas 串流,或 WebM 錄製器無法使用,皆會產生錯誤且不提供下載。選擇新檔案、更換預設值、取消操作或離開頁面,皆會使目前的工作失效,並釋放暫時性的 Object URL。
此外,該工具有幾項它不會做的事:
- 不會保留字幕、章節、附件、旋轉標記、色彩中繼資料或 HDR 訊號。
- 不會依據任何經認證的標準來標準化音量、混音音軌或移除中繼資料。
- 不會修復損壞的媒體,也無法保證跨平台輸出的確定性——錄製器會依目前瀏覽器回報的支援情況,依序嘗試 VP9、VP8,再嘗試通用的 WebM,因此相同的預設值與來源在 Chrome 與 Firefox 中可能會產生不同的位元組數。
- 不會輸出 MP4。WebM 是唯一的輸出容器,因為 MediaRecorder 對瀏覽器產生 MP4 的支援仍不一致。
- 除非瀏覽器透過 HTMLMediaElement captureStream 公開可擷取的音軌,否則不會包含音訊。下載的檔案應一律從頭到尾播放一遍,以同時驗證影像與聲音。
何時該選擇桌面編碼器
若是為了封存母帶、專業交付規格、精確的編解碼器設定檔、兩段式速率控制、固定關鍵幀間隔、字幕保留,或確定性的跨平台輸出,請使用受維護的桌面編碼器,例如搭配審核過指令的 FFmpeg。當便利性與隱私比編碼器的確定性更重要時,瀏覽器工具是合適的選擇;當輸出必須逐位元組符合精確規格時,桌面工具才是合適的選擇。
這兩種做法並非競爭關係——它們位於同一條取捨曲線上的不同位置。一個實用的原則:當你需要今天就把影片傳給別人時,影片壓縮器是更快的答案。當你需要為封存或播出製作母帶時,請拿起 FFmpeg。
若你正在權衡各種選項,在 iPhone 上使用影片壓縮器:於 Safari 中壓縮 對此有詳細說明。