用ffmpeg切影片,輸出截圖,生成動畫縮圖

最近在用OBS錄影,都會有自己本身切過去/切回來的畫面,想要剪掉它,發現我原來沒有特別整理這塊指令

裁剪影片

ffmpeg -ss 00:00:00 -t 00:49:00 -i {your-video-file-path} -c copy ouput.mkv

  • -ss 起始時間
  • -to 結束時間
  • -c copy 拷貝所有類型資料,也可以寫-c:v copy -c:a copy
    要使用copy的原則是輸入/輸出需要是同一個format副檔名

如果發現裁切後的影片不是從0開始可以用 setpts=PTS-STARTPTS 來讓它歸零

看影片片段

在裁剪影片的時候,一般你會你會需要看一下影片確認一下ffmpeg

我之前有寫在 ffplay顯示目前播放時間(PTS),該如何用ffmpeg播放影片並顯示目前時間。然後你可以在影片上,點滑鼠右鍵讓ffmpeg作跳到前後,,視窗的左邊表示00:00:00,右邊表示影片最大長度,例如滑鼠右鍵點在視窗中間, 以一個60分鐘的影片就會跳到00:30:00的影片位置。

ffplay \
-vf "drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf:fontsize=50:text='%{pts\:hms}':box=1:x=(w-tw)/2:y=h-(2*lh)" \
"{your-video-file-path}"

  • -vf後面的意思就是使用drawtext畫在影片上;要畫的文字是用影片PTS轉換成時間;位置在高寬置中

輸出截圖

ffmpeg -ss 00:54:45 -i "{your-video-file-path}" -dn -an -frames:v 1 one.png

  • -ss 指定時間位置這裡是設定為54分45秒
  • -dn -an 表示 不處理data和audio
  • -frames:v 1表示只處理一張畫面

因為ffmpeg預設jpg畫質很差所以我都用.png輸出截圖;若真要JPEG可以用-q:v來指定品質參數,例如:-q:v 31 one.jpg

輸出最後一張截圖

ffmpeg -sseof -3 -i {your-video-file-path} -dn -an -frames:v 1 last.png

  • -sseof -3 表示移動到檔尾處理

輸出第一張截圖

不像上面指定-ss或-sseof則是輸出第一張截圖

ffmpeg -i {your-video-file-path} -dn -an -frames:v 1 -update 1 first.png

生成動畫縮圖

ffmpeg -ss 5 -t 15 -i {your-video-file-path} \
  -vf "fps=3,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
  -loop 0 output.gif

  • -vf內得處理是以,分隔
    fps=5表示1秒取2張
    scale=320:-1:flags=lanczos 表示指定寬度320:自動高度,使用lanczos算法作處理

這個指令是參考 

How do I convert a video to GIF using ffmpeg, with reasonable quality? - Super User



留言