[Tool] FFmpeg 教學

軟體:FFmpeg
官方文件

功能:影片處理

命令行:ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file}
// 影片轉出 24 Hz
ffmpeg -i input.avi -r 24 output.avi

// 影片轉出 4K 解析度
ffmpeg -i input.avi -s 3840x2160 output.avi

// 會在關鍵幀直接截取,有可能在開頭增多內容,且快轉 lag
// 切割影片從 1 秒開始,直到經過 5 秒後
ffmpeg -ss 00:00:01 -t 00:00:05 -i input.avi output.avi

// 切割影片從 1 秒開始,直到經過 5 秒後,但轉換較慢
ffmpeg -i input.avi -ss 00:00:01 -t 00:00:05 output.avi

// 切割影片從 1 秒開始,直到經過 5 秒後,較好的做法
ffmpeg -ss 00:00:01 -i input.avi -t 00:00:05 -avoid_negative_ts make_zero output.avi

// 切割影片從 1 秒開始,直到 output 為 5 秒
ffmpeg -ss 00:00:01 -i input.avi -to 00:00:05 output.avi

// 轉檔為 H.264 格式
ffmpeg -i input.wmv -c:v libx264 output.avi

//從第 126 張開始,每五秒取一張圖,並指定 pixel 格式,以免自動選擇錯誤,得到 30 fps 的影片
ffmpeg -framerate 1/5 -start_number 126 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

//利用 glob pattern 選擇圖片
ffmpeg -framerate 1 -pattern_type glob -i '*.jpg' -c:v libx264 out.mp4

//用單張圖片產生影片
ffmpeg -loop 1 -i img.png -c:v libx264 -t 30 -pix_fmt yuv420p out.mp4

// 抓長達 70/10 = 7 秒鐘的影像,並轉換成圖檔,圖檔檔名以數字 digit 的型式自動編號
ffmpeg -i test.flv -an -ss 00:00:42 -r 10 -vframes 70 -y NolanRyan-%d.jpg 

// 合併影片 by stream
// in mylist.txt
// file '/path/to/file1'
// file '/path/to/file2'
// file '/path/to/file3'
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output

// 合併影片 by protocol,與在 UNIX-like 系統使用 cat 類似
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

// 去除背景音樂
ffmpeg -i input.mp4 -vcodec copy -an output.mp4

// 加入背景音樂
ffmpeg -i input1.mp4 -stream_loop -1 -i music.mp3 -shortest output.mp4

指令介紹

  • 以官方文件為主,以下指令並不完備
  • 在 -i 前使用,表示針對 input
    在 output filename 前使用,表示針對 output
  • 一般

    • -h, -?, -help, --help [arg]
      • 顯示幫助
      • ffmpeg -h
    • -version
      • 顯示版本
      • ffmpeg -version
    • -formats
      • 顯示可用格式
      • ffmpeg -formats
    • -devices
      • 顯示可用裝置
      • ffmpeg -devices
    • -codecs
      • 顯示可用編碼/解碼
      • ffmpeg -codecs
    • -decoders
      • 顯示可用解碼
      • ffmpeg -decoders
    • -encoders
      • 顯示可用編碼
      • ffmpeg -encoders
    • -filters
      • 顯示可用 filters
      • ffmpeg -filters
    • -pix_fmts
      • 顯示可用 pixel 格式
      • ffmpeg -pix_fmts
    • -sample_fmts
      • 顯示可用音頻取樣格式
      • ffmpeg -sample_fmts 
  • 主要

    • -f fmt (input/output)
      • 強制輸出指定格式
      • 通常會從檔名猜測,不一定需要此指令
      • ffmpeg -f mp4
    • -i filename (input) 
      • 輸入檔名
      • 可用來查看資訊 
      • ffmpeg -i input.avi
      • 截圖
        ffmpeg -i test.flv -an -ss 00:00:42 -r 10 -vframes 70 -y NolanRyan-%d.jpg
    • -y (global)
      • 覆蓋檔案不詢問
      • ffmpeg -y
    • -n (global)
      • 不覆蓋檔案,若有存在檔案,即終止程式
      • ffmpeg -n 
    • -stream_loop number (input)
      • 輸入影片循環 n 次,-1 表示無限
      • ffmpeg -i input1.mp4 -stream_loop -1 -i music.mp3 -shortest output.mp4
    • -c[:stream_specifier] codec (input/output,per-stream)
      -codec[:stream_specifier] codec (input/output,per-stream)
      • 指定編碼/解碼器 
      • video 使用 libx264 編碼,audio 則單純 copy,不重新編碼
        ffmpeg -i INPUT -c:v libx264 -c:a copy OUTPUT
    • -t duration (input/output)
      • 指定經過時間 
      • ffmpeg -t 00:00:05
    • -to position (output)
      • 當到達指定時間後,便停止寫入
      • ffmpeg -to 00:00::05
    • -fs limit_size (output)
      • 限制檔案大小,單位 bytes
      • ffmpeg -fs 1024
    • -ss position (input/output)
      • 開始位置
      • 用在 input,會先針對 input 尋找到此位置
      • 用在 output,會對 input 解碼但忽略之,直到此位置
      • ffmpeg -ss 00:00:05
    • -sseof position (input/output)
      • 同 -ss,但從結尾開始算,位置設定會為負值
      • ffmpeg -sseof -5
    • -itsoffset offset (input)
      • 指定 delay 多久,開始輸入
      • 5 秒後才輸入,所以會維持 5 秒的第一張畫面
        ffmpeg -itsoffset 5 -i inputfile outputfile
    • -frames[:stream_specifier] framecount (output,per-stream)
      • 指定輸出張數
      • ffmpeg -frames:v 10
    • -filter[:stream_specifier] filtergraph (output,per-stream)
      • 指定 filter 處理
      • 左右翻轉影片
        ffmpeg -i foo.avi -filter:v hflip hflip.avi
  • 影片

    • -vframes number (output)
      • 指定輸出張數,-frames:v 的縮寫
      • ffmpeg -vframes 100
    • -r[:stream_specifier] fps (input/output,per-stream)
      • 指定 frame rate
      • 用在 input 時,將重新產生 timestamps,建議使用 -framerate
      • 用在 output 時,將重覆或抽掉影象 
      • ffmpeg -r 24
    • -s[:stream_specifier] size (input/output,per-stream)
      • 指定解析度 wxh
      • ffmpeg -s 3840x2160
    • -aspect[:stream_specifier] aspect (output,per-stream)
      • 指定長寬比
      • 可為浮點數或比例
        • "4:3", "16:9", "1.3333" 或 "1.7777"
      • ffmpeg -aspect 16:9
    • -vn (output)
      • 不輸出影片
      • ffmpeg -vn
    • -vcodec codec (output)
      • -codec:v 的縮寫
      • ffmpeg -vcodec libx264 
    • -vf filtergraph (output)
      • -filter:v 的縮寫
      • 左右翻轉
        ffmpeg -i foo.avi -vf hflip hflip.avi 
    • -pix_fmt[:stream_specifier] format (input/output,per-stream) 
      • 指定 pixel 格式
      • 若指定格式不存在,則輸出警告並自動選擇最好的編碼
        若加上 + 字符,則不支援時退出,這使得 filter 自動轉換也會被禁止
        若只有單獨的 + 字符,則選擇和輸入一樣的 pixel 格式,此時自動轉換也會被禁止
      • ffmpeg -pix_fmt yuv420p 
  • 音訊

    • -an (output)
      • 不輸出音訊
      • ffmpeg -an
  • image2

    • -loop
      • 是否重覆,0/1 表示 否/是,預設為 0
      • ffmpeg -loop 1
    • -pattern_type
      • 指定 filename 的表示方法
      • 可用參數
        • none
        • sequence (default)
          • 可使用 "%d" or "%0Nd"
          • 第一個檔案需在 start_number ~ start_number+start_number_range-1 之間,且之後的檔案命名需連續
          • 原先的 ’%’ 需改為 "%%".
          • "img-%03d.bmp" img-001.bmp, img-002.bmp, ..., img-010.bmp...
            "i%%m%%g-%d.jpg" i%m%g-1.jpg, i%m%g-2.jpg, ..., i%m%g-10.jpg... 
          • ffmpeg -i img%03d.jpg
        • glob
          • 可使用 "*"
          • 表示任意字元
          • ffmpeg -pattern_type glob -i '*.jpg'
    • -start_number
      • 設定 pattern_type 起始位置,預設為 0
      • ffmpeg -start_number 126
    • -start_number_range
      • 設定 pattern_type 尋找範圍,預設為 5
      • ffmpeg -start_number_range 10 
  • 進階

    • -shortest (output) 
      • 只處理至最短影片的時間
      • ffmpeg -i input1.mp4 -stream_loop -1 -i music.mp3 -shortest output.mp4 
    • -bsf[:stream_specifier] bitstream_filters (output,per-stream)
      • 指定 stream 設定 bitstream filters
        bitstream_filters 可設定多個用逗號分開
        使用 -bsfs 可得到支援的 bitstream filters.
      • ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts

參考

wiki:Seeking
ffmpeg 翻译文档 (ffmpeg-all 包含重要组件)

留言