Deno Deploy의 ffmpeg

ffmpeg는 왜 Deno Deploy에서 실행되지 않을까요? 서브프로세스가 없으니, API를 호출하세요.

Deno Deploy는 서브프로세스와 FFI가 없는 V8 아이솔레이트에서 코드를 실행하기 때문에 ffmpeg 바이너리를 실행할 수 없어요. 대신 fetch()로 Fotovid를 호출하세요 — 인코딩은 다른 곳에서 처리되고, 결과 파일의 https 링크로 응답이 돌아와요.

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,
      params: { type: "image", watermark_image_url: logoUrl, position: "bottom-right" },
    }),
  });

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

아이솔레이트 모델에서는 ffmpeg가 아예 실행되지 않아요

Deno Deploy는 CPU 부하가 큰 미디어 인코딩이 아니라 빠른 엣지 로직을 위해 V8 아이솔레이트 위에 구축됐어요. 네이티브 바이너리를 실행할 서브프로세스 API도, 불러올 FFI도 없기 때문에 ffmpeg 프로세스는 애초에 시작되지 않아요. 이건 설정 플래그나 권한 부여로 해결할 문제가 아니에요 — ffmpeg에 필요한 기본 요소 자체가 아이솔레이트 샌드박스에 존재하지 않으니까요. ffmpeg의 WebAssembly 포팅 버전이 있긴 하지만, 실제 영상을 처리하면 아이솔레이트의 CPU와 메모리 한도를 훌쩍 넘어버리고 대용량 파일을 스트리밍으로 처리하지도 못해요.

  • 서브프로세스 없음: 아이솔레이트 안에서는 Deno.Command와 child_process 모두 ffmpeg 바이너리를 실행할 수 없어요.
  • FFI 없음: 네이티브 ffmpeg 라이브러리를 dlopen으로 불러와 직접 호출할 수 없어요.
  • Wasm ffmpeg는 실제 영상에서 아이솔레이트의 CPU/메모리를 모두 소진하고, 대용량 입력을 스트리밍으로 처리하지 못해요.
  • 이 플랫폼은 몇 초씩 걸리는 인코딩 작업이 아니라 짧은 엣지 요청에 맞춰 튜닝되어 있어요.

Deno Deploy에서 ffmpeg를 돌리려는 흔한 시도들

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

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

세 단계로 끝내는 첫 호출

  1. 1
    무료 API 키 발급받기

    가입 후 키를 생성하세요 — 시작할 때 카드 등록은 필요 없어요. key ID와 secret을 받아서 p6_<key_id>:<secret> 형식의 Bearer 토큰으로 조합해요. 이걸 Deno Deploy 환경 변수에 저장해두면, 바이너리를 배포하지 않고도 아이솔레이트에서 인증할 수 있어요.

  2. 2
    워터마크 엔드포인트로 POST 요청 보내기

    Deno 핸들러에서 일반적인 fetch로 Bearer 토큰을 담아 https://api.fotovid.co/v1/video/watermark에 POST 요청을 보내세요. 표준 요청 형식을 그대로 사용하면 돼요: 입력 영상의 HTTPS URL을 가리키는 source_url, 그리고 워터마크를 설명하는 params 객체 — type(image, text, combo 중 하나), watermark_image_url 또는 text, bottom-right 같은 position, opacity, scale이에요. Fotovid가 소스를 가져와 자체 인프라에서 ffmpeg를 실행하고, 아이솔레이트가 타임아웃되기 전에 응답을 돌려줘요.

  3. 3
    반환된 URL 사용하기

    응답은 플랫 JSON 형태예요: id, type, 그리고 완성된 Fotovid 호스팅 영상을 가리키는 url, 여기에 expires_at과 duration이 더해져요. 이 url을 그대로 클라이언트에 넘기거나, 서버 사이드에서 가져와 이미 사용 중인 버킷에 직접 저장하면 돼요. 대부분의 작업은 1 credit이 들어서, 워터마크 호출 한 번이면 잔액에서 credit 1개가 차감돼요.

자주 묻는 질문

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

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