用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
留言