為影片或圖片加上浮水印——專門處理 Logo 與文字疊加的 API。
一次 POST,就能把 Logo 圖片或文字疊到任何影片或圖片上。位置、不透明度與縮放比例全都直接寫在請求裡;回傳的是 fotovid 託管的檔案,拿到就能直接對外提供。
curl -X POST https://api.fotovid.co/v1/video/watermark \
-H "Authorization: Bearer p6_YOUR_KEY_ID:YOUR_SECRET" \
-H "Content-Type: application/json" \
-d '{
"source_url": "https://cdn.yoursite.com/clip.mp4",
"params": {
"type": "image",
"watermark_image_url": "https://cdn.yoursite.com/logo.png",
"position": "bottom-right",
"opacity": 0.7,
"scale": 0.2
}
}'為什麼在 serverless 上做浮水印這麼痛苦
浮水印看起來很簡單,直到你真的想在 serverless 函式裡跑它。ffmpeg 的 overlay 濾鏡需要完整的二進位執行檔,還得先把你的 Logo 放進可寫入的磁碟,接著它會把整個檔案解碼再重新編碼——只要素材比短片再長一點,就會輕鬆撞破 Lambda 和 Vercel 的執行時間與記憶體上限。結果只是想在角落蓋一個 Logo,你卻得管 layer 打包、暫存空間和冷啟動。
- ffmpeg 的二進位執行檔與相依函式庫,會讓你的部署體積遠遠超過 serverless 常見的大小上限
- 把整支影片重新編碼,會直接撐爆函式的執行時間與記憶體
- 疊加圖片就得在暫時性磁碟上抓檔、備妥檔案,事後還得清乾淨
- 要讓位置、不透明度與縮放在各種解析度下都精準到像素,是相當瑣碎的 filter graph 工程
請求參數
POST /v1/video/watermark & /v1/image/watermark
| Field | Type | Default | Description |
|---|---|---|---|
| source_url* | string (URL) | — | 來源影片或圖片的 HTTPS URL |
| params.type | "image" | "text" | "combo" | "text" | 浮水印類型 |
| params.watermark_image_url | string (URL) | — | Logo 圖片 URL(image/combo 時必填) |
| params.text | string | — | 要疊加的文字(text/combo 時必填) |
| params.position | string | "bottom-right" | top-left · top-right · bottom-left · bottom-right · center |
| params.opacity | number | 1 | 0–1 |
| params.scale | number | 0.15 | 浮水印寬度相對於來源的比例(0–1) |
三個步驟完成你的第一次呼叫
- 1取得免費 API 金鑰
註冊並建立一把金鑰。每個請求都用 Authorization: Bearer p6_<key_id>:<secret> 標頭進行驗證。一開始不必綁信用卡——用量以 credits 計費($1 = 100 credits,一次浮水印是 1 credit)。
- 2POST 你的來源檔與浮水印參數
呼叫 POST /v1/video/watermark 或 POST /v1/image/watermark,帶上標準的請求結構:指向你輸入檔的 source_url(一個 https URL),再加上一個 params 物件。把 type 設成 image、text 或 combo,接著傳入 watermark_image_url 和/或 text,以及 position(top-left、top-right、bottom-left、bottom-right 或 center)、opacity(0–1)、scale(0–1,預設 0.15)與 padding。Fotovid 會下載輸入檔、疊上浮水印,並同步回傳結果。
- 3把回傳的結果 URL 存下來
回應是一個扁平的 JSON,內含 id、type,以及由 fotovid 託管、指向浮水印檔案的 url(影片的回應還會附上 duration)。把它下載回來、保存自己的副本——這個託管 URL 會過期,請把它當成交付用的中繼點,而不是永久儲存空間。
