發布日期:2026 年 3 月 5 日
我是 Sam Bhattacharyya,最初在 2023 年將免費 AI 影片升頻器做為開放原始碼的興趣專案。出乎意料的是,這項服務自然成長,每月活躍使用者人數 (MAU) 達到 25 萬人 (截至 2026 年 2 月)。由於該專案採用用戶端 AI 處理技術,因此伺服器處理成本為零。你可以在瀏覽器中強化影片,不必安裝軟體或登入帳戶。
本文說明如何使用 WebGPU 和 WebCodecs,在應用程式中新增免費的用戶端處理功能。
伺服器成本相關挑戰
在先前的職位中,我負責管理瀏覽器型直播工具的 AI 基礎架構,該工具擁有數百萬名使用者,且在伺服器端處理影片的預算成本相當高。
伺服器端影片處理作業佔了 20% 的預算。這是公司主要的變動成本,僅次於薪資。對於轉錄、音訊或影片強化等每項 AI 功能,團隊都面臨嚴格的預算限制 (每小時影片 $0.1 美元),因此必須謹慎實作。
唯一例外的是用戶端 AI,虛擬背景和背景噪音移除等功能都是使用內部用戶端 SDK 實作。由於模型推論和影片處理作業是在使用者裝置上進行,因此這些 AI 功能不會產生伺服器處理費用。
WebCodecs 等 API 可在瀏覽器中建構完整的影片處理管道,包括功能齊全的影片編輯套件。WebGPU 可大幅提升用戶端 AI 的效率。
使用 WebCodecs 和 WebGPU 進行用戶端處理
免費 AI 影片升級工具使用開放原始碼的 WebSR SDK。這個 SDK 會接受圖片、放大圖片,然後將結果繪製到畫布上。
超解析度類神經網路會對來源圖片套用重複的圖片卷積 (矩陣乘法),藉此擷取圖片特徵,進而放大圖片。然後對這些圖像特徵套用更多捲積,重建最終的高畫質圖像。
WebSR 會將這些類神經網路卷積層實作為 WebGPU 計算著色器。舉例來說,請參閱範例層和完整網路。呼叫算繪方法時,SDK 會執行升頻網路的每個層,並將最終圖片輸出至畫布。您可以進一步瞭解類神經網路實作。
import WebSR from "https://esm.sh/@websr/websr@0.0.15";
const gpu = await WebSR.initWebGPU();
const canvas = document.getElementById("canvas");
const websr = new WebSR({
network_name: "anime4k/cnn-2x-l",
weights: await (
await fetch("https://katana.video/files/cnn-2x-lg-2d-animation.json")
).json(),
gpu,
canvas,
});
const img = document.getElementById("source");
const bitmap = await createImageBitmap(img);
await websr.render(bitmap);
您可以使用 MediaPipe 或 TensorflowJS 等架構,以任何模型取代 WebSR SDK。影片處理管道使用 WebCodecs,並建構為轉碼管道。
管道分為幾個階段:
- 解多工:從 File 物件讀取編碼的影片區塊。
- 解碼:將編碼的區塊解碼為 VideoFrame 物件。
- 處理:將輸入的 VideoFrame 轉換為放大後的 VideoFrame。
- 編碼:將放大後的 VideoFrame 物件編碼為新的編碼區塊。
- 多工:將輸出編碼區塊寫入輸出檔案。
管道會使用 Streams API。編碼、解碼和解多工/多工處理作業會以串流形式實作。為進行示範,專案會使用 webcodecs-utils 程式庫中的多工和串流公用程式。這個程式庫提供 VideoEncoder 和 VideoDecoder 的串流包裝函式。
import {
SimpleDemuxer,
VideoDecodeStream,
VideoProcessStream,
VideoEncodeStream,
SimpleMuxer,
} from "https://esm.sh/webcodecs-utils";
import WebSR from "https://esm.sh/@websr/websr@0.0.15";
// Fetch demo video
const arrayBuffer = await (
await fetch("https://katana.video/files/hero-small.mp4")
).arrayBuffer();
const videoFile = new File([arrayBuffer], "hero-small.mp4", {
type: "video/mp4",
});
// Initialize WebGPU and WebSR
const gpu = await WebSR.initWebGPU();
const weights = await (
await fetch("https://katana.video/files/cnn-2x-lg-2d-animation.json")
).json();
const websr = new WebSR({
network_name: "anime4k/cnn-2x-l",
weights,
gpu,
canvas,
});
// Set up demuxer
const demuxer = new SimpleDemuxer(videoFile);
await demuxer.load();
const decoderConfig = await demuxer.getVideoDecoderConfig();
const encoderConfig = {
codec: "avc1.4d0034", // https://webcodecsfundamentals.org/codecs/avc1.4d0034.html
width: 640,
height: 360,
bitrate: 1000000,
framerate: 30,
};
// Set up muxer
const muxer = new SimpleMuxer({ video: "avc" });
// Build the upscaling pipeline
await demuxer
.videoStream()
.pipeThrough(new VideoDecodeStream(decoderConfig))
.pipeThrough(
new VideoProcessStream(async (frame) => {
// AI upscale with WebSR
await websr.render(frame);
const upscaledFrame = new VideoFrame(canvas, {
timestamp: frame.timestamp,
duration: frame.duration,
});
return upscaledFrame;
}),
)
.pipeThrough(new VideoEncodeStream(encoderConfig))
.pipeTo(muxer.videoSink());
// Get output
const blob = await muxer.finalize();
請參閱 Codepen 上的完整管道。
Streams API 特別適合搭配 WebCodecs 使用,因為如果某個階段 (例如編碼) 負載過重,API 會使用背壓自動減緩上游階段 (例如解碼) 的速度。這樣可避免記憶體問題,並提升效率。
這樣可提供簡單明瞭的使用者體驗:
- 使用檔案輸入上傳影片。
- 系統會在裝置上處理影片。
- 您可以將結果下載為 Blob。
如要進一步瞭解如何使用 WebCodecs 建立轉碼管道,請參閱這篇文章。您也可以在 GitHub 上查看 Free AI Video Upscaler 的完整處理管道,程式碼不到 400 行。
結果
免費 AI 影片升級工具的唯一宣傳方式是單一 Reddit 貼文。 儘管如此,這項工具仍透過口碑行銷,吸引了 25 萬名每月活躍使用者,且每月成長率高達 32%,這都要歸功於使用者在論壇上分享這項工具。
250,000
每月活躍使用者
10,000
每日處理的影片數量
30,000
每月處理的影片時數
0 $
伺服器處理費用
每天處理 10,000 部影片 (每月 30,000 小時的影片),且伺服器費用為零。
免費 AI 影片升頻工具是付費 AI 升頻服務的潛在客戶開發工具。我也使用在伺服器端執行的更強大 AI 模型,建構了這項服務。這種做法可產生利潤,且無需行銷,而初始應用程式仍維持免費和開放原始碼。
建議與資源
在 WebCodecs 和 WebGPU 推出前,視訊處理密集型應用程式需要使用桌面軟體 (可能很麻煩),或是成本高昂的伺服器端處理作業。伺服器費用通常占影片應用程式營運成本的很大一部分。
這些瀏覽器 API 可讓您建構有效率的用戶端視訊處理應用程式。相較於桌上型軟體,這些應用程式更直覺易用,且減少了摩擦;相較於伺服器端處理,這些應用程式也更經濟實惠且可擴充。
如要進一步瞭解 WebCodecs,以及如何建構 Free AI Video Upscaler 或 Katana 等影片應用程式,請參閱 WebCodecsFundamentals。您將瞭解如何建構正式版 WebCodecs 應用程式,並著重於正式版和實作詳細資料。