N
n8n Store
Workflow Market
Remove Video Background & Compose on Custom Image Background with Google Drive

Remove Video Background & Compose on Custom Image Background with Google Drive

by paul0 views

説明

Categories

⚙️ Automation

Nodes Used

n8n-nodes-base.ifn8n-nodes-base.ifn8n-nodes-base.ifn8n-nodes-base.setn8n-nodes-base.setn8n-nodes-base.setn8n-nodes-base.setn8n-nodes-base.setn8n-nodes-base.waitn8n-nodes-base.merge
Price無料
Views0
最終更新11/28/2025
workflow.json
{
  "name": "Remove Video Background & Compose on Custom Image Background with Google Drive",
  "nodes": [
    {
      "id": "sticky-overview",
      "name": "📋 Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1100,
        60
      ],
      "parameters": {
        "width": 520,
        "height": 580,
        "content": "## 🎬 Video Background Removal & Image Composition\n\n**What it does:**\n- Removes background from ANY video (AI actors, product demos, webcam footage, etc.)\n- Composites foreground onto custom image background\n- Saves final result to Google Drive\n\n**Perfect for:**\n- E-commerce product videos with branded backgrounds\n- Profile videos with professional backgrounds\n- Social media content with custom scenes\n- Presentation videos with company branding\n- AI avatars on static backgrounds\n- Real estate videos with custom overlays\n\n**Processing time:** 3-5 minutes per minute of video\n\n**Setup:** ~7 minutes total\n\n[📖 Full Documentation](https://docs.videobgremover.com/)"
      },
      "typeVersion": 1,
      "notesTextSize": "large",
      "notesBackgroundColor": 4
    },
    {
      "id": "sticky-api-key",
      "name": "🔑 API Key Setup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -480,
        60
      ],
      "parameters": {
        "width": 380,
        "height": 360,
        "content": "## 🔑 API Key Setup (Required)\n\n**Step 1:** Get your API key\n- Visit: https://videobgremover.com/api-management\n- Sign up (free tier available)\n- Copy your API key\n\n**Step 2:** Add to n8n environment variables\n- Go to: Settings → Variables\n- Add new variable:\n  - Name: `VIDEOBGREMOVER_KEY`\n  - Value: your API key\n- Save\n\n**Pricing:** $0.50-$2.00 per minute processed\n\n✅ This workflow uses `$vars.VIDEOBGREMOVER_KEY` (secure)"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-inputs",
      "name": "📥 Inputs",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1100,
        660
      ],
      "parameters": {
        "width": 380,
        "height": 280,
        "content": "## 📥 Input Required\n\n**Foreground video:** Subject with any background\n- AI actors (HeyGen, Synthesia, D-ID)\n- Product demonstrations\n- Webcam/talking head footage\n- Profile videos\n- Sports/training content\n\n**Background image:** Your custom scene\n- Brand backgrounds (logos, colors)\n- Professional settings (office, studio)\n- Product photos\n- Custom graphics/designs\n\n⚠️ Both must be **publicly accessible URLs**"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-composition",
      "name": "🎨 Composition",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -480,
        460
      ],
      "parameters": {
        "width": 380,
        "height": 360,
        "content": "## 🎨 Composition Template\n\n**Template:** `centered`\n- Foreground centered on canvas\n- Maintains aspect ratio\n- Professional look for images\n- Perfect for product demos on branded backgrounds\n\n**Available templates:**\n- `centered` - Center with contain sizing\n- `fullscreen` - Cover entire canvas\n- `picture_in_picture` - Small in corner\n- `ai_ugc_ad` - Bottom-right optimized\n\n**Export:**\n- Format: H.264 (MP4)\n- Preset: Medium (balanced quality/speed)\n\n*Customize in the \"Start Composition\" node*"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-polling",
      "name": "🔄 Polling",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -60,
        60
      ],
      "parameters": {
        "width": 380,
        "height": 300,
        "content": "## 🔄 Processing & Polling\n\n**How it works:**\n1. Job submitted to API\n2. Background removal starts (20-60 sec)\n3. Image composition applied\n4. Status checked every 20 seconds\n5. When complete → download & upload\n\n**Status flow:**\n- `processing` → Wait 20s → Check again\n- `completed` → Download video\n- `failed` → Return error details\n\n⏱️ Typical: 3-5 min per min of video"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-gdrive",
      "name": "💾 Google Drive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        540,
        60
      ],
      "parameters": {
        "width": 380,
        "height": 280,
        "content": "## 💾 Google Drive Setup\n\n**Step 1:** Connect Google Drive\n- Click \"Upload to Google Drive\" node\n- Click \"Connect\"\n- Authorize n8n\n\n**Step 2:** Choose folder (optional)\n- Default: Root of \"My Drive\"\n- Or select specific folder\n\n**Output:**\n- Permanent shareable link\n- Direct download URL\n- File metadata\n\n⏱️ Setup time: ~2 minutes"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-usage",
      "name": "🚀 Usage",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1140,
        60
      ],
      "parameters": {
        "width": 380,
        "height": 340,
        "content": "## 🚀 How to Use\n\n**Manual testing:**\n1. Update URLs in \"Sample Inputs (manual)\"\n2. Click \"Execute Workflow\"\n3. Wait for processing (3-5 min per min of video)\n4. Check Google Drive for result\n\n**Webhook automation:**\n1. Activate workflow\n2. Copy webhook URL\n3. POST to webhook:\n```json\n{\n  \"foreground_video_url\": \"https://...\",\n  \"background_image_url\": \"https://...\"\n}\n```\n\n**Batch processing:** Connect to Google Sheets or Airtable for bulk automation"
      },
      "typeVersion": 1
    },
    {
      "id": "webhook-1",
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -1040,
        900
      ],
      "webhookId": "compose-video-image",
      "parameters": {
        "path": "compose-video-image",
        "options": {
          "responseData": "allEntries"
        },
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1.1
    },
    {
      "id": "manual-1",
      "name": "Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1040,
        1040
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "set-web-1",
      "name": "Extract Webhook Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -820,
        900
      ],
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "name": "foreground_video_url",
              "type": "string",
              "value": "={{ $json.body?.foreground_video_url ?? $json.foreground_video_url ?? 'https://videos.videobgremover.com/public-videos/assets/ai-actor.mp4' }}"
            },
            {
              "name": "background_image_url",
              "type": "string",
              "value": "={{ $json.body?.background_image_url ?? $json.background_image_url ?? 'https://drive.google.com/uc?id=1DYJxUcuN5n4BT4YZnRKYmXuLNSCs5bPy' }}"
            },
            {
              "name": "source",
              "type": "string",
              "value": "webhook"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "set-manual-1",
      "name": "Sample URLs (Edit Here)",
      "type": "n8n-nodes-base.set",
      "position": [
        -820,
        1040
      ],
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "name": "foreground_video_url",
              "type": "string",
              "value": "https://videos.videobgremover.com/public-videos/assets/ai-actor.mp4"
            },
            {
              "name": "background_image_url",
              "type": "string",
              "value": "https://drive.google.com/uc?id=1DYJxUcuN5n4BT4YZnRKYmXuLNSCs5bPy"
            },
            {
              "name": "source",
              "type": "string",
              "value": "manual"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "merge-1",
      "name": "Merge Triggers",
      "type": "n8n-nodes-base.merge",
      "position": [
        -600,
        970
      ],
      "parameters": {
        "mode": "append",
        "options": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "http-1",
      "name": "1. Create Job (Upload Foreground)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -380,
        970
      ],
      "parameters": {
        "url": "https://api.videobgremover.com/api/v1/jobs",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "neverError": true,
              "responseFormat": "json"
            }
          }
        },
        "jsonBody": "={ \"video_url\": \"{{ $json.foreground_video_url }}\" }",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "X-API-Key",
              "value": "={{ $vars.VIDEOBGREMOVER_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "http-2",
      "name": "2. Start Image Composition",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -140,
        970
      ],
      "parameters": {
        "url": "=https://api.videobgremover.com/api/v1/jobs/{{ $json.id }}/start",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "neverError": true,
              "responseFormat": "json"
            }
          }
        },
        "jsonBody": "={\n  \"background\": {\n    \"type\": \"composition\",\n    \"composition\": {\n      \"template\": \"centered\",\n      \"background_type\": \"image\",\n      \"background_url\": \"{{ $('Merge Triggers').item.json.background_image_url }}\",\n      \"export_format\": \"h264\",\n      \"export_preset\": \"medium\"\n    }\n  }\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "X-API-Key",
              "value": "={{ $vars.VIDEOBGREMOVER_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "http-3",
      "name": "3. Check Job Status",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        100,
        970
      ],
      "parameters": {
        "url": "=https://api.videobgremover.com/api/v1/jobs/{{ $('1. Create Job (Upload Foreground)').item.json.id }}/status",
        "method": "GET",
        "options": {
          "response": {
            "response": {
              "neverError": true,
              "responseFormat": "json"
            }
          }
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "X-API-Key",
              "value": "={{ $vars.VIDEOBGREMOVER_KEY }}"
            }
          ]
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "if-complete",
      "name": "Is Complete?",
      "type": "n8n-nodes-base.if",
      "position": [
        300,
        970
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is_completed_condition",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "completed"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "download",
      "name": "4. Download Video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        520,
        830
      ],
      "parameters": {
        "url": "={{ $json.processed_video_url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "gdrive",
      "name": "5. Upload to Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        740,
        830
      ],
      "parameters": {
        "name": "=composed_video_{{ $('1. Create Job (Upload Foreground)').item.json.id }}_{{ new Date().getTime() }}.mp4",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {
          "simplifyOutput": true,
          "googleFileConvert": false
        },
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root"
        },
        "operation": "upload",
        "binaryPropertyName": "data"
      },
      "typeVersion": 3
    },
    {
      "id": "success-set",
      "name": "Build Success Response",
      "type": "n8n-nodes-base.set",
      "position": [
        960,
        830
      ],
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "name": "final_result",
              "type": "object",
              "value": "={{ {\n  success: true,\n  job_id: $('1. Create Job (Upload Foreground)').item.json.id,\n  export_id: $('2. Start Image Composition').item.json.export_id,\n  google_drive_id: $json.id,\n  google_drive_url: $json.webViewLink,\n  download_url: $('3. Check Job Status').item.json.processed_video_url,\n  message: 'Video composed with image background successfully and saved to Google Drive',\n  filename: $json.name,\n  video_length_seconds: $('3. Check Job Status').item.json.length_seconds,\n  source: $('Merge Triggers').item.json.source\n} }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "if-failed",
      "name": "Has Failed?",
      "type": "n8n-nodes-base.if",
      "position": [
        500,
        1200
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is_failed_condition",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "failed"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "wait-20",
      "name": "Wait 20s",
      "type": "n8n-nodes-base.wait",
      "position": [
        720,
        1340
      ],
      "parameters": {
        "unit": "seconds",
        "amount": 20
      },
      "typeVersion": 1.1
    },
    {
      "id": "error-set",
      "name": "Build Error Response",
      "type": "n8n-nodes-base.set",
      "position": [
        720,
        1200
      ],
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "name": "final_result",
              "type": "object",
              "value": "={{ {\n  success: false,\n  job_id: $('1. Create Job (Upload Foreground)').item.json.id,\n  error: $json.error || 'Video composition with image background failed',\n  status: $json.status,\n  message: 'Failed to compose video with image background',\n  source: $('Merge Triggers').item.json.source\n} }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "if-webhook",
      "name": "From Webhook?",
      "type": "n8n-nodes-base.if",
      "position": [
        1180,
        1010
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is_webhook_condition",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.final_result?.source ?? $json.source }}",
              "rightValue": "webhook"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "respond",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1400,
        920
      ],
      "parameters": {
        "responseBody": "={{ $json.final_result ?? $json }}",
        "responseCode": 200
      },
      "typeVersion": 1.1
    },
    {
      "id": "end-manual",
      "name": "Manual Test Complete",
      "type": "n8n-nodes-base.set",
      "position": [
        1400,
        1100
      ],
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "name": "final_result",
              "type": "object",
              "value": "={{ $json.final_result ?? $json }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    }
  ],
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "Wait 20s": {
      "main": [
        [
          {
            "node": "3. Check Job Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has Failed?": {
      "main": [
        [
          {
            "node": "Build Error Response",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 20s",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Complete?": {
      "main": [
        [
          {
            "node": "4. Download Video",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Has Failed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "From Webhook?": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Manual Test Complete",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "Sample URLs (Edit Here)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Triggers": {
      "main": [
        [
          {
            "node": "1. Create Job (Upload Foreground)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Extract Webhook Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4. Download Video": {
      "main": [
        [
          {
            "node": "5. Upload to Google Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3. Check Job Status": {
      "main": [
        [
          {
            "node": "Is Complete?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Error Response": {
      "main": [
        [
          {
            "node": "From Webhook?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Webhook Data": {
      "main": [
        [
          {
            "node": "Merge Triggers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Success Response": {
      "main": [
        [
          {
            "node": "From Webhook?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sample URLs (Edit Here)": {
      "main": [
        [
          {
            "node": "Merge Triggers",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "5. Upload to Google Drive": {
      "main": [
        [
          {
            "node": "Build Success Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. Start Image Composition": {
      "main": [
        [
          {
            "node": "3. Check Job Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. Create Job (Upload Foreground)": {
      "main": [
        [
          {
            "node": "2. Start Image Composition",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

相关工作流