티스토리 뷰
AVC / H.264 란?
H.264라고도 불리는 AVC(Advanced Video Coding)는 ITU-T 의 비디오 코딩 전문가 그룹(Video Coding Experts Group, VCEG)와 ISO/IEC의 동화상 전문가 그룹(Moving Picture Experts Group, MPEG)이 공동으로 조인트 비디오 팀(Joint Video Team, JVT)을 구성하고 표준화를 진행한 결과물로 나온 동영상 압축 표준 중 하나이다.
이 표준은 MPEG-4 Part 10, AVC, H.264 등 전문가들 사이의 기싸움(?)에 의해 다양하게 불리는데, 이러한 원인은 JVT가 구성되게 된 계기와 관련 스토리를 찾아보면 알 수 있다. 재미있는 이야기가 많으니 관심있는 분들은 찾아보길 추천한다.
우리의 사전 위키피디에서는 H.264를 아래와 같이 설명하고있다.
블록 단위 움직임 보상 기반의 영상 압축 표준인 H.264 또는 MPEG-4 파트 10, Advanced Video Coding (MPEG-4 AVC)는 동영상 녹화, 압축, 배포를 위한 방식들 중 현재 가장 보편적으로 사용되고 있는 포맷이다.
여기서 중요한 내용이 나오는데 바로 "움직임 보상 기반의 영상 압축 표준"이라는 것이다.
JVT이 위 기술을 통해 실현하고자 하는 주요 목표는 아래와 같다.
- 기존의 표준들보다 실질적으로 낮은 비트율
- 다양한 플렛폼에 대응할 수 있는 다양한 옵션
1번 목표는 움직임 보상 기반의 압축 성능으로 실현했고, 2번 목표는 다양한 Profile 및 Level 지원을 통해 실현했다.
이번 글에서는 AVC의 핵심 내용인 아래 2가지 주제에 대해 다룰 것이다.
- 움직임 보상 기반의 영상 압축
- 다양한 Profile 및 Level
위 주제를 다루기 앞서 비디오와 이미지의 관계에 대해 생각해보자.
동영상과 이미지
동영상은 움직이는 그림을 말하며, 움직이지 않는 그림은 이미지라 한다.
이미지를 움직이게 하려면 어떻게 해야할까?
아주 간단한 방법은 같은 구도에서 연속해서 찍은 사진을 일정한 속도에 맞춰 보여주는 것이다.
우리가 흔히 짤에서 보는 .gif가 바로 이런 원리다.
다시말해 1초에 30장씩 찍은 이미지를 연속해서 보여주면 30fps를 가진 동영상이 되는 것이고,
1초에 60장씩 찍은 이미지를 연속해서 보여주면 60fps를 가진 동영상이 되는 것이다.
이러한 원리를 적용한 최초의 동영상은 아래와 같은 필름에 연속되는 이미지를 입혀 일정한 주기로 보여주는 방식이었다.
위 방식의 문제점은 용량이 매우 크며 상황에 따라 비효율 적이라는 것이다.
60fps 를 기준으로 10초간 영상을 재생할 때 600장의 사진이 필요하다.
또한 10초동안 화면 속 인물이 가만히 서있고, 배경도 바뀌지 않으며, 눈동자만 움직인다고 해도 필요한 이미지의 숫자는 600장이라는 것.
동영상 저장 매체가 아날로그에서 디지털로 바뀜에 따라, 유튜브같은 실시간 영상 스트리밍 서비스가 증가함에 따라 저용량 고품질 동영상에 대한 니즈가 증가했다.
이러한 요구를 충족시키기 위해 다양한 압축 기법이 개발되었으며 현재 움직임 보상 기반의 영상 압축이 가장 많이 사용되고 있다.
실제로 같은 화질에 같은 영상일 때 gif형식의 동영상과 AVC 압축 방식을 적용한 동영상의 용량을 비교해보면 AVC 압축기술이 적용된 영상의 용량이 10배 이상 작다.
움직임 보상 기반의 영상 압축
움직임 보상의 사전적 정의는 아래와 같다.
움직임 보상(Motion Compensation)은 대부분의 동영상 압축 기술들에서 사용하고 있는 기술이다. 현재의 영상을 부호화 하기 위하여 기존에 부호화 된 영상의 영역을 가져와서 예측을 하도록 하는 것이 주 목적이다. 움직임 예측(Motion Estimaiton)은 움직임 보상을 위해서 부호화 시에 움직임 벡터를 찾는 기술을 말한다.
쉽게밀해 기준이 되는 이미지가 있고 그 기준으로 부터 움직이는 영역만 캐치해 움직임 관련 데이터를 생성하는 것이 이 압축 기술의 핵심이다.
동영상과 이미지에서 예로 들었던 상황을 다시 생각해보자.
여기 시무룩한 개구리가 한마리 있다.
이 친구가 미동도 안한체 눈동자만 굴리고 있다고 생각해보자.
이를 원시적인 방법을 통해 동영상으로 촬영할 경우 매 순간을 촬영해 해당 이미지를 이어서 보여줘야 한다.
하지만 여기서 눈동자의 움직임만을 벡터 값으로 저장해 표현할 수 있다면?
아마 엄청난 용량 절약이 가능 할 것이다. (눈동자 외에는 변경되는 픽셀이 없으므로)
이러한 이론을 실현한 기술이 바로 움직임 보상 기반의 영상 압축이다.
AVC에서는 영상 관련 정보를 담고있는 데이터 한 조각을 frame이라 칭하며, 아래와 같이 3가지 종류로 분류한다.
- i-frame - 모든 이미지 데이터를 가진 frame
- p-frame - 앞의 데이터를 참조해 움직임 예측 데이터를 가진 frame
- b-frame - 앞뒤 frame 간의 참조 데이터를 가진 frame
위의 예를 들어 설명하자면 개구리 사진은 i-frame으로 분류할 수 있다.
그리고 눈동자의 움직임 벡터값을 가진 데이터를 p-frame이라 할 수 있으며,
눈동자의 움직임 간 추가적인 메타 데이터, 예를들어 움직임 속도라던가, 를 가진 데이터가 b-frame이다.
여기서 Frame의 특징을 발견할 수 있는데, 눈치가 빠르다면 벌써 알아챈 독자도 있을 것이다, i-frame 없이는 동영상 구현이 불가능하다.
종이없이 팬만 가지고 어찌 그림을 그리겠는가?
다양한 Profile 및 Level
불과 10여년 전 까지만 해도 우리가 일상 속에서 영상 컨텐츠를 소비할 수 있는 미디어는 TV와 PC뿐이었다.
하지만 iphone의 등장을 시작으로 스마트폰과 테블릿이 시장에서 쏟아지기 시작했고,
이제는 스마트폰, 테블릿, 랩탑 등등 다양한 기기를 통해 미디어를 소비한다.
미디어 뿐만아니라 인터넷 통신 기술이 발전함에 따라 영상 파일 전체를 다운받아 재생하던 환경에서 실시간으로 수신한 데이터를 재생하는 스트리밍 형태로 공급 체계가 변화하고있다.
아래 두가지 경우를 생각해보자.
- 트위치를 통해 좋아하는 BJ의 개인 방송을 보는 경우
- 유튜브를 통해 영화를 시청하는 경우
1번의 경우 생방송 중계이므로 실시간 스트리밍이 보장되어야 한다.
여기서 소비자의 취향에 따라 선명한 화면을 보길 원하는 사람도 있을 것이고, 화질은 좀 떨어지더라도 소리만 잘 듣길 원하는 사람이 있을 것이다.
이러한 니즈는 사용자의 네트워크 환경에 의해 충족이 될 수도, 안될 수도 있다. 영상을 송출하는 서버에서는 이러한 환경을 분석해 최적의 해상도로 영상을 송신해야 한다.
2번의 경우 고품질 영상이 보장되어야 한다.
물론 네트워크 환경이 좋지못해 울며 겨자먹기로 낮은 화질로 시청하는 소비자도 있겠지만, 그 역시 버퍼링이 생기지 않는 선에서 최적의 화질을 원할 것이다.
이러한 다양한 환경과 미디어 소비자의 니즈를 충족시키기 위해 AVC는 Profile과 Level이라는 개념을 적용했다.
위 표는 위키피디아에서 정리한 AVC의 profile table이다.
영상이 사용될 환경에 맞춰 profile 선택해 인코딩하면 용도에 적합한 특징을 가진 영상을 생성할 수 있으며,
각 profile마다 Level을 통해 조금 더 세밀한 설정이 가능하다.
대표적인 profile로는 baseline(모바일 방송에 주로 사용), main(높은 압축률) 등이 있다.
마치며
현재 AVC / H.264 가 이룩한 천하통일은 높은 압축률을 보장하는 "움직임 보상 기반의 압축"과, 다양한 환경에도 적응 가능한 "Profile과 Level 개념"이 있었기에 가능했다.
우리가 흔히 접할 수 있는 .mp4 확장자를 가진 영상 대부분에 해당 압축 기술이 적용되었다고 볼 수 있다.
("대부분" 이라고 한 이유는 추후 포스팅을 통해 설명할 것이다.)
"뭘 좋아할지 몰라서 다 준비해봤어!" 라고 말하는 부잣집 도련님같은 AVC
언제까지 그의 시대가 이어질지는 모르지만 현재 영상 관련 기술을 다루고 있는 필자로서는 몰라선 안될 핵심 표준이다.
앞으로 관련 기술 내용을 포스팅 할 예정이며, 필자도 입문자 수준이므로 틀린 내용이 있을 수 있다는 점 양해 바랍니다.
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 프로그래밍
- 코틀린 기초강의
- live template
- 안드로이드 컴포즈
- php
- compose bottomsheet
- kotlin 기초
- 프로젝트오일러
- 영어발음
- 코딩문제
- 안드로이드
- 컴포즈 바텀시트
- 개발자
- android studio
- 안드로이드 바텀시트
- LiveTemplate
- 안스 템플릿
- Android
- 코틀린 기초
- 코틀린
- Programming
- 코딩
- Java
- 런탭
- 안드로이드 스튜디오
- 자바
- Kotlin
- 안드로이드 스튜디오 라이브 템플릿
- 영어회화
- 문제풀이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함