화질 손실 없이 영상을 크롭하는 방법

일반적인 크롭은 프레임을 재인코딩하므로 손실을 최소로 줄여야 합니다. 원본에서 한 번만 크롭하고 다시 확대하지 마세요. Sume의 편집별 인코딩 방식도 다룹니다.

읽는 시간 5분Sume
전체 글

일반적인 크롭은 영상의 프레임을 디코딩해 잘라 낸 뒤 다시 인코딩하며, 이 재인코딩은 대부분의 경우 화질을 어느 정도 떨어뜨립니다. 그래서 목표는 화질 손실을 최대한 줄이는 것입니다. 원본에서 한 번만 크롭하되 다른 픽셀 변경과 같은 패스에서 처리하고, 크롭한 크기를 다시 확대하지 말고 그대로 두세요. Sume에서 크롭은 POST /v1/video-filter Job 하나이며, 현재 이 Job은 클립을 libx264로 한 번 재인코딩합니다.

아래 내용은 2026-09-27에 확인한 영상 필터, 영상 트림, 타임라인 합성 문서, Sume API 레퍼런스, FFmpeg의 ffmpeg, 코덱, 비트스트림 필터 문서를 기준으로 합니다. 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.

크롭하면 왜 영상이 재인코딩되나요?

FFmpeg 문서가 그 경계를 설명합니다. 스트림 카피는 패킷을 디코딩, 필터링, 인코딩하지 않고 옮기므로 화질 손실이 없지만, 필터는 디코딩된 프레임에서 동작하므로 필터를 적용할 수 없습니다. 크롭은 필터이므로 트랜스코딩이 필요하고, 트랜스코딩은 대부분의 경우 화질을 떨어뜨립니다. 자막을 입히는(번인) 작업도 픽셀을 바꾸므로 같은 이유가 적용됩니다.

FFmpeg에는 좁은 예외가 두 가지 있습니다. 하나는 libx264의 무손실 모드입니다. 다른 하나는 인코딩된 스트림을 디코딩하지 않고 다루는 h264_metadata와 hevc_metadata 비트스트림 필터로, 스트림의 SPS 헤더에 크롭 오프셋을 설정할 수 있습니다. 저장된 프레임은 인코딩된 그대로 두고, 헤더가 그중 어느 부분을 보여 줄지 표시하는 방식입니다. Sume의 도구는 두 방법 모두 쓰지 않으며, codec, crf 같은 인코더 필드를 거부합니다.

Sume의 편집마다 화질이 얼마나 떨어지나요?

아래 단계는 각각 한 번의 패스입니다. 단계를 이어 가면 패스가 늘어나고, 손실이 있는 패스는 앞선 패스의 손실 위에 쌓입니다.

영상 트림, 영상 필터, 타임라인 합성, 현재 실행되는 Sume의 컴파일러 코드 기준, 2026-09-27 확인.
편집화면에 생기는 일
precision: "keyframe" 트림스트림 카피. 재인코딩도 화질 손실도 없음. 컷이 GOP 하나만큼 일찍 시작될 수 있음.
precision: "exact" 트림(기본값)libx264, CRF 18로 재인코딩.
영상 필터: ops[]의 crop 또는 dim과 filtergraph프로그램이 op와 필터를 몇 개 실행하든 libx264, CRF 20으로 한 번 재인코딩.
타임라인 합성과 Timeline 렌더libx264, CRF 20으로 재인코딩.

Sume로 영상을 한 번의 패스로 크롭하려면 어떻게 하나요?

크롭은 POST /v1/video-filter의 ops[] 항목으로 보내세요. 사각형은 소스 프레임에 대한 비율로 지정합니다. x와 y는 0에서 1, width와 height는 0.05에서 1이며, x + width와 y + height는 1 이하여야 합니다. 컴파일러는 yuv420p에 맞게 짝수로 반올림합니다. ops[]에는 op를 최대 8개까지 넣을 수 있고, filtergraph보다 먼저 실행됩니다. 다음 예시는 가로로 넓은 클립의 가운데 절반을 남깁니다.

  • 클립은 워크스페이스에 있는 최대 300초 길이의 media.sume.com 파일이어야 합니다. 이 규칙은 엔드포인트별로 받는 URL에서 설명합니다. PQ와 HLG(HDR) 소스는 hdr_source_unsupported로 거부됩니다.
  • 먼저 POST /v1/video-filter/check로 프로그램을 무료로 검사하세요. 이 검사는 Job을 만들지 않고 크레딧도 예약하지 않습니다.
  • 필터 출력은 프로그램이 바꾸지 않는 부분에서만 소스의 기하 정보를 이어받으므로, 출력은 크롭한 크기를 유지합니다. 소스는 그대로입니다.
curl -X POST https://api.sume.com/v1/video-filter \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: crop-center-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/wide.mp4",
    "ops": [{ "op": "crop", "x": 0.25, "y": 0, "width": 0.5, "height": 1 }]
  }'

여러 번 편집해도 손실을 작게 유지하려면 어떻게 하나요?

  • 모든 픽셀 변경을 필터 Job 하나에 담으세요. crop과 dim은 ops[]로, 허용 목록에 있는 다른 필터는 filtergraph에 넣습니다. 이름은 필터 허용 목록에 나와 있습니다.
  • 최종 크기로 한 번만 스케일하세요. 합성 문서는 샷이 두 번 스케일되지 않도록 output을 조립할 타임라인에 맞추라고 안내합니다.
  • 시작 지점이 정확할 필요가 없으면 precision: "keyframe"으로 자르세요. 위 표의 Sume 편집 중 스트림을 복사하는 것은 이것뿐입니다. output은 받을 수 없고, 결과의 actual_start_seconds가 컷이 실제로 시작하는 지점을 알려 줍니다.
  • 새 버전은 모두 원본에서 시작하세요. 트림과 필터는 소스를 절대 바꾸지 않으므로, 재인코딩한 파일을 또 재인코딩할 이유가 없습니다.

재인코딩 없이 회전하거나 트림할 수 있나요?

트림은 가능합니다. keyframe 트림은 스트림을 복사합니다. 회전은 픽셀 변경 대신 메타데이터 변경으로 처리할 수 있습니다. FFmpeg의 -display_rotation은 회전 메타데이터를 설정하며, 영상을 트랜스코딩하지 않고 복사할 때 먹서(muxer)가 지원하면 그 메타데이터가 출력 파일에 기록됩니다. Sume의 필터는 영상을 90도 회전하는 방법에서처럼 픽셀을 회전하므로, 인코딩이 한 번 더 일어납니다.

출처

관련 글

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

미디어 도구 글 전체 보기

작성자 Sume