영상을 용량별로 나누는 방법: 재인코딩 없이 분할하기

영상을 용량별로 나누려면 영상 길이에 한도 ÷ 파일 크기를 곱해 조각 길이를 구하고, 그 길이로 재인코딩 없이 자른 뒤 각 조각의 크기를 확인하세요.

읽는 시간 5분Sume
전체 글

영상을 파일 크기(용량) 기준으로 나누려면 한도 안에 몇 초가 들어가는지 계산하고, 영상을 그 길이의 조각으로 자르세요. 조각 길이 = 영상 길이 × 한도 ÷ 파일 크기이며, 여기서 안전 여유분을 뺍니다. 재인코딩 없이 자르세요. 그러면 각 조각이 원본 바이트 중 대략 자기 몫과 원래 화질을 유지합니다. 그런 다음 각 조각의 크기를 확인하세요.

아래 Sume 관련 내용은 영상 트림과 영상 검사 문서, Sume API 레퍼런스를, FFmpeg 관련 내용은 ffmpeg, 포맷, 코덱 문서를 바탕으로 하며, 모두 2026-09-28에 확인했습니다. 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.

조각 하나의 길이는 어떻게 계산하나요?

목표는 한도보다 낮게 잡고, 조각 수는 올림하고, 고르게 나누세요. 1,200초, 240 MB짜리 영상을 50 MB 한도에 맞추는 예는 다음과 같습니다.

  • 이 파일은 평균 초당 240 ÷ 1,200 = 0.2 MB입니다.
  • 한도보다 10% 낮은 45 MB를 목표로 잡습니다. 240 ÷ 45 = 5.3이므로 1,200 ÷ 6 = 200초짜리 조각 6개로 자르면, 조각마다 약 40 MB가 됩니다.
  • 여유분은 남겨 두세요. 비트레이트는 영상 안에서도 달라지며, 움직임이 많은 구간은 평균보다 초당 더 많은 바이트를 담을 수 있습니다.

Sume로 영상을 용량별로 나누려면 어떻게 하나요?

영상은 앞서 실행한 Sume Job의 출력처럼 이미 워크스페이스에 있는 media.sume.com 파일이어야 합니다. Sume에는 컴퓨터에 있는 파일을 올리는 공개 업로드 경로가 없습니다(엔드포인트별로 받는 URL). 또한 현재 코드에서 트림과 검사는 300 MiB가 넘는 소스 파일을 source_too_large로 거부하므로, 그보다 큰 파일은 아래에서 설명하는 대로 FFmpeg에서 나누세요.

  • 먼저 프로브하세요. frames: false를 담은 POST /v1/video-inspect는 probe.size_bytes와 probe.duration_seconds를 반환하며, 프로브는 과금되지 않습니다. 영상 비트레이트 확인 방법에서 보듯이 이 두 값으로 비트레이트도 구할 수 있습니다.
  • 각 조각은 POST /v1/video-trim에 precision: "keyframe"을 주어 자르세요. 재인코딩 없는 스트림 카피입니다. 조각 i(0부터 셈)는 start = i × 조각 길이, duration = 조각 길이로 둡니다.
  • 모든 출력을 같은 방법으로 프로브해 size_bytes를 한도와 비교하세요. 한도를 넘는 조각이 있으면 그 구간을 더 짧은 조각 두 개로 나누세요.
  • 복사한 조각은 최대 GOP(group of pictures) 하나만큼 일찍 시작될 수 있으므로, 앞 조각의 한순간을 반복합니다. 실제 시작 지점은 결과의 actual_start_seconds에 나옵니다.
curl -X POST https://api.sume.com/v1/video-trim \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: webinar-size-part-2" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/webinar.mp4",
    "start": 400,
    "duration": 200,
    "precision": "keyframe"
  }'

왜 조각마다 재인코딩하지 않나요?

복사한 조각은 원본 바이트 중 대략 자기 몫을 유지하지만, 재인코딩한 조각은 크기를 예측할 수 없기 때문입니다. 기본값인 exact 트림은 현재 코드에서 libx264, CRF 18로 재인코딩하는데, FFmpeg 문서는 CRF를 고정 품질 모드라고 설명합니다. 트림에는 비트레이트나 목표 크기 필드도 없습니다. 재인코딩한 파일이 오히려 더 커질 수 있는 이유는 영상 용량 줄이는 방법에서 설명합니다.

한도는 어떻게 되나요?

조각 하나가 트림 Job 하나이며 요금은 Job당 $0.02이고, 기본적으로 5.5% 에이전트 수수료가 더해집니다.

영상 트림, 영상 검사, Sume의 현재 코드 기준, 2026-09-28 확인.
한도값
소스 길이최대 1,800초. 더 길면 source_duration_exceeded로 실패
소스 파일 크기300 MiB 초과 시 source_too_large로 실패(현재 코드)
조각 하나0.2–900초. 한도가 커도 조각은 900초 이하여야 함
크기나 비트레이트 설정트림에는 없음
프로브frames: false면 과금 없음

FFmpeg에서 영상을 용량별로 나누려면 어떻게 하나요?

내 컴퓨터에서는 FFmpeg의 segment 먹서(muxer)가 영상을 거의 고정된 길이의 개별 파일로 나눠 쓰므로, 계산한 조각 길이를 지정하세요. -codec copy를 쓰면 아무것도 재인코딩되지 않고 모든 세그먼트가 키프레임에서 시작하므로, 각 조각은 그 길이보다 조금 길거나 짧아집니다.

FFmpeg에는 출력 하나의 쓰기를 바이트 한도에서 멈추는 -fs도 있습니다. 문서에 따르면 파일이 "slightly more than the requested file size"(요청한 파일 크기보다 약간 크게) 나오므로, 한도보다 낮게 설정하세요.

ffmpeg -i input.mp4 -codec copy -map 0 -f segment -segment_time 200 -reset_timestamps 1 part%03d.mp4

출처

관련 글

미디어 도구 카테고리의 다른 글

미디어 도구 글 전체 보기

작성자 Sume