yuv420p10le vs yuv420p 차이: 8비트와 10비트 픽셀 포맷

yuv420p와 yuv420p10le는 둘 다 planar YUV 4:2:0입니다. yuv420p는 샘플당 8비트를, yuv420p10le는 10비트를 16비트 워드에 리틀 엔디언으로 저장합니다.

읽는 시간 5분Sume
전체 글

yuv420p와 yuv420p10le는 같은 픽셀 배치를 두 가지 비트 심도로 저장하는 포맷입니다. 둘 다 평면(planar) 방식의 YUV 4:2:0으로, 전체 해상도의 루마(Y) 평면에 루마 샘플 2×2 블록마다 Cb 샘플 하나와 Cr 샘플 하나를 더한 구조입니다. yuv420p는 샘플당 8비트를 저장하고, yuv420p10le는 샘플당 10비트를 저장하되 각 샘플을 16비트 리틀 엔디언 워드 하나에 담습니다. 이름의 "10le"가 바로 이 뜻입니다.

포맷 정의는 FFmpeg의 픽셀 포맷 레퍼런스와 ffmpeg, 필터, 코덱 문서에서, 플랫폼 관련 내용은 YouTube, X, Vimeo의 자체 페이지에서, Sume 관련 내용은 영상 트림, 영상 필터, 영상 검사 문서와 Sume API 레퍼런스에서 가져왔으며, 모두 2026-09-28에 확인했습니다. 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.

yuv420p와 yuv420p10le는 무엇이 다른가요?

비트 심도가 다르고, 그에 따라 각 샘플을 저장하는 방식도 다릅니다. FFmpeg 레퍼런스는 yuv420p를 "planar YUV 4:2:0, 12bpp"로, yuv420p10le를 리틀 엔디언인 "planar YUV 4:2:0, 15bpp"로 적고 있으며, colorspace 필터는 yuv420p를 "YUV 4:2:0 planar 8-bits", 그 10비트 버전을 "YUV 4:2:0 planar 10-bits"라고 부릅니다. 비트가 많을수록 색마다 표현할 수 있는 단계가 많아집니다. Vimeo 가이드는 비트 심도가 낮을수록 "sharp delineations between color changes"(색이 바뀌는 곳의 뚜렷한 경계)가 생기기 쉽다고 설명하고, "a bit depth of 10 or greater for the highest quality results."(최고 품질을 위한 10 이상의 비트 심도)를 권장합니다.

배포 규격이 정해 두는 것은 4:2:0 쪽입니다. YouTube의 권장 업로드 설정은 4:2:0 크로마 서브샘플링을 명시하고, X의 미디어 문서는 YUV 4:2:0만 지원한다고 밝힙니다. 이 글의 두 포맷은 모두 4:2:0입니다.

FFmpeg의 pixfmt.h 레퍼런스와 필터 문서, 현재 실행되는 Sume의 인코더 설정 기준, 2026-09-28 확인.
속성yuv420pyuv420p10le
배치평면(planar) 방식: Y, Cb, Cr 평면이 따로 있음같음
크로마 샘플Y 샘플 2×2 블록마다 Cb 하나, Cr 하나같음
샘플당 비트810(패딩을 더해 16비트에 저장)
바이트 순서필요 없음: 샘플당 한 바이트리틀 엔디언
픽셀당 평균 비트(FFmpeg)1215
현재 Sume 재인코딩의 출력 포맷예아니요

yuv420p10le는 HDR과 같은가요?

아니요, 같지 않습니다. 픽셀 포맷은 샘플마다 몇 비트인지를 나타낼 뿐이고, 영상이 HDR인지는 전달 특성(transfer function)에 달려 있으며 파일은 이를 별도의 색 메타데이터로 담습니다. 10비트 파일도 SDR일 수 있습니다. 예를 들어 Vimeo는 비트 심도가 10 이상이고 전달 특성이 PQ(SMPTE 2084)나 HLG인 파일만 HDR로 봅니다.

Sume의 프로브는 둘을 따로 알려 줍니다. frames: false를 넣은 POST /v1/video-inspect는 Sume에 호스팅된 클립을 과금 없이 프로브만 하는 검사입니다. 그 결과의 probe에는 pix_fmt, color_transfer, hdr이 담기며, API 레퍼런스는 hdr을 PQ와 HLG 전달 특성일 때 true로 정의합니다. 프로브의 나머지 필드는 영상의 길이, 해상도, fps 확인하기에서 다루고, 파일의 픽셀 포맷을 출력하는 ffprobe 명령은 영상 코덱 확인하는 방법에서 볼 수 있습니다.

FFmpeg로 yuv420p10le를 yuv420p로 변환하려면 어떻게 하나요?

-pix_fmt yuv420p를 넣어 영상을 재인코딩하세요. FFmpeg 문서에 따르면 필터는 디코딩된 프레임에서 동작하므로 스트림 카피로는 필터를 적용할 수 없고, 그래서 영상은 다시 인코딩됩니다. 오디오는 그대로 복사할 수 있습니다.

  • -pix_fmt 옵션은 출력 픽셀 포맷을 정합니다. 지정한 포맷을 인코더가 받을 수 없으면 FFmpeg는 경고를 출력하고 인코더가 지원하는 다른 포맷을 고릅니다. 포맷 이름 앞에 +를 붙이면 그 대신 오류를 내고 종료합니다.
  • 필터 체인 안에서는 format 필터가 같은 변환을 합니다. FFmpeg 문서의 예시는 format=pix_fmts=yuv420p입니다.
  • 대신 libx264로 10비트 인코딩을 할 수 있는지는 빌드에 따라 다릅니다. FFmpeg 코덱 문서에 따르면 x264는 8비트에서 10비트까지의 색 공간을 지원하며, 정확한 비트 심도는 x264를 configure할 때 정해집니다.
  • 평탄한 영역에서는 밴딩이 생기는지 살펴보세요. FFmpeg 문서는 8비트 색 심도로 절삭(truncation)할 때 거의 평탄한 영역에 이따금 생기는 밴딩 아티팩트를 설명합니다.
  • 픽셀 포맷을 바꾼다고 HDR이 SDR로 바뀌지는 않습니다. 그러려면 톤 매핑이 필요합니다. FFmpeg의 tonemap 필터 문서는 zscale과 tonemap으로 이루어진, format=yuv420p로 끝나는 체인을 보여 줍니다.
ffmpeg -i input.mp4 -c:v libx264 -pix_fmt yuv420p -c:a copy output.mp4

Sume는 어떤 픽셀 포맷으로 출력하나요?

yuv420p입니다. 영상 트림 문서는 libx264로 프레임 단위까지 정확하게 재인코딩하는 기본값 exact 트림에 이 포맷을 명시하고, 현재 코드에서는 영상 필터, 타임라인 합성, Timeline 렌더도 -pix_fmt yuv420p로 인코딩합니다. 다른 포맷을 고르는 필드는 없습니다. 예를 들어 트림과 필터는 codec, crf 같은 인코더 필드를 ffmpeg_fields_rejected로 거부합니다.

  • keyframe 트림은 예외입니다. 스트림 카피이므로 결과는 소스의 픽셀 포맷을 그대로 유지합니다.
  • 필터의 crop op는 yuv420p에 맞게 짝수로 반올림되고, Timeline 출력의 각 변은 짝수 정수여야 합니다. 크기가 짝수로 유지되는 이유는 FFmpeg height not divisible by 2 오류 원인과 해결에서 설명합니다.
  • 두 도구는 HDR을 변환하지 않고 거부합니다. 현재 코드에서 exact 트림은 yuv420p 출력이 PQ와 HLG 소스를 밋밋하게 만들어 버리므로 이런 소스를 hdr_source_unsupported로 거부하고, API 레퍼런스에 따르면 영상 필터도 이런 소스를 거부합니다. HDR 클립과 트림의 나머지 설정은 HEVC를 H.264로 변환하기에서 다룹니다.

출처

관련 글

개발자 카테고리의 다른 글

개발자 글 전체 보기

작성자 Sume