2012年7月10日 星期二

使用 ffmpeg 壓縮影片

UbuntuCompilationGuide – FFmpeg 說明如何在 Ubuntu 上安裝 ffmpeg 並包含 libx264 (支援 H.264)。全部安裝和移除的指令都有了, 超方便的。實測的結果, 用 libx264 壓出來的檔案又小畫質又好, 是必要的元件。

H.264 web video encoding tutorial with FFmpeg 一步步解釋如何用 ffmpeg + H.264 來壓縮, 並解釋各項參數的意思。雖然 man page 都有說明, 但是實在是太~~長了。先從別人的文章找到關鍵的參數, 有必要時再回頭查, 輕鬆許多。

我最後用的指令如下:

$ ffmpeg -i INPUT.MOV -vcodec libx264 -b:v 3000k -r 25 -vf "transpose=1" -threads 0 -acodec copy -y OUTPUT.mp4

參數位置有影響

下錯的話 ffmpeg 不會有抱怨, 然後參數也無效。有時則是抱怨奇怪的訊息, 因此被誤導。這點讓我卡了最久。上篇文章作者建議的順序是:

ffmpeg [input options] -i [input filename] -vcodec [video options] -acodec

用原本的 audio codec 避免爆音

原本壓完有出現爆音, 改用 -acodec copy 就正常了。反正最主要的壓縮來自 bitrate, 這樣做沒什麼損失。

壓縮率主要最決於 bitrate (bits/s)

作者特別強調畫面大小不會影響檔案大小, 我也就沒試了。基本上就是調整 -b:v, 從參數和影片長度即可推論出最後大概的大小。2000k 畫質就很不錯了。

注意 FPS

不知為什麼我上回用 iPhone 拍的影片 fps 正常, 這回拍的 tbr 變成 600, 上回是 24。結果壓縮的時候, 顯示的 fps 變 90 多, 最後壓出來的影片雖然不大, 播放卻超級頓。從 ffmpeg -i INPUT.MOV 來看, fps 應該是 25 左右, 加上 -r 25 重壓就可以順暢播放了。

旋轉畫面90度

用 iPhone 直拍的話, 在桌機上播畫面會歪一邊, 可加上 -vf "transpose=1" 將它轉回來。視當初拍的角度, 參數要換不同值, 細節見 man ffmpeg 的 transpose 那節。

用多個 thread 加速壓縮速度

-threads 0 表示盡可能壓榨 CPU, 加這個參數後, 壓得超快的。

其它

  • 若改用 2-pass 效果可以更好 (待試)
  • 設定 buffer size 等參數可以讓較差的裝置播得順 (待試)

若要說出社會工作幾年後的最大改變, 就是我快變成 100% 需求驅動的學習方式了, 沒需求的話就暫時不想去試。Btw, 最近想試看看, 有沒有簡單的工具能降低影片裡的背景雜音。

3 則留言:

  1. 影片,其實就是影像跟聲音合併的檔案。
    依你的設定看來,
    -b:v 只有針對影像 bitrate 做設定,最大到 3000k,超過這個的話,就會犧牲品質,若你的影片變化率高(例如拍火焰)就會看出差異。若是在乎,可以試試 -crf 參數,它是以固定品質為優先。
    -acodec copy 是 直接把原音軌跟影片合併。不曉得影片原先的音軌是用什麼壓縮的,也不知道你轉檔時用什麼 codec。但也許你可以試試壓縮 -async 512 測試一下。我的情況是原先影片用的是 PCM,我轉檔時用 faac,轉完聽起來 ok。

    回覆刪除
  2. 個人也是建議用crf,如果你興趣玩玩不同crf的PSNR,會發現壓同個影片時,crf的數字與PSNR呈現PSNR=a*crf+b的關係(ab為實數),流量也會隨著影片內容調整

    回覆刪除
  3. 查文件時有看到其它文章提到 -crf, 試的時候參數位置下錯了導致沒效果。修正這個問題後忘了再回頭試 -crf, 之後再來試看看, 謝啦。

    回覆刪除

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...