요약
H.264는 사람 눈이 놓치는 정보와 프레임 사이의 중복을 버려 영상을 수천 배로 줄입니다.
시드 발라가 2016년에 쓴 해설 글입니다. 인터넷 동영상부터 블루레이, 스마트폰, 드론까지 두루 쓰이는 영상 압축 표준 H.264의 원리를 비유와 예시로 풀어 줍니다.
왜 중요한가
- 압축이 없으면 1080p 60Hz 영상은 초당 약 370MB를 차지해, 50GB 블루레이에 2분 남짓만 들어갑니다.
- 글이 다루는 개념은 H.264에만 쓰이지 않고 영상 압축 전반에 통합니다.
핵심 내용
- 5초 분량 애플 홈페이지 예시에서 원본 약 1.2GB가 175KB가 되며, 같은 화면의 PNG 한 장(1,015KB)보다 작습니다.
- 양자화(세밀한 디테일에 해당하는 고주파 성분을 잘라내는 과정)는 정보를 2%까지 줄여도 차이가 거의 드러나지 않습니다.
- 크로마 서브샘플링(색 정보의 해상도를 낮추는 기법)은 눈이 색 차이에 둔한 점을 이용해 대역폭을 약 절반으로 줄입니다.
- 움직임 보상은 화면을 16×16 블록으로 나눠, 다른 프레임에서 블록이 옮겨 간 방향과 거리만 기록합니다.
- 마지막으로 엔트로피 부호화(데이터 손실 없이 중복을 줄이는 방식)가 남은 반복을 한 번 더 압축합니다.
HN 반응
- x264(H.264 소프트웨어 인코더) 개발에 참여한 이용자의 경험담에 이어, 같은 비트레이트에서 x264가 하드웨어 인코더보다 화질이 훨씬 낫다는 의견이 이어졌습니다.
- 후속 코덱 AV1이 이미 주류라는 주장과, 하드웨어 디코딩을 지원하지 않는 기기가 많아 아직 이르다는 반론이 맞섰습니다.
2011년경 제이슨 개럿-글레이저(DarkShikari라는 이름으로 더 유명합니다)와 함께 x264가 더 많은 코어를 활용하도록 하는 패치(슬라이스 스레드 방식 룩어헤드)를 작업하는 기쁨을 누렸습니다. 당시 그는 소니와 함께 플레이스테이션 게임 스트리밍 서비스를 최적화하고 있었고, 이 패치는 프레임을 더 많은 코어에 나눠 병렬 작업을 늘리고, 타일 단위 작업이 다시 하나의 프레임으로 합쳐진 뒤의 스케줄링과 수렴을 더 똑똑하게 처리해서, 코어 수가 같은 시스템에서도 인코딩 지연(게임 스트리밍에서는 치명적입니다)을 낮출 가능성이 있었습니다. 그때 저희는 트랜스코딩에 물리 코어 48개짜리 서버를 쓰고 있었는데, 단일 NUMA 공간에서는 당시 꽤 드문 사양이라 이걸 테스트해 볼 인스턴스가 따로 없었습니다. 그래서 스레드 수를 아주 높게 잡고 인코딩을 몇 번 돌려 플레임그래프를 추적했고, (직접 컴파일한 버전에서 뽑은) 계측 프로파일을 보내 핵심 작업이 어디서 이뤄지는지 보여 줬습니다. 그는 그걸 바탕으로 모션 추정 코드를 최적화했는데, 첫 시도부터 CPU 사용량이 완벽하게 고르게 퍼졌고 인코딩 속도도 약 24코어까지 올라갔습니다(그전에는 8코어 근처에서 막혔고 코어 하나만 뜨겁게 돌았던 걸로 기억합니다). 덕분에 이 프로젝트가 얼마나 특이하고 복잡한지, 특히 모션 추정, 양자화, 지각 압축 같은 것들이 얼마나 저수준이고 고급 기술인지 엿볼 수 있었습니다. 우리가 거의 신경 쓰지도 않는 물건 안에 영리한 기법이 그렇게나 많이 들어 있다는 게 지금도 마법 같습니다. 그 사람들은 그때도 이미 x265를 작업하고 있었습니다.
그의 블로그 Diary of an x264 developer도 정말 재미있게 읽었습니다. 그 코드베이스가 얼마나 대단했는지 알고 싶은 분께 추천합니다.
[1] https://github.com/mstorsjo/x264/blob/master/doc/threads.txt
(수정: 2012년에 소니가 인수한 곳은 Gaikai였고, 이것이 PlayStation Now의 기반이 되었습니다.)
인코딩에 CPU를 여러 개 쓰는 건 역사가 아주 깁니다. 1994년 DirecTV용으로 나온 초기 C-Cube MPEG-1/MPEG-2 실시간 인코더는 칩 8개를 병렬로 돌려 704x480을 인코딩했습니다(프로세서가 60MHz밖에 안 돼서 어쩔 수 없었습니다). 칩마다 이미지의 슬라이스 하나를 맡아 인코딩했고, 칩 사이에 보조 버스를 두어 복원된 영상을 주고받게 해서 모션 벡터가 칩 간 이미지 경계를 넘나들 수 있게 했습니다.
다음은 VME 버스 개발 보드 사진입니다. 칩 10개를 병렬로 지원하도록 보드 두 장을 샌드위치처럼 겹쳤습니다(사진에는 한 장만 나와 있습니다).
https://www.w6rz.net/scorpio.jpg
지상파 디지털 TV(ATSC)용 최초의 실시간 HDTV 인코더는 해리스가 IBM 인코더 칩으로 만들었습니다. 1920x1080을 인코딩하는 데 칩 6개가 필요했습니다. IBM 칩에는 보조 버스가 없어서 모션 벡터가 칩 담당 이미지 경계 안에 갇혀 있는 게 눈에 보일 정도였습니다(이 경우 타일 6개가 아래처럼 배열되어 있었습니다).
맞아요, 그 무렵 인텔이 막 Quick Sync 기술을 내놓았고, 몇몇 업체는 인텔 CPU 4개를 PCIe 보드에 얹어서 영상 인코딩에 쓰기도 했어요! Matrox도 맞춤형 프로세서와 보드로 영상 압축과 편집·합성을 하면서 이 시장에서 꽤 큰 몫을 차지하고 있었고요.
"전력 효율"이 더 좋긴 했지만, 엔비디아와 인텔의 하드웨어 솔루션은 같은 비트레이트에서 최종 화질이 영 아쉬웠어요. 같은 h264 프로파일 레벨에서도 x264는 같은 비트레이트로 훨씬 좋은 화질을 뽑아내는 것 같았거든요. 요즘 av1과 hevc 인코더에도 x264의 설계 요소가 많이 남아 있고, 심지어 그대로 포팅된 것도 있어요.
저는 그 무렵 DVD 트랜스코딩을 많이 했는데, 새로 맞춘 Sandy Bridge PC에서 Quick Sync를 쓸 생각에 들떴던 기억이 납니다. 그런데 빠르긴 해도 화질이 _끔찍_했습니다. 이전 메인 Plex 서버(아마 Haswell이었을 겁니다)에서도 다시 써 봤지만, x264에 비하면 여전히 트랜스코딩에 쓸 수준이 아니었습니다.
엔비디아는 20xx 시리즈 카드에 넣은 인코더부터, 인텔은 Quick Sync 6~7세대는 되어서야 하드웨어 인코더가 드디어 적당한 비트레이트에서 괜찮은 화질을 내는 수준에 이르렀습니다. 그래도 시간과 전기를 쓸 여유만 있다면 x264(그리고 x265도!)가 압도적으로 앞섭니다. 격차가 여전히 그만큼 큽니다.
Quick Sync 기억나요. Sandy Bridge CPU에서 핸드브레이크로 돌려 보고 속도에 감탄했는데, 영상을 보고 나서야 알았죠!
당시 새 맥으로도 테스트해 봤는데, i7-920보다 몇 분밖에 안 뒤처졌지만 화질은 쓰레기였어요.
오늘 Intel Quick Sync를 처음 알았습니다. 고맙습니다. 저는 2011년에 영상 압축 일을 접어서 오랫동안 소식에 어두웠습니다.
https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video
CPU로 트랜스코딩을 몇 번 돌려 보다가 같은 작업을 QuickSync로 해 보면 정말 마법 같아요.
정말 멋지네요. 저도 비슷한 방식으로 플레임그래프를 보면서 openutv를 최적화했습니다. UTV는 openrv의 포크이고, openrv는 상용 RV의 구버전에서 나온 겁니다. 다른 많은 프로그램처럼 ffmpeg를 쓰고, 일부 포맷에는 자체 리더와 라이터도 씁니다. 덕분에 하드웨어 가속으로 8k@60fps를 버터처럼 부드럽게 재생할 수 있게 됐습니다. 아직 영상/이미지 분야에 계시다면 UTV에 대한 의견을 듣고 싶습니다. openutv.com
10년 뒤인 2026년의 마법은 AV1입니다.
https://engineering.fb.com/2026/06/22/video-engineering/adopting-av1-for-real-time-communication-rtc-meta/
그리고 곧 AV2도 나옵니다.
https://av2.aomedia.org/
다 좋은 말이지만, 제 TV 프런트엔드용으로 AV1 하드웨어 디코딩이 되는 50달러짜리 중고 NUC나 파이 같은 걸 살 수 있게 되면 그때 알려 주세요.
인텔은 Tiger Lake부터 AV1 하드웨어 디코더를 기본 지원합니다. 꽤 오래된 얘기죠. Tiger Lake 중고 NUC를 살 수 있습니다. 새 제품일 때도 1115G4나 1135G7이 들어간 NUC는 비싸지 않았습니다. 와이파이가 고장 난 걸 20달러에 찾았어요. https://www.ebay.com/itm/366767313411 지금 바로 살 수 있습니다.
이 기능이 있는 컴퓨터(NUC11TNKi3)를 20달러에 사려고 링크에 들어갔는데, 입찰만 할 수 있고 즉시 구매는 안 되던데요.
보통은 200달러쯤에 팔리는 것 같습니다. https://www.ebay.com/sch/i.html?_nkw=NUC11TNKi3&LH_Sold=1
긴 광케이블 HDMI 선을 사서 TV를 PC GPU에 연결하는 게 더 싸요. 저는 그렇게 씁니다. 압축 없는 최고 화질(보통 4K 120Hz나 8K 60Hz)이 나오고, 지연이 전혀 없어서 영상 말고 다른 용도로도 쓸 수 있고, 박스를 하나 더 관리할 필요도 없죠.
저도 해 봤는데 정말 골치 아팠습니다. TV 하나에 사용자 한 명인 작은 집에서나 통하지, 그 이상이면 힘듭니다.
벽 속으로 HDMI 케이블을 넣는 것도 고역이고, 동시 사용에도 제약이 있고(아내가 TV를 보는 동안 저는 게임을 못 합니다), PC를 원격으로 제어하는 것도 귀찮고, 대부분의 스트리밍 앱은 PC에서 4K를 지원하지 않고(NUC도 마찬가지입니다), 더 말할 수도 있습니다.
제 생각엔 아내 테스트를 통과하기는커녕 근처에도 못 갑니다.
NUC가 소프트웨어 디코딩하느라 전력을 2와트 더 쓰는 게 정말 신경 쓰이세요?
AV1 디코더가 없는 미디어 기기는 대체로 고해상도 AV1을 실시간으로 디코딩하는 데 문제가 있어서, 버퍼링으로 멈추거나 프레임이 떨어지곤 합니다.
네, 그런데 "NUC"라고 적혀 있으면 그런 문제는 없을 것 같은데요.
AV1을 소프트웨어로 디코딩하는 게 얼마나 무거운지 심각하게 과소평가하고 계신 것 같은데요!
NUC가 4K AV1을 소프트웨어로 실시간 디코딩할 수 있는지조차 저는 확신이 안 서요.
13년 된 CPU로 4K AV1을 디코딩하는 데 코어 2개가 필요해요. 그렇게 나쁘지 않아요.
4K 60fps는 어쩌면 안 될 수도 있지만, 그런 콘텐츠는 많지 않잖아요.
그리고 10년쯤 더 지나면 이를 지원하는 하드웨어가 충분해져서 주류가 되겠죠.
AV1이요? 이미 주류예요. 지원하는 하드웨어도 많고, 하드웨어 지원이 필요 없는 경우도 많잖아요.
주류라고요? 가장 인기 있는 하드웨어 스트리밍 기기(엔비디아 쉴드)는 지원조차 안 하는데, 그걸 주류라고 부르지는 못하겠네요.
엔비디아 쉴드는 어떤 면에서도 가장 인기 있는 기기가 못 됩니다. 로쿠가 시장의 43%, 아마존이 35%를 차지하고 있어요.
서드파티 기기와 TV 내장형(아래 인용 참고)을 나눠서 볼 수 있다면 흥미롭겠지만, 기사의 지표는 실제 소비자 사용을 반영하는 듯합니다. 요즘은 대부분의 소비자가 TV를 살 때 딸려 오는 걸 그냥 쓰니까요.
https://www.cepro.com/news/roku-amazon-lead-streaming-media-player-market/140172/
로쿠를 핵심 비교 대상으로 드시다니 흥미롭네요. AV1을 지원하는 건 Roku Ultra뿐이고, 그것도 DASH로만 됩니다.
https://developer.roku.com/dev/docs/media
그러니 로쿠가 시장의 43%를 차지한다고 하신다면, 저는 오히려 AV1 지원이 그리 널리 퍼지지 않았다는 제 주장을 뒷받침하는 거라고 봅니다.
맞는 말씀입니다. 아마존은 2021년 Fire TV Stick 4k Max 1세대[0]부터 AV1을 지원해서 조금 나아 보이는데, 가격이 35달러로 초저가인 "Fire TV Stick HD Alexa Voice Remote (2024)"만 예외인 듯합니다.
그래도 시장에서는 극히 일부일 뿐이지만, 로열티 없는* 코덱을 더 많이 쓸수록 좋은 것 아니겠습니까.
0: https://developer.amazon.com/docs/device-specs/device-specifications-fire-tv-streaming-media-player.html?v=ftvstick4kmax#
*: https://arstechnica.com/gadgets/2026/03/av1s-open-royalty-free-promise-in-question-as-dolby-sues-snapchat-over-codec/
이건 너무 틀렸어요..
Nvidia shield는 그냥 잘 되는 기기이고, 오디오를 건드리지 않고 제 사운드 리시버로 넘겨주고, 저는 매일 즐겁게 쓰고 있어요.
EDIT: <서식 고치려고 하는 중>
jellyfin 인용문은 "가장 좋은"이라고 하고 있는데, 이건 judge2020이 말한 "가장 인기 있는"과는 의미가 상당히 달라요.
엔비디아는 2019년 이후로 새 쉴드 모델을 내놓지 않았습니다. 현재 Apple TV, Google TV, Roku, Fire TV, Onn 모델은 모두 AV1을 지원합니다.
저는 그 오래된 엔비디아 쉴드를 "가장 인기 있는" 스트리밍 기기라고는 안 보겠습니다.
미안하지만, 유튜브가 기기에 하드웨어 지원이 있든 없든 AV1을 강제하기 시작한 순간부터 Firestick은 열 때문에 성능이 떨어지기 시작했어요.