IT 이야기

H.264 디코더 정리

Kjun25 2025. 5. 6. 20:35

1️⃣ H.264가 대체 뭐길래?

H.264(일명 AVC, Advanced Video Coding)는 우리가 매일 보는 거의 모든 영상에 사용되는 최강 비디오 압축 기술입니다.
넷플릭스부터 유튜브, 인스타그램 릴스까지... 심지어 여러분 핸드폰의 동영상도 대부분 이 기술로 압축되어 있습니다.

  • 왜 H.264가 인기 있을까요? → 화질은 유지하면서 용량은 대폭 감소
  • .mp4, .mkv 파일 안에는 이 H.264로 압축된 데이터가 숨어있습니다
  • 넷플릭스 4K 영상이 수십 GB가 아닌 이유가 바로 이것입니다

 

2️⃣ H.264 압축의 놀라운 효율성 (실제 수치로 보기)

H.264의 강력한 압축 성능은 유튜브, 넷플릭스 같은 스트리밍 플랫폼이 고화질 영상을 저용량으로 제공할 수 있는 핵심 이유 중 하나입니다. 실제 비교 예시로 알아보겠습니다.
 
H.264 디코딩 시 얼마나 용량이 줄어들까요?
 
전제 조건

  • 해상도: 1920x1080 (FHD)
  • 프레임률: 30fps
  • 길이: 1분 (60초)
  • 원본 포맷: Uncompressed RGB

1. 압축 전: Uncompressed 영상 용량 계산
 
RGB 포맷 기준 계산식:

1920 x 1080 x 3bytes(RGB) x 30fps x 60초 ≒ 10.8GB

 
구분 값

해상도1920x1080
프레임수1800 (30fps × 60초)
프레임당 용량약 6MB
총 용량약 10.8GB

 
2. H.264로 인코딩 된 결과 예시
 
비트레이트 수준 품질 평균 용량 (1분 기준) 압축률

500 kbps저화질 스트리밍 (모바일용)약 3.8MB약 2,800:1
2 Mbps보통 화질 (유튜브 720p~1080p)약 15MB약 700:1
5 Mbps고화질 (넷플릭스 FHD 수준)약 38MB약 280:1
10 Mbps고화질 방송 (블루레이 등)약 75MB약 140:1

 
즉, 10GB짜리 원본 영상도 H.264로 인코딩하면 10~100MB 수준으로 줄어들 수 있습니다.
우리가 고화질의 영상들도 쉽게 볼 수 있는 것도 모두 디코더 덕분이라고 생각하면 됩니다.
 
유튜브

  • 업로드 시 H.264로 인코딩 되어 720p 기준 2~4 Mbps, 1080p는 4~8 Mbps
  • 1분짜리 1080p 영상: 약 30~60MB

넷플릭스

  • 영상에 따라 다르지만, 1080p 기준 평균 5 Mbps 전후
  • 1시간짜리 영상: 약 2~2.5GB
  • 동일 해상도의 무압축 영상이 600GB 이상이 될 수 있으므로, 250:1 이상의 압축률

 
정리
구분 원본 용량 H.264 용량 압축률

1분 FHD 영상약 10.8GB약 30~75MB140~300배 이상

 
H.264는 영상 품질을 육안으로 거의 손실 없이 유지하면서도, 원본 대비 100~1000배 가까운 압축 효과를 제공합니다.
이 덕분에 유튜브나 넷플릭스는 끊김 없이 재생되는 스트리밍 서비스를 제공할 수 있는 것입니다.
 

3️⃣ 디코딩 vs 인코딩 (확실히 짚고 넘어가기)

용어 설명 비유하자면?

인코딩원본 영상을 압축하여 저장하는 과정책 내용을 요약노트로 만들기
디코딩압축된 데이터를 다시 풀어서 원래 영상으로 복원요약노트를 보고 원래 내용 복원하기

 
유튜브 영상을 시청할 때마다 여러분의 기기는 실시간으로 H.264 디코딩을 수행하고 있습니다.
이 과정이 실시간으로 일어나기 때문에 영상이 버퍼링 없이 재생될 수 있는 것입니다.
 

4️⃣ 영상 스트림과 프레임 - 핵심 개념 이해하기

스트림(Stream)이란?

연속적으로 흘러가는 데이터 덩어리입니다.
마치 강물처럼 연속적으로 흐르는 특성을 갖습니다.
MP4 파일은 실제로 여러 종류의 스트림이 담긴 '컨테이너'와 같습니다:

  • 비디오 스트림 (실제 영상)
  • 오디오 스트림 (음성/음악)
  • 자막 스트림 (있는 경우)

 

프레임(Frame)이란?

영상을 구성하는 한 장면, 한 장면의 정지 이미지입니다.

  • 30 FPS 영상 = 1초에 30장의 사진이 빠르게 지나가는 것
  • 우리 눈은 이를 매끄러운 동작으로 인식하게 됩니다
  • 디코딩은 결국 이 이미지들을 하나씩 복원하는 작업입니다

 

5️⃣ H.264 디코딩 전체 과정 한눈에 보기

[H.264 비디오 파일] → [스트림 추출] → [디코딩(압축 풀기)] → [프레임으로 변환] → [화면 출력/저장]

이 전체 과정을 파이썬으로 단 몇 줄만에 구현할 수 있습니다. 복잡해 보이는 과정도 파이썬 라이브러리를 활용하면 간단히 처리할 수 있습니다.
 

Video Decoder

6️⃣ 파이썬 코드로 직접 구현해 보기

이제 실제로 코드를 작성해 봅시다.
복사 붙여 넣기만 하면 됩니다.

import av  # PyAV 라이브러리
import cv2  # OpenCV 라이브러리

# 1단계: H.264 영상 파일 열기
container = av.open('sample_video.mp4')  # 여러분의 영상 파일명으로 변경하세요

# 2단계: 비디오 스트림 선택하기
video_stream = container.streams.video[0]  # 첫 번째 비디오 스트림 선택

# 3단계: 프레임 단위로 디코딩하기
for frame in container.decode(video=video_stream):
    # 4단계: 프레임을 이미지로 변환 (OpenCV 형식)
    image = frame.to_ndarray(format='bgr24')
    
    # 5단계: 화면에 표시하기
    cv2.imshow('내가 만든 H264 디코더', image)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()  # 창 닫기

 
생각보다 정말 간단합니다.
이 코드로 여러분은 이미 H.264 디코더를 만든 것입니다.
 
PyAV 라이브러리가 내부적으로 복잡한 디코딩 과정을 처리해 주기 때문에 이렇게 간단한 코드만으로도 구현이 가능합니다.
 

7️⃣ 필수 라이브러리 및 환경 설정

먼저 필요한 라이브러리를 설치해야 합니다.

pip install av opencv-python
  • PyAV: FFmpeg 기반의 강력한 미디어 처리 라이브러리
  • OpenCV: 컴퓨터 비전의 대표주자, 영상 처리와 화면 출력 담당

중요: PyAV가 제대로 작동하려면 FFmpeg가 필요합니다.

  • 맥: brew install ffmpeg
  • 윈도우: FFmpeg 공식 사이트에서 다운로드 후 환경변수 설정
  • 리눅스: sudo apt install ffmpeg

 

8️⃣ 자주 발생하는 오류와 해결책

 
문제 상황 원인 해결법

"FFmpeg not found" 에러FFmpeg 미설치위 설치 방법 참고
영상이 이상하게 깨짐색상 포맷 문제format='rgb24'로 변경 시도
너무 느리게 재생됨고해상도 영상cv2.resize()로 크기 줄이기
"Stream not found" 에러파일 손상 또는 지원 안 됨다른 샘플 영상으로 시도

 

9️⃣ 총정리

 

  • H.264는 영상 압축 기술, 디코딩은 압축 풀기, 스트림은 데이터 흐름, 프레임은 한 장면의 이미지
  • H.264는 원본 대비 100~1000배 가까운 압축 효과를 제공하면서도 품질 손실은 최소화
  • 파이썬의 PyAVOpenCV로 몇 줄의 코드만으로 영상 디코더 구현 가능
반응형