最近更新: 2013-03-12

ffmpeg/avconv 轉檔與影片連接範例

ffmpeg/avconv 常用參數

2014-01-28更新: 我最近更新了 Windows 上使用的轉檔工具,改用 avconv 。avconv 是 ffmpeg 的後繼工具,絕大部份的參數相同。本文所用到的參數,基本上都是兩者通用。 另外也修正了一些新、舊版本 ffmpeg 參數位置的變化。

通用
  • -codecs : 查詢目前提供哪些編碼器、解碼器。你必須用這個參數查看你安裝的 ffmpeg/avconv 可用的編碼器與解碼器項目。不是每個版本都提供相同的編碼器與解碼器。
  • -i 輸入源 : 此參數通常必須放在第一位(參數順序有影響),每一個輸入源必須配合一個 -i 。
  • -codec copy : 不改變編碼器,直接複製視訊與音訊。
  • -ss time_off : start time offset. 從開頭算起第幾秒開始處理。也可以用 hh:mm:ss[.ss] 的格式,例如: 01:30:10.30 表示從1小時30分10.30秒處開始。
  • -t duration : duration seconds of video/audio. 視訊/音訊秒數。也可以用 hh:mm:ss[.ss] 的格式,例如: 00:00:50.50 表示取 50.5 秒長度。

範例: 將 Flash 影片 (.flv/.f4v) 轉為 MP4 。


ffmpeg -i source.f4v -codec copy output.mp4

avconv -i source.f4v -codec copy output.mp4

範例: 從影片第30秒起,截取45秒內容存為 slice.mp4 。


ffmpeg -ss 30 -i test.f4v -codec copy -t 45 slice.mp4

avconv -ss 30 -i test.f4v -codec copy -t 45 slice.mp4

在近期的版本中, -ss 應該放在 -i 參數前; -t 必須放在輸出檔名之前。否則截取出的內容,可能會發生影像與聲音不同步的情形;又或者是截取到錯誤位置與長度。

Video 選項:
  • -vcodec 視訊編碼器 : libx264 (MPEG-4 AVC) 可被多數顯示晶片的視訊加速(硬體解壓縮)所支援。copy 表示不改變來源編碼器,單純複製視訊。
  • -vf yadif : 視訊解交錯濾器,DVD轉檔所需。
  • -b:v bit_rate : 視訊位元傳輸率,單位是 bits 。故要取 1000KBps 位元傳輸率的話,這裡要設 1000000 或是寫作 1000k 。
  • -s size : frame size, WxH or abbreviation. 指定輸出的視訊長寬。
  • -vframes num : 視訊幀率,通常是 25 或 30。低於20會出現明顯跳格感。
  • -aspect aspect_ratio (4:3, 16:9, etc)
Audio 選項:
  • -acodec 音訊編碼器 : 常見項目為 libvo_aacenc (AAC), libmp3lame (MP3)。copy 表示不改變來源編碼器,單純複製音訊。
  • -b:a bit_rate : 音訊位元傳輸率,單位是 bits ,所以要取 192KBps 位元傳輸率的話,這裡要設 192000 或 192k 。多數DVD影片的音訊碼流率在 256KBps(AAC) ~ 320KBps(MP3)間。
  • -ar rate : audio sampling rate (in Hz). 48000 (DVD規格), 44100 (CD規格), 22050 (Tape規格)。
  • -aq quality : audio quality (codec-specific)

範例: 將 DVD 中的某一段內容轉為 MP4 。


ffmpeg -i VTS_01_4.VOB -vcodec libx264 -vf yadif -b:v 2000k \
       -acodec libvo_aacenc -b:a 192k d:\dvd_01_4.mp4

avconv -i VTS_01_4.VOB -vcodec libx264 -vf yadif -b:v 2000k \
       -acodec libvo_aacenc -b:a 192k d:\dvd_01_4.mp4

範例: 將一份 1080P 影片轉為 360P 影片,並降低音訊規格為 128k, 22050hz 。


ffmpeg -i 1080p.mkv -vcodec libx264 -s 640x360 \
       -acodec libvo_aacenc -b:a 128k -ar 22050 360p.mp4

avconv -i 1080p.mkv -vcodec libx264 -s 640x360 \
       -acodec libvo_aacenc -b:a 128k -ar 22050 360p.mp4

影片連接

DVD 通常會將影片內容切成數份 .vob 。 某些線上影像網站,如 youku ,也會將影片切成數份 .f4v 。 碰到這些情形,我們通常會希望把它們連接成一份影片檔。

DVD rip

範例: 使用 ffmpeg (concat 語法必須要 ffmpeg 1.0 或更新的版本)將整片 DVD 轉為一份 MP4 。假設 DVD 內分成 4 份 .vob 。


ffmpeg -i "concat:VTS_01_1.VOB | VTS_01_2.VOB | VTS_01_3.VOB | VTS_01_4.VOB" \
       -map 0:v:0 -map 0:a:0 -acodec libvo_aacenc -b:a 192k \
       -vcodec libx264 -b:v 2000k d:\movie.mp4

注意,不是所有的影片格式都可以上述用法直接連接。如果你使用的 ffmpeg/avconv 版本連接失敗的話,請參考下一段。

片段的 Flash 影片或 MP4 。

如果來源是 MP4 時,我個人偏好使用 mkvmerge (mkvtoolnix 提供的命令列工具) 連接影片內容。 被切成片段的 Flash 影片,我會先轉成 MP4 ,再用 mkvmerge 連接。

範例: 使用 mkvmerge 連接被切成 2 份 MP4 的影片。


mkvmerge -o one.mkv 001.mp4 \
  +002.mp4 --track-order "0:1,0:2" --append-to "1:1:0:1,1:2:0:2"

若被切割的來源內容的視訊與音訊軌道位置都一樣,可以省略 --track-order 與 --append-to 參數。上例通常可簡化如下:


mkvmerge -o one.mk4 001.mp4 +002.mp4 +003.mp4 +004.mp4

mkvmerge 有一個名叫 mmg 的 GUI 前端程式。使用 add 的效果是輸出多軌影片,使用 append 的效果才是連接多段影片。

如果堅持要用 ffmpeg 連接 MP4 影片,要多次操作才行,參考「How to concatenate, join, merge media files」。範例如下:


ffmpeg -i 001.mp4 -codec copy -bsf:v h264_mp4toannexb -f mpegts 001.ts

ffmpeg -i 002.mp4 -codec copy -bsf:v h264_mp4toannexb -f mpegts 002.ts

ffmpeg -i "concat:001.ts|002.ts" -codec copy -bsf:a aac_adtstoasc one.mp4
相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/22568176.html

樂多舊回應
ted1215@gmail.com(Ted) (#comment-22979328)
Thu, 11 Jul 2013 15:35:42 +0800
mp4 與 flv 也可以使用 ffmpeg 的 concat filter 來串接,http://www.ffmpeg.org/ffmpeg-filters.html#concat
未留名 (#comment-22979360)
Thu, 11 Jul 2013 16:36:27 +0800
看 ffmpeg 的 codec 版本吧。
我用某些版本的 ffmpeg 的 concat 串接 mp4/flv ,結果是銜接處會有明顯的跳幀或花屏。
反而用 mkvmerge 合併百無一失。