Supabase Edge Functions × ffmpeg

Supabase Edge Functions의 ffmpeg, HTTPS 호출 한 번으로 오프로드하세요.

Edge Functions는 Deno에서 실행되기 때문에 ffmpeg 바이너리를 실행할 child_process가 없어요. 함수는 그대로 두고 인코딩만 HTTPS 호출로 넘긴 뒤, 완성된 파일 URL을 돌려받으세요.

// supabase/functions/watermark/index.ts
Deno.serve(async (req) => {
  const { videoUrl, logoUrl } = await req.json();

  const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${Deno.env.get("FOTOVID_API_KEY")}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      source_url: videoUrl, // a Supabase Storage signed URL works here
      params: { type: "image", watermark_image_url: logoUrl, position: "bottom-right" },
    }),
  });

  const { url } = await res.json();
  return Response.json({ url });
});

Edge Function에서 ffmpeg가 동작하지 않는 이유

Supabase Edge Functions는 Deno 런타임 위에서 실행되는데, 여기에는 child_process나 subprocess API가 없어요. 그래서 바이너리를 번들에 넣어도 ffmpeg를 실행시킬 방법 자체가 없어요. 게다가 CPU와 실행 시간 제한은 가벼운 요청 로직을 기준으로 설계되어 있어서, 미디어 인코딩에 필요한 수 초에서 수 분 단위의 지속적인 작업에는 맞지 않아요. Storage 트리거는 파일이 업로드되는 순간 작업을 *시작*하기에는 더할 나위 없이 좋지만, 실제 트랜스코딩은 진짜 인코더를 돌릴 수 있는 곳에서 이뤄져야 해요.

  • Deno에는 child_process / subprocess가 없어요 — ffmpeg 바이너리를 실행할 수 없어요
  • CPU와 실행 시간 제한은 빠른 로직 처리를 기준으로 하며, 미디어 인코딩을 겨냥하지 않아요
  • Storage 트리거는 작업을 시작하기엔 이상적이지만, 실제 작업은 다른 곳에서 실행돼야 해요
  • 정적 ffmpeg 빌드, WASM, 레이어 모두 크기 문제가 아니라 런타임 자체에서 막혀요

Supabase에서 ffmpeg를 돌리는 다른 방법들

Fotovid 이전에는 이런 선택지들이 전부였어요 — 하나같이 직접 떠안고 싶지 않은 일이죠.

OptionWhat it costs youVerdict
Supabase 함수에 ffmpeg를 번들로 포함시키기Deno에는 child_process가 없어서 바이너리를 실행할 수 없어요
컨테이너나 VM을 직접 호스팅하기상시 가동 비용에 패치, 스케일링, 모니터링까지 떠안아야 해요
잡 큐 + 워커 운영하기큐, 워커, 재시도, 데드레터 처리까지 새 인프라가 통째로 필요해요
브라우저에서 트랜스코딩하기 (WASM)느리고 메모리를 많이 먹으며, 모바일에서는 크래시가 나요
Fotovid API 호출하기HTTPS 요청 한 번이면 끝 — 실행하거나 패키징하거나 스케일링할 것이 없어요
How it works

세 단계로 끝내는 첫 호출

  1. 1
    무료 API 키 받기

    가입하고 키를 발급받으세요. Fotovid는 사용량 크레딧으로 운영돼요 — $1 = 100 credits이고 대부분의 작업은 1 credit이 들어요 — 그러니 대표 기능인 워터마크 호출을 연결해서 비용을 쓰기 전에 전체 흐름을 먼저 테스트해 볼 수 있어요.

  2. 2
    함수에서 워터마크 엔드포인트 호출하기

    같은 Edge Function 안에서(또는 업로드 시 발동한 Storage 트리거에서) Authorization: Bearer p6_<key_id>:<secret> 헤더를 붙여 https://api.fotovid.co/v1/video/watermark로 POST 요청을 보내세요. 표준 envelope를 담아 보내면 되는데, 영상의 HTTPS URL을 가리키는 source_url — Supabase Storage의 signed URL을 그대로 써도 동작해요 — 그리고 오버레이를 설명하는 params 객체를 함께 보내세요. 예를 들면 type은 image, watermark_image_url, bottom-right 같은 position, 그리고 opacity나 scale이죠. 함수는 HTTPS 요청 한 번만 보내면 되고, ffmpeg 작업은 Fotovid가 플랫폼 밖에서 처리하므로 Deno의 CPU나 시간 제한을 신경 쓸 일이 없어요.

  3. 3
    호스팅된 결과 URL 사용하기

    응답은 단순한 JSON 형태로 id, type, 그리고 완성된 Fotovid 호스팅 영상을 가리키는 url을 담고 있어요. 그 url을 호출자에게 그대로 전달하거나, 다운로드해서 Supabase Storage에 직접 사본을 저장하세요. 호스팅된 URL은 expires_at을 포함한 임시 URL이니, 장기간 보관이 필요하다면 반드시 사본을 남겨두세요.

자주 묻는 질문

API 호출 한 번으로 배포하세요

무료 키를 발급받고 5분 안에 첫 호출을 완료해보세요.