返回作品列表
AI 工具 · 桌面應用 · 個人獨立開發

Kindling

Kling AI 影片生成桌面工作流工具

生成、拆幀、剪輯、重生、匯出——把 AI 影片生成從「抽卡」變成可控的工作流。只重生壞掉的那一段,而花過錢的每一格,都留下來。

類型
Windows 桌面應用程式
平台
Windows 10 / 11
技術
C# · .NET 10 · WPF(純 C#,無 Python 後端)
生成引擎
Kling.ai API(自帶金鑰)
影像處理
ffmpeg · PNG 影格序列
為什麼做這個

AI 影片生成,不該是抽卡

用 API 生影片的體驗通常是這樣:寫 prompt、送出、扣錢、等結果——十秒的片子有八秒很好,剩下兩秒壞掉,於是整段重生,再扣一次錢,而且新的那支可能換別的地方壞。生成結果是一支封閉的 mp4,你只能整支要或整支不要

Kindling 把生成結果拆成一格一格的素材:壞掉的段落框起來重生,好的部分一格都不用動。

做法是全程以 PNG 影格序列為中心:生成的影片自動拆幀進片段庫,可以剪、可以逐格刪、可以框一段丟回 Kling 重生,再把新素材對齊、融合、接回原位。每次重生的候選都保留成版本——花過錢的東西就不會丟,隨時切換、隨時回退。

Kindling(引火柴)是 ZeroCel 的衍生工具:做動畫中割時建立的影格處理管線,抽出來對準另一個問題。也因此它是純 C# / WPF——不需要 ZeroCel 的 Python 推論後端。

工作流

五步,從 prompt 到成片

01

生成

首幀(可加尾幀)+ prompt 送 Kling,送件、輪詢、下載、拆幀全自動,一次可生 1–4 支。

02

拆幀

mp4 拆成 PNG 影格序列 + 抽出音軌;也可直接拖任何影片進來當素材。

03

剪輯

片段拖進序列軌,設入/出點、配 BGM;細修模式逐格檢視、刪格、雙軌音訊。

04

重生

框選壞掉的段落,取頭尾幀丟 Kling 重生,新素材對齊、融合、接回原位。

05

匯出

MP4(三檔品質、多軌混音)或 GIF(兩段調色盤);也可匯出純影格序列。

核心賣點

重生:框一段、換一段,其他一格不動

在影格條上框選要重做的範圍,Kindling 取頭尾幀丟給 Kling 生成新素材;你在重生工作區框選新素材要留的部分,它自動走尺寸對齊 → 重取樣 → 接回 + cross-dissolve 融合,350ms debounce 即時預覽。長度可鎖定原長(有音軌時強制)、照新素材、或自訂格數。

改個 prompt 再試一次很便宜:歷次生成的素材累積成候選池,不會覆蓋舊的。多支候選還能「覆寫合成」——把主選的某一段換成另一支候選的對應段,跨候選的對齊用比例粗估加上內容比對細對齊,接縫一樣用 cross-dissolve 處理。

原片永遠是版本 0,每次重生是版本 1..N,卡片上點縮圖就能切版本。凡是花過錢生出來的東西,都留著。

花錢資產

三道防線,每一道都是使用者真的撞到才補上的

這是整個專案最花心思的地方。一般軟體弄丟資料,使用者重做一次就有;這裡不一樣——生成要收費,而且生成物無法重現。同樣的 prompt、同樣的首幀再送一次,也不會拿回同一支影片。弄丟了就是錢花了、東西永遠回不來。

01

送件前先驗工具鏈

使用者回報:送件成功、生成成功、下載成功,最後拆幀炸了——Windows 11 的 Smart App Control 封鎖了未簽章的 ffmpeg.exe。錢已經花完,才發現本機根本跑不動。現在送件前先各跑一次 ffmpeg -version / ffprobe -version,跑不動就擋在收費之前。

02

後段失敗時搶救 mp4

拆幀失敗當下,那支已扣費、已下載的 mp4 只存在 temp\,而 temp\ 下次啟動會整包清空。現在改為搶救到永久位置、掛成「有母帶的失敗卡」,按「救回」就能重拆。這一步刻意不看「保留 Kling 輸出」設定——影格沒拆出來時,這支 mp4 是唯一副本。

03

憑 taskId 重新取回

連下載都沒完成時,本機一個 byte 都沒有,前兩道都救不了。所以送件當下就把 Kling 回傳的 taskId 持久化,失敗卡上因此多一顆「重新下載」——直接向 Kling 要回結果,不會多扣一次費

三道防線的共同結構

沿著「錢已經花掉」這條時間線,問每一個失敗點:此時此刻,使用者手上還剩什麼?剩 mp4 就保住 mp4,剩 taskId 就用 taskId 換回 mp4,什麼都不剩——那就別讓他花這筆錢。也因此第一道防線的位置是刻意的:依賴檢查要放在「不可逆的副作用」之前,而不是需要它的那一刻之前,中間隔著一次扣款。

工程重點

幾個值得一提的技術決定

1

三個「以為對、其實錯」的 bug,同一個根因

拆幀少一格。AI 生成的影片常是 VFR(可變影格率),用一般方式拆幀會被 ffmpeg 重取樣——丟格或補格,10 秒的片拆出來少一格,後面整條管線都歪;而 metadata 的 nb_frames 又不能信。改用 -fps_mode passthrough 讓 ffmpeg「解到幾張吐幾張」,最終張數以輸出檔案數為準

期望 3 格、實得 91 格。融合時用單一支 ffmpeg 對影像序列推斷長度,它自己算出了 91 格。改成逐格各跑一支,並用測試釘死「輸入幾格就是幾格」的張數恆等。

候選編號覆蓋。新候選拿現有數量當編號,但刪掉版本後編號不回收,於是撞上既有候選、把它蓋掉。改成配置「第一個空槽」,邏輯集中到單一檔案並測試釘死。

三顆的共同點很明顯:都是讓工具替我推斷數量。推斷在多數情況下是對的,而那正是它危險的地方——它會安靜地在少數情況出錯,而這裡的少數情況等於「使用者花錢買的素材被蓋掉」。現在三處全部改成明確列舉、明確查空位。

2

模型 fallback,但不白扣錢

Kling 的模型名稱可能因版本下架而失效。Kindling 只在「送件當下被退、任務未建立、確定不扣費」時才自動換下一個候選模型;認證錯誤、額度不足等其他錯誤據實中止——分不清「這次沒扣到錢」和「這次扣了但失敗」就自動重試,等於替使用者連刷信用卡,所以錯誤分類刻意保守,不確定就停下來問人。模型規則(哪個家族吃幾秒、音訊支援組合)集中在單一真相源,UI 自動 coerce,送件端讀同一份。

圖片也在選圖當下就預檢(≤10MB、每邊 ≥300px、長寬比 1:2.5 ~ 2.5:1),送件前再硬擋一次。額外檢查首尾幀長寬比是否一致——不一致時 Kling 會以首幀為準裁切尾幀,而使用者不會知道自己的尾幀被切掉了一塊。

3

金鑰的保管與使用

自帶金鑰(AK + SK)在本機以 HS256 簽出 30 分鐘短效 JWT 才出門,SecretKey 落地時用 Windows DPAPI 加密,「回報問題」打包 log 時金鑰一律不進 log。

4

序列是引用層,不是複製層

剪輯軌上的每一段只是對片段庫的引用(片段 + 入/出點),不複製影格、不動原片。片段刪了,序列顯示「素材不在」但不崩。真相源始終是 PNG 影格序列而不是 mp4——代價是磁碟吃得凶,換來的是每一格都可定址、可替換、可復原

5

跨候選對齊:粗估 + 內容比對

覆寫合成要在兩支不同生成結果之間找「對應的那一段」。Kindling 先用長度比例粗估落點,再用灰階縮圖的 SAD(絕對差和)開窗搜尋做內容細對齊;素材差異太大對不上時,自動退回比例對映——寧可準度降級,不讓功能失效。

6

復原/重做:連硬碟上的 PNG 都救得回

Ctrl+Z 涵蓋的不只是序列排列與入/出點修剪,還包括真的動到硬碟檔案的刪格與留空。一般編輯器的 undo 是在記憶體裡回捲狀態,但這裡的刪格是把 PNG 從影格資料夾拿掉——做法是先搬進專案資料夾外面的備份區而不是真刪,復原時原樣搬回(放在外面,影格列舉、.kind 打包、整批覆蓋才都掃不到它)。另外兩個踩過才想清楚的細節:復原動作會觸發與一般編輯相同的事件鏈,需要一道閘門擋住,否則越復原歷史越長;影格被整批換內容或片段被刪除時只作廢該片段的歷史,不整包清空,免得舊備份混進新版本的影格裡。

7

深淺色主題的 WPF 陷阱

整個 App(含所有對話框)跟隨 Windows 深淺色,執行中切換即時生效。機制是色盤全走 DynamicResource、由單一服務當兩套色值的唯一真相源——不能用 StaticResource 再改 brush 顏色,WPF 的 Style 封印會把 setter 裡的 brush 凍結,這是踩過才知道的坑。訊息框也自製取代 Win32 MessageBox,因為原生框不吃深淺色。

功能總覽

一站式,從專案到成片

專案牆多專案各自獨立(片段庫 / 序列 / 素材互不相干),卡片列表依最後開啟排序;整個專案可打包成 .kind 檔交換與備份。
片段庫卡片 + 縮圖 + 狀態;改名、另存影格序列、刪除含保險(母帶可救回)。
序列剪輯拖拉組片、入/出點、BGM(音量 / 靜音);細修模式逐格檢視、雙軌音訊各自偏移與音量。刪格有兩種語意——往前遞補縮短,或原位留空成黑格留待後續填補(另有「收起空格」把黑格收掉);留空標記持久化在影格資料夾,切走再回來、重開 App 都認得哪些格子是刻意留白的。
重生工作區框選重生、候選池、版本鏈、覆寫合成、動態補間(素材偏短時 minterpolate 腦補)。
復原 / 重做Ctrl+Z / Ctrl+Shift+Z,涵蓋序列排列、入/出點修剪,以及直接動硬碟 PNG 的刪格與留空——誤刪的影格按一下就回來。
匯出MP4:CRF 三檔品質、縮放、多音軌混音(偏移 / cross-fade / 補靜音);GIF:兩段 palettegen / paletteuse,品質遠勝單段量化。
穩定性三道例外網(UI 線程 / 背景 / 致命)、crash 下次啟動提示、一鍵回報問題打包當日 log;操作日誌只記「花錢或動資料」的操作(送件 / 下載 / 拆幀 / 刪格 / 救回 / 切版本 / 匯出),導覽類一律不記——回報 zip 要能對得出使用者做過什麼,而噪音會讓日誌失去用途。
技術棧總覽

純 C# 的影像工作流

核心C# · .NET 10 · WPF / MVVM(色盤跟隨系統深淺色)
生成 APIKling.ai(本機簽 JWT · 模型規則單一真相源 · 不扣費才 fallback)
影像ffmpeg / ffprobe(passthrough 拆幀 · minterpolate 補間 · palettegen GIF);找不到打包版自動退回系統 PATH
音訊NAudio 波形顯示 · 多軌混音(偏移 / 音量 / cross-fade)
安全與日誌DPAPI 金鑰加密 · NLog · 三道例外網 · 金鑰與 prompt 內容一律不進 log
測試xUnit(13 支檔案 / 120 項全綠,融合類會真的跑 ffmpeg)· 守的是影格數學與 Kling 規則矩陣
發佈self-contained 免裝 .NET · Inno Setup 免 UAC(裝到使用者目錄)· YubiKey 硬體金鑰簽章 + RFC3161 時戳 · 測試不綠不出安裝檔
尚未做

知道缺什麼,比假裝不缺重要

生成前的額度預估

目前送件前只知道「會花錢」,不知道這次會花多少。在一個以「別讓使用者白花錢」為核心的工具裡,這是最該補上的一塊。

更強的跨候選動作對齊

現在是灰階縮圖的 SAD 內容比對,動作劇烈的素材可考慮光流或特徵點。落點單一,只在覆寫合成的對映函式裡,換起來不牽動其他地方。

留空標記的跨片段繼承

留空標記只跟著「同一個影格資料夾」走,衍生出新片段時黑格畫面會帶過去、標記不會。這是刻意取捨——重拆或換內容時寧可清掉,也不能讓舊標記污染新影格(誤標會讓「收起空格」刪掉真內容)。需要時對黑格再標一次即可。

下載 · Download
Kindling 安裝程式

Windows 安裝檔(Inno Setup),self-contained 免裝 .NET、免 UAC 安裝到使用者目錄。ffmpeg 可隨附或自動使用系統 PATH 上的版本。

Kindling_Setup_1.1.4.exe · 約 102 MB · 即將提供
安裝檔已完成數位簽章(發行者顯示為 YU-MING HSU,即許彧銘本人)。使用需自備 Kling.ai API 金鑰(AK / SK),僅支援國際版——中國版帳號體系不同、金鑰不通用,我沒有帳號無法實測,而沒實測過的路徑不留在程式碼裡當成「可能可以」的選項讓使用者去撞。金鑰只存在你自己的電腦,以 DPAPI 加密。