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, 最近想試看看, 有沒有簡單的工具能降低影片裡的背景雜音。

C++ 能否用 memcpy 複製 class / struct 的資料?

答案是: POD (plain old data) type 可以。POD type 可和 C 互通, CPP Reference POD Type 的介紹: Specifies that the type is POD (Plain Old Data) type. Thi...