先說結論
開啟影片轉 GIF,把片子丟進去,標出你要的那幾秒,寬度保持 480,幀率保持每秒 12 幀。多數 GIF 要的就是這一檔。出來的檔案要是太大,別的先別動,先把寬度降下來,那是唯一一個能省兩遍的設定。
這一頁剩下的部分解釋為什麼,因為「我的 GIF 有 14 MB」才是所有人真正遇到的問題,而該擰哪個旋鈕,並不顯然。
影片做成 GIF 為什麼這麼大
影片編碼存的是運動。它每隔一兩秒寫一張完整畫面,中間的每一幀則只寫這張畫面是怎麼動的:這塊畫素往左挪了四格、這片區域暗了一點。一段五秒的片子可以只有幾百 KB,因為裡面大半是關於一張你手上已經有的畫面的指令。
GIF 一樣都沒有。它 1989 年就定稿了,那時候這些東西一個都還不存在。每一幀都是一張畫面,各自單獨壓縮,用的還是一套為電子表格截圖設計的方案。這個格式裡沒有任何運動估計,也沒法給它補上。
所以該有的心理預期是影片體積的十倍,哪個轉換器都勸不動這一點。好的轉換器能做的,是不在這十倍之上再浪費什麼,並且把真正決定大小的那三個設定交到你手上。
三個設定,各自的代價
一張 GIF 的大小歸根到底就是它一共裝了多少畫素,也就是時長乘幀率乘單幀面積。
- 段落長度,線性。長一倍就是幀數多一倍,檔案大約也大一倍。這一條多數人本來就懂,而且值得狠一點:一個三秒就把話說完的 GIF,既更小,也更好。
- 寬度,平方級。寬度砍一半,高度跟著砍一半,於是畫素只剩四分之一。從 640 降到 320,省下的不是差不多一半,而是大約四分之三。這個設定沒人第一個想到,回報卻最高。
- 幀率,線性。每秒十幀是十五幀的三分之二大。它也是損失最顯眼的那個設定,因為動得太慢會被讀成「壞了」,而不是「小」。
舉個實際的例子。一段六秒的手機片子,按它自己的 1080×1920、30 fps 來,就是 180 幀、每幀兩百萬畫素,合計約三億五千萬個畫素,那不叫 GIF,那叫人質事件。同樣這六秒,寬 480、12 fps,就是 72 幀、每幀四十萬畫素,三千萬,大約十二分之一,而它看上去正是人們說「GIF」時想的那個東西。
幀率該選幾
這裡預設十二,而它出乎意料地經常就是正確答案。手繪動畫用了一個世紀的就是這個幀率:快到眼睛讀得出連貫的運動,慢到你不必為誰也看不見的那些幀掏錢。
- 5 到 8,投影片的感覺。慢速搖鏡、或者沒什麼快動作的螢幕錄影,用它沒問題。
- 10 到 15,正常。讀得出是在動。幾乎每一個值得做的 GIF 都落在這一段。
- 20 到 25,順滑,體積大約是 12 幀的兩倍,換來的差別多數觀眾說不上來。快動作、體育片段、帶甩鏡的東西,值這個價。
有一道硬頂你不妨知道:GIF 用百分之一秒為單位存每一幀停留多久,而所有瀏覽器都把小於兩個單位的延遲當成十來處理。所以每秒 50 幀才是真正的上限,一個要求 100 fps 的檔案,會一聲不吭地按 10 fps 播。給你 60 fps 選項的轉換器,要麼無視了這條,要麼正準備給你一個意外。
256 種顏色,以及抖動是做什麼的
這個格式的年紀還體現在另一半上:一張 GIF 帶一張最多 256 色的顏色表,每個畫素都是指向表裡某一項的編號。而一幀影片畫面能有一千六百萬種顏色。絕大部分都得扔掉,而怎麼扔,基本決定了這張 GIF 長什麼樣。
好的轉換器會數一遍你這段片子裡的顏色,挑 256 個合適的,而不是用一套固定顏色。拍森林的就給 256 種綠,拍落日的就給 256 種橙。這裡的工具就是這麼做的,而且是把這一段裡每一幀都數過,不只是第一幀,所以一個只在結尾出現的顏色也佔得上位置。
抖動處理的是「你要的那個顏色還是沒有」的情況。它不把整片區域四捨五入到最接近的可用顏色,那樣一片平滑的天空會變成四道平色、中間還有看得見的臺階;它把最接近的兩種顏色按細密的圖案交替排布,在正常觀看距離下,你的眼睛會把它們混成那個並不存在的顏色。
- 照片類就開著:天空、皮膚、漸變、陰影、影片畫面。
- 平色類就關掉:螢幕錄影、線稿、logo、卡通,以及任何有大片同色區域的東西。那裡沒有漸變需要保護,關掉之後檔案更小也更乾淨。
要是你會拿幾個轉換器作比較,有個細節值得知道。最容易想到的抖動做法是誤差擴散,多數影像編輯軟體用的就是它,它讓每個畫素的結果取決於周圍的畫素。放在動畫裡,就意味著一塊根本沒在動的背景,在每一幀裡抖出來的花樣都不一樣,於是它明顯地在爬,而且每一幀都得完整存下來,因為技術上每個畫素都變了。另一種叫有序抖動,只取決於畫素在哪個位置,所以靜止的背景穩穩當當。這個工具用的是後者,所以它的檔案既更安靜,也更小。
什麼時候乾脆別做 GIF
這一問值得提,因為老實的答案常常是「別做」。一段無聲循環的 MP4 或者 WebM,體積大約是同樣動畫做成 GIF 的十分之一,播放效果一樣,而且你上傳之後,每個社交平臺反正都會把你的 GIF 轉成它。
只有目的地確實需要 GIF 時才留著它:
- 只收圖片的地方,很多聊天、論壇、維基和郵件軟體都是;
- README 或者文件頁,GIF 在那裡能內嵌播放,影片則要一個播放器;
- 要在離線狀態下繼續動的投影片或者文件;
- 表情、貼紙、反應圖,小到上面那些體積算術根本不成問題。
聲音要緊的話,這個問題自己就回答了:GIF 從來沒有音訊,將來也不會有。那就別轉,去剪影片,影片剪輯能從裡面取出一段,而且一幀都不重編。
怎麼壓到人家的上限之下
多數人之所以要調 GIF,就是因為收它的那一端有個上限。按咬人的狠勁大致排一排:
- 郵件,整封信 10 到 25 MB,而接近這個數的附件,中途總有個環節會把它剝掉或者退回來。留足餘量。
- 聊天和論壇,常見 8 到 10 MB,要是走內嵌預覽而不是下載,有時候還少得多。
- GitHub 的 README,單檔案 10 MB,而超過兩三 MB,手機上開啟就會覺得這頁壞了。
- 貼紙和表情的位置,常常只有幾百 KB,這意味著要的是小寬度和短段落,不是低幀率。
超了之後該試的順序是:先縮短段落,再把寬度砍一半,然後降幀率,最後關掉抖動。前兩條加起來,比後兩條加起來管用得多。
這些事一樣都不用上傳
把影片轉成 GIF,無非是解碼、縮放、數顏色、壓縮這四件事,而瀏覽器自己做這四件已經做了很多年。頂上鍊接的那個工具全都在你的機器上做:檔案從你的硬碟上讀,畫面幀由你的瀏覽器解碼,GIF 在記憶體裡拼好,交給你的下載。
這件事在這裡比在別處更值得在意。人們拿來做 GIF 的片子都很私人:家庭錄影裡的一個瞬間、工作上某個東西的螢幕錄影、一通通話裡的幾秒鐘。一個要求把這些傳上去的轉換器,是在向你要一份副本,而如今,已經沒有哪條技術理由值得你答應了。