顯示具有 FFmpeg 標籤的文章。 顯示所有文章
顯示具有 FFmpeg 標籤的文章。 顯示所有文章

FFmpeg 簡易教學

若對「命令提示字元」不熟,可以先學習之後再來。



  1. FFmpeg 是什麼?
  2. 轉神。

  3. FFmpeg 可以吃嗎?
  4. 不可以。

  5. FFmpeg 要從哪裡開始理解啊?
  6. 起源。

  7. 啥?
  8. 「FFmpeg」、「Mplayer」和「VLC」是三個很早就開始開發的的大型程式,「FFmpeg」主攻影音轉檔、「Mplayer」主攻影音串流、「VLC」主攻影音播放。但之後三個互通有無,所以三個都有彼此的功能。

  9. 又再講古了。
  10. 還有很多古沒說!「FFmpeg」早期多在支援 VCD、DVD 等格式,所以使用上會有很多問題,經常會當掉。但最近大力開發解碼、libx264 ,讓使用上大幅加分。

  11. 還有古嗎?
  12. 因為 FFmpeg 希望有容乃大,所以裡面盡量包山包海,再加上 FFmpeg 利用 Linux 的特性,使用「lib」函式庫的特性,讓使用者可以選擇需要用的編碼或解碼器自行編譯,製出符合自己的 FFmpeg。

  13. 等一下,作業系統是怎麼回事?
  14. 因為開發環境的便利、作業系統穩定因素等等, FFmpeg 使用 Linux 做為開發環境,而 Windows 版相繼有很多人釋出編譯版本,目前最大的是 Zeranoe 的 FFmpeg。

  15. 等於說我們不用自己下載 FFmpeg 來編譯了嗎?
  16. 對,大型作業系統都有很多人編譯完成,只要去下載使用即可。事實上編譯 FFmpeg 是一個浩大工程,不但要知道需要加入什麼函式庫,更要知道發現錯誤時要怎麼解決。

  17. 可以開始了嗎?
  18. 好吧。 Windows 請去 http://ffmpeg.zeranoe.com/builds/ 下載最新 Static 版本。早期版本有差,但現在己經沒有那種問題了;而請它的作業系統請去軟體中心找 FFmpeg 安裝。Linux 的使用者可以直接透過軟體管理工具安裝,又或者可以選其他 Static 方案,像是這裡

  19. 接下來呢?
  20. Windows 請解開並取出 \bin\ffmpeg.exe,跟其它作業系統一樣,打 FFmpeg 就可以執行了。其他作業系統可以直接使用 ffmpeg。

  21. 要如何叫出說明?
  22. ffmpeg -h


  23. 這沒有人看的懂啊!
  24. 沒錯,但這已經是縮小版的了,可以看 ffmpeg -h long 或是 ffmpeg -h full 更長,而之前的說明都是完整說明,根本沒有人想看。

  25. 有沒有速解法啊?
  26. 最基本的用法如:
    ffmpeg -i input.mpg output.mp4


  27. 咦?什麼資訊都沒有加?
  28. 對, FFmpeg 會用預設的參數執行。在 -i 後面加上輸入檔,最後一個參數指定輸出檔,它會自動判斷檔名來使用不同的編碼器。

  29. 可是這不一定是我要的結果啊!
  30. 所以開始要加參數了嘛,如函式庫、轉檔要求等。

  31. 函式庫?有什麼?
  32. 對於「.mp4」檔案,影像常用的是「h264」,音訊常用的是「aac」。

  33. 所以要怎麼用?
  34. 去「ffmpeg -codecs」找,可以看到有「h264」和「aac」可以使用,這時只要加上參數變成:

    ffmpeg -i input.mpg -c:v libx264 -c:a aac output.mp4


    c:v 的意思是說,對於影片,用 libx264 的編碼器,c:a 的意思是說,對於聲音,用 aac 的編碼器。
  35. 那要怎麼調比碼率(Bit Rate)?
  36. 用 -b:v 和 -b:a ,注意不同編譯版單位不同,大寫的 K 和小寫的 k 是差很多的,可以去説明看。

    ffmpeg -i input.mpg -c:v libx264 -c:a aac -b:v 1M -b:a 256k output.mp4


  37. 使用 libx264 有什麼需要注意的?
  38. 這是一個很複雜的議題,請前往這裡看。

  39. 還要自己確認複寫,好累喔!
  40. 可以加上不確認複寫的參數,如:

    ffmpeg -y -i i.mpg -c:v libx264 -c:a aac -b:v 1M -b:a 256k -pass 1 o.mp4
    ffmpeg -y -i i.mpg -c:v libx264 -c:a aac -b:v 1M -b:a 256k -pass 2 o.mp4


  41. 難道只能用 .mp4 檔案?
  42. Xvid 也可以啊,如:

    ffmpeg -i i.mp4 -c:v mpeg4 -c:a mp3 o.mpg


  43. 那可以做成 DVD 的格式嗎?
  44. 可以啊,如:

    ffmpeg -i i.mp4 -target ntsc-dvd dvd.mpg


  45. 不能燒啊,你騙我。
  46. 其實用 FFmpeg 做實在太累了,建議用 DVDStyler

  47. FFmpeg 就只有這樣嗎?
  48. 「這樣」就已經煉了好幾年。當然,FFmpeg 不只這樣,其實有一個基本的功能沒有說。

  49. 你混啊!到底是什麼?
  50. FFmpeg 可以重新對一個影片重新整理(mux),像是如果要把格式換成 .mpg,可以下指令如下:

    ffmpeg -i i.ts -c copy o.mpg


    這裡必須要提醒輸出的格式必須是有意義的,像是上述的範例是原始 i.ts 就是用 MPEG 的編碼,要不然轉檔會失敗。
  51. 這好像也沒有什麼了不起啊?
  52. FFmpeg 可以使用方便的映射功能,範例如下:

    ffmpeg -i i.ts -map 0:0 -map 0:2 -map 0:1 o.mpg


    可以用 ffmpeg -i i.ts 看每一軌的編號,再依序用 -map 指令放進去,亦可指定放入的方式,如 -map 1:2 是指第一個 -i 的第三軌(從 0 開始),而 -c:a:2 是指依 -map 放入的音軌中第二個要使用的編碼器。也可以放入多個檔案,如 ffmpeg -i i1.ts -i i2.ts。

  53. 它會重新轉檔嗎?
  54. 在以前,若要直接複製一軌,要分別下 -c:v copy -c:a copy ,但現在只要:

    ffmpeg -i i.ts -c copy o.mpg


  55. 這用不到,下一個。
  56. FFmpeg 也可以用來切割影片, -ss 是指定從哪裡開始切, -t 是從 -ss 開始切幾秒。如:

    ffmpeg -i i.ts -ss 00:05:00.0 -t 00:55:00.0 o.ts


    有一些新的 FFmpeg 有提供 -to 的指令,是切出 -ss 到 -to 這段時間影片。
  57. 這個動好像有點久?
  58. 在 FFmpeg 的説明中,有説到把 -ss 放在 -i 後面是慢速搜尋,FFmpeg 會從檔案的一開始搜尋,直到找到影格為止。如果把指令放在前面,如下:

    ffmpeg -ss 00:05:00.0 -i i.ts -t 00:55:00.0 o.ts


    會用快速搜尋,FFmpeg 會直接用關鍵影格(Keyframe)搜尋,會比較快,在 FFmpeg 2.1 版後有提高精準度,可以考慮使用。
  59. 那要怎麼合併影片檔?
  60. 這個問題學問不淺,這裡提供基本做法,建議是在使用上述切影片的方式切出影片後,再行合併會比較没有問題。

    ffmpeg -f concat -safe 0 -i mylist.txt -c copy -map 0 o.ts


    其中 mylist.txt 是:

    file 'file1.ts'
    file 'file2.ts'
    file 'file3.ts'
  61. 還有嗎?
  62. FFmpeg 現在已經加入 FontConfig ,可以輕易實現字幕內嵌的功能。

  63. 聴起來不錯。
  64. 首先,要去 http://oss.netfarm.it/mplayer-win32.php 最新版的 Mplayer ,把裡面的 \fonts 資料夾解出來與 ffmpeg.exe 同一資料夾。其他作業系統應該裝 Mplayer 就可以了。

  65. 再來呢?
  66. 就可以轉檔了:

    ffmpeg -i i.mp4 -filter:v ass=i.ass o.mp4


    這個方法是把字幕嵌進影片,之後是没有辦法移除,如果只是單純的放字幕,可以考慮直接放進去(ffmpeg -i i.ass)就好。
  67. 這好像是濾鏡喔?
  68. FFmpeg 支持很多濾鏡,上例 ass 是其中一個,有興趣的可以看看。



在此提供一些往下延伸的教學網站:


寫完了,FFmpeg 是很強大但問題不少,有使用上的問題可以提問看看。但 FFmpeg 本身太複雜不可能一一回答,在中國大陸還有網友成立一整個論壇就是在討論 FFmpeg ,以個人微薄之力不可能全部回答。不過還是可以試試看,也許是這篇教學不完整也說不定。



以下是寫給酷看的: FFmpeg 在影音轉檔上經常受到重視,這也是這篇教學的主要目地。這篇教學也改用 Libav 的新指令,也都有基本範例。

FFmpeg 上對 .mp4 編碼解說抄襲

本文是以 FFmpeg Trac 對 .mp4 的部份進行部份摘錄翻譯,建議在閱讀完之後去對照以下原文鏈結,如果不懂 FFmpeg 的人可以先到這裡復習一下:

http://trac.ffmpeg.org/wiki/Encode/H.264
http://trac.ffmpeg.org/wiki/Encode/AAC
http://trac.ffmpeg.org/wiki/Encoding%20VBR%20(Variable%20Bit%20Rate)%20mp3%20audio
http://trac.ffmpeg.org/wiki/GuidelinesHighQualityAudio



常識部份

  1. .mp4 是什麼?
  2. MPEG-4 Part 14,影像的部份常用 H.264,聲音的部份常用 Advanced Audio Coding (AAC)或也可以用 MP3。

  3. H.264 是?
  4. Advanced Video Coding,其中一個廣為流傳的編碼器是 x264。

  5. AAC 有什麼編碼器啊?
  6. Nero 在 2009 年底有出一個神器「NeroAACEnc」,但問題是他只給編譯好的版本,再加上版權的問題所以 FFmpeg 根本不可能使用他。目前可以使用的是 Fraunhofer FDK AAC、和後來 FFmpeg 自己開發的 aac。

  7. 這些...可以吃嗎?
  8. 上述編碼器可實作 AAC 有分二種層次(Profile),一個是低複雜度(Low-Complexity、LC-AAC),目前大部份都是用這種;另外一種是高複雜度(High-Complexity、HC-AAC),後者在 FFmpeg 中只有 libfdk_aac 可以編碼。

  9. MP3 的部份呢?
  10. 就 libmp3lame 吧!所有網站全部只推薦這個,主要是因為他可以說是 MPEG-1 Audio Layer III 趨近完美的實作,而且授權又可內建於 FFmpeg 裡面。

  11. .mp4 裡面可以怎麼放東西?
  12. 一個視訊軌和一個音訊軌是最基本的,放二個音訊軌也沒有問題(FFmpeg 請使用 -map)。字幕筆者有丟過 .srt ,但畢竟那不是標準。



libx264 部份

  1. 常見是怎麼壓的啊?
  2. 恆定質量(Constant Rate Factor、CRF)和兩階段式(Two-Pass)。

  3. 要用哪一個比較好?
  4. 如果不追求輸出檔案大小,用恆定質量(CRF)。如果苛求輸出檔案的大小,用兩階段式(Two-Pass)。

  5. 在開始之前要注意什麼?
  6. 要先選好 preset ,就是決定要壓多快。如果選比較慢的畫質可以有明顯的提升,但是轉檔速度很慢。有下面幾種可以調(預設是 medium):
    ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo

  7. 恆定質量要怎麼做?
  8. 先從 0 到 51 挑一個數字,再丟到下面的指令就可以了(範例是 22):
    ffmpeg -i input.mpg -c:v libx264 -crf 22 output.mp4


  9. 這是什麼鳥說明,在混啊?
  10. 呃...值是 0 的話是趨近無損, 51 是最差。大致上要到 18 以上才可發現差異, 28 以上就真的很糟。普通是 +6 流量會倍增, -6 會倍減。這裡建議是找一個中庸的影片,壓看看就知道差異了。

  11. 兩階段式是?
  12. 如果要指定的位元率(Bitrate)才需要這樣壓,壓第一次是檢視影片來決定要怎麼壓,會產生記錄檔;而第二次才是產生完整檔。實作是:

    ffmpeg -y -i input.mpg -c:v libx264 -b:v 1M -pass 1 output.mp4
    ffmpeg -y -i input.mpg -c:v libx264 -b:v 1M -pass 2 output.mp4

  13. 感覺兩階段式品質會比較好?
  14. 不會,不要再有這種想法了。二階段式的目的就只是要得到所需求的位元率而已。

  15. 還有其他要解釋的嗎?
  16. 大致上是這樣,還有無損、平均流量、相容性要加註。

  17. 無損是?
  18. 正確來說是趨近無損,實作是:

    ffmpeg -i input.mpg -c:v libx264 -crf 0 otput.mp4


  19. 可不可以不要用兩階段式又可以指定流量?
  20. 可以,就是平均流量(Average Bit Rate、ABR)。但壓出來會很糟,時間也節省不到哪裡去:

    ffmpeg -i input.mpg -c:v libx264 -b:v 1M otput.mp4

  21. 相容性?
  22. 預設壓出來的 .mp4 很多裝置都不能播放,所以要改成:

    ffmpeg -i input.mpg -c:v libx264 -profile:v baseline -level 3.0 otput.mp4

  23. 要如何把轉出來的影片可以給其他人快速的串流?

  24. ffmpeg -i input.mpg -c:v libx264 -movflags +faststart otput.mp4

  25. 上面提到的測試每次都要壓好久,好像很白痴?
  26. 有偏移(-ss)和長度(-t)可以用啊。

  27. FFmpeg 支授顯卡壓縮嗎?
  28. 現在還不是很建議使用,這裡有説明



音訊部份

  • 如果目前所有編碼器都有,那哪個好?
  • 結論是:

    對於 LC-AAC 部份:
    libfdk_aac > FFmpeg 內建的 AAC


    對於 HE-AAC 部份:
    就只有 libfdk_aac 可以使用。


    因為授權的關係,有 libfdk_aac 的 FFmpeg 是不可以在網路上放給其他人下載的,所以要自行編譯。


libfdk_aac 部份

  1. 要去哪裡取得 libfdk_aac?
  2. 二種方法。Zeranoe 有提供一個在 Linux 上編譯 Windows 的 .exe 程式的方法,如果有聽得懂的人可以去試看看。如果聽不懂的,可以去 Netfarm下載他們家的 FFmpeg,他們有提供 libfdk_aac.dll 可以使用。

  3. VBR 怎麼下?
  4. 共 1(最差,約每聲道 20-32kbps)到 5(最好,約每聲道 96-112kbps):

    ffmpeg -i input.mpg -c:a libfdk_aac -vbr 3 output.m4a

  5. CBR 怎麼下?
  6. 就一般的下法:

    ffmpeg -i input.mpg -c:a libfdk_aac -b:a 128k output.m4a
  7. HE-AAC 呢?
  8. 會使用 HE-AAC 的原因就是要檔案很小,筆者經驗是 24k 和 32k 轉出來的品質都接近,適合人聲(没有音樂)的檔案。再低下去就要用 amr 的,但是音質低到不建議使用。

    ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k output.m4a




FFmpeg 內建 aac 部份

  1. VBR 怎麼下?
  2. 可以使用,可以嘗試看看,但不建議進行高音質壓縮。

  3. CBR 怎麼下?
  4. 筆者測過, 128k 就可以聽出音質明顯滅損,建議使用到 192k 以上,音質才比有保障。

    ffmpeg -i input.wav -c:a aac -b:a 256k output.m4a



libmp3lame 部份

  1. VBR 怎麼下?
  2. 對照原本 Lame -V 指令可從 0(最好,約 245kbps )到 9(最差,約 65kbps ):

    ffmpeg -i input.mpg -c:a libmp3lame -q:a 2 output.mp4

  3. CBR 怎麼下?
  4. 就一般的下法:

    ffmpeg -i input.mpg -c:a libmp3lame -b:a 128k output.mp4



如果沒有要壓的部份可以用 -c:v copy 或 -c:a copy 來直複製。另外 -map 也可以要求產生出來的檔案要怎麼放。



以下是寫給酷狗看的: FFmpeg 對於 .mp4 的壓縮經驗。