主題
最近因為玩nikke
常常在製作gif
就順便記錄一下
也分享給有緣人
事前準備:
安裝ffmpeg
安裝python3
我的環境是mac m1 但是我想windows應該也差不多
QuickTime Player的話我不確定windows有沒有類似工具沒有的話會比較麻煩後面說明
正常我是用play cover玩nikke的
正常我是用play cover玩nikke的
所以我都是用mac的內建錄影
cmd? + Shift? + 5 |
錄製好之後會產生一個.mov
接著用 QuickTime Player打開檔案後 輸入
cmd? + T |
拉的時候可以看到時間軸 可以了解一下 以後或許會用到
匡出要的區域後 按下裁剪 就會跳出一個新的視窗 然後按下存擋
cmd? + S |
就會新開啟一個剛剛裁剪區段的.mov
再來開啟一個資料夾 放入python code
專案結構長這樣
python程式碼如下 (ffmpeger.py)
import os import subprocess import shutil input_folder = "input" output_folder = "output" processed_folder = "processed" ffmpeg_cli_format =\ 'ffmpeg -i {input_file_path} -vf "fps=32,scale=1080:-1:flags=lanczos,setpts=1.0*PTS" {output_file_path}' os.makedirs(output_folder, exist_ok=True) os.makedirs(processed_folder, exist_ok=True) input_files = [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f))] for filename in input_files: if filename.endswith(".mov"): input_file_path = os.path.join(input_folder, filename) output_file_path = os.path.join(output_folder, os.path.splitext(filename)[0] + ".gif") ffmpeg_command = ffmpeg_cli_format.format(input_file_path=input_file_path, output_file_path=output_file_path) subprocess.run(ffmpeg_command, shell=True) processed_file_path = os.path.join(processed_folder, filename) shutil.move(input_file_path, processed_file_path) |
使用方式就是把需要處理的.mov 放入input資料夾
接著執行程式
python ffmpeger.py |
就會把
處理好的.gif輸出到output資料夾
處理過的.mov搬到processed資料夾
基本上就大功告成
之後就把需要產生gif的.mov
放入input資料夾
再執行python即可
大致說明一下ffmpeg幾個比較有用的參數
程式碼中使用的ffmpeg指令
ffmpeg -i xxx.mov -vf "fps=32,scale=1080:-1:flags=lanczos,setpts=1.0*PTS" xxx.gif |
fps = 產出gif的幀率 會被影片的幀率限制 理論上不能大於原始影片的幀率, 32 = 每秒32張
scale = 只需要管第一段數字 解析度 就跟螢幕解析度的720 1080 一樣意思
setpts = 播放速度 假設要放慢3倍 就輸入3.0*PTS
另外說明如果沒有QuickTime Player要怎麼擷取.mov片段
理想上會需要一個可以細到毫秒的播放器
舉例
就是影片的時間軸理想要能顯示到 00:00:05.1 而不是顯示00:00:05秒
如果只能顯示到 00:00:05 會變成要自己多轉幾次看是否有抓對時間
因為gif每0.1秒的差別 做出來都有可能會不一樣
知道自己原始影片的區間之後 也是使用ffmpeg指令
ffmpeg -i xxx01.mov -ss 00:00:12.1 -t 3.8 -c copy xxx02.mov |
指令說明
將 xxx01.mov的12.1秒開始
持續擷取3.8秒
也就是擷取到 15.9秒
產生一個新檔案 xxx02.mov
-i 原始檔案
-ss 新檔案的開始時間
-t 新檔案從開始時間起始之後持續的時間
-c 可不用理解 直接照抄
最後給出新檔案名稱.mov