前往
大廳
主題

gif製作教學 無介面版本 (mac, ffmpeg, python, QuickTime Player)

WOW | 2024-04-10 10:09:47 | 巴幣 2 | 人氣 74

最近因為玩nikke
常常在製作gif
就順便記錄一下
也分享給有緣人

事前準備:
安裝ffmpeg
安裝python3
我的環境是mac m1 但是我想windows應該也差不多
QuickTime Player的話我不確定windows有沒有類似工具

沒有的話會比較麻煩後面說明

正常我是用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


創作回應

更多創作