코덱이란?
영상을 다운받거나 핸드폰으로 영상을 촬영한 다음 그 영상 파일의 상세보기를 보면 H.264 AAC나 MPEG-4 같은 글자가 써 있는 걸 볼 수 있다. 이것이 코덱이라는 건데 코덱은 대체 뭘까?
아래는 위키백과에서 설명하는 코덱이다.
https://ko.wikipedia.org/wiki/%EC%BD%94%EB%8D%B1
코덱은 어떤 데이터 스트림이나 신호에 대해 인코딩이나 디코딩, 혹은 둘 다 할 수 있는 하드웨어나 소프트웨어를 말한다. 또 이를 위한 알고리즘을 가리키는 용어로도 쓰인다. 코덱에는 데이터 압축 기능을 써서 자료를 압축하거나 압축을 푸는 소프트웨어나 소리, 영상 등의 자료를 다른 형식으로 변환하는 장치, 소프트웨어가 포함된다. 일반적으로 코덱이라고 하면 영상, 음향 등 미디어 정보를 압축하는 기술을 가리킨다
압축하는 프로세스가 포함된다면 코덱 또한 손실, 비손실 두 종류가 있을 것이다. 각각 손실 코덱, 비손실 코덱이라고 하며 코덱을 거치지 않는 경우 무압축이라고 한다. 각 특징은 아래와 같다.
- 손실 코덱 : 사람이 잘 느끼지 못하는 부분을 우선적으로 손실시켜 압축률을 크게 올리는 기술. 대부분의 유명한 오디오/비디오 코덱이 손실 코덱을 사용한다. 사용하는 코덱, 설정에 따라 압축되지 않은 원음과 실제 차이를 느끼기 쉽지 않다
- 비손실 코덱 : 압축된 데이터가 원본 스트림의 모든 정보를 갖고 있는 코덱. 영상 편집처럼 빠른 처리가 필요하거나 편집 도중 열화를 막기 위해 사용한다. zip 등을 비롯한 데이터 압축은 기본적으로 비손실 코덱을 사용한다
- 무압축 : 디지털 데이터가 다른 코덱을 안 거치고 저장, 변환되는 경우. raw data라고 불리기도 한다
음악 파일로 치면 손실 코덱은 mp3, ogg 등의 확장자와 비슷하고 비손실 코덱은 flac, wav 같은 확장자와 비슷하다.
손실 코덱, 비손실 코덱에 대해서 좀 더 확인해 본다. 위키백과 기준 각 하이퍼링크를 클릭하면 각각 손실 압축, 비손실 압축 문서로 이동된다.
https://en.wikipedia.org/wiki/Lossy_compression
손실 압축 또는 비가역 압축은 컨텐츠 표현을 위해 부정확한 근사치 및 부분 데이터를 폐기하는 데이터 압축 방법이다. 이런 기술은 컨텐츠를 저장, 처리, 전송하기 위한 데이터 크기를 줄이는 데 사용된다. 더 많은 세부 사항이 제거될수록 거친 이미지가 생성된다. 손실 압축을 써서 가능한 데이터 감소량은 무손실 압축을 쓰는 것보다 훨씬 높다. 잘 설계된 손실 압축 기술은 종종 사용자가 성능 저하를 인지하기 전에 파일 크기를 크게 줄인다. 가장 많이 쓰이는 손실 압축 알고리즘은 1974년 발표된 DCT(discrete cosine transform)다. 이 알고리즘은 JPEG, H.264, MP3, AAC 등의 여러 압축 형식에 가장 많이 쓰이는 손실 압축 형식이다.
손실 압축은 특히 스트리밍 미디어 및 인터넷 전화(VoIP) 같은 프로그램에서 소리, 영상, 이미지 같은 데이터를 압축하는 데 일반적으로 사용된다. 무손실 압축은 은행 기록, 텍스트 파일에 필요하다...(중략)
https://en.wikipedia.org/wiki/Lossless_compression
무손실 압축은 원본 데이터가 정보 손실 없이 압축된 데이터에서 완벽하게 재구성되게 하는 데이터 압축 클래스다. 대부분 실제 데이터가 통계적 중복성을 나타내기 때문에 가능하다. 손실 압축은 압축률이 크게 향상되어 미디어 크기가 줄어들지만 원래 데이터의 근사치만 재구성할 수 있다. 비둘기집 원리 때문에 어떤 무손실 압축 알고리즘도 모든 데이터를 효율적으로 압축할 수 없다
무손실 압축은 zip, gzip에서 사용된다. 또한 원본 데이터와 압축해제된 데이터가 동일해야 하거나 원본 데이터와 편차가 있으면 안 되는 경우에 사용된다. png, gif 같은 일부 이미지 파일 형식은 무손실 압축만 사용하지만 tiff, mng 같은 다른 형식은 무손실 또는 손실 압축을 사용할 수 있다
데이터를 압축없이 사용한다면 많이 불편할 것이다. 특히 요즘 만들어지는 사진, 영상의 경우 핸드폰이나 카메라 성능이 발전함에 따라 4k, 8k급 화질은 심심찮게 보이고 12k 이상도 존재한다. 이 데이터들을 아무런 압축 없이 날것 그대로 전달하려고 하면 시간이 한참 걸릴 것이고, 중간에 문제라도 생기거나 실수로 취소한다면 처음부터 다시 전송해야 하기 때문에 끔찍하다.
그래서 코덱을 통해 손실이든 비손실이든 어떤 형태로든 압축을 해서 사용하거나 어딘가로 전달하는 것이다.
이런 코덱은 개발자들에겐 이미지, 음원, 영상을 전송해야 할 때 염두해 둬야 하는 중요한 정보다.
아래 디벨로퍼 공식문서 링크에서 오디오, 동영상 별 지원하는 코덱을 표 형태로 보여주고 있다.
https://developer.android.com/guide/topics/media/media-formats?hl=ko
예를 들어 안드로이드에서 av1이라는 코덱의 영상을 보내려고 할 경우, 안드로이드는 취급하지 않는 코덱이기 때문에 재생도, 서버 전송 로직을 통한 동영상 전송도 불가능하다. 영상 전송 기능을 구현할 수 없게 되는 것이다.
굳이 개발 관점이 아니라도, 영상 시청 시에도 코덱은 중요한 정보다. 위에서 말한 av1 코덱의 경우 아이폰에선 다운로드조차 안 되는 것으로 알고, 다운받았다 쳐도 안 되는 경우가 많다.
아래 링크는 비교적 최근인 2020년에 쓰인 글인데 참고용으로 가져왔다.
https://www.clien.net/service/board/cm_iphonien/15100311
이런 특징을 좀 더 잘 알아두고 있다면 나중에 음원, 영상 파일을 다운받을 일이 있을 때 코덱을 통해 내가 받으려는 파일의 상태가 괜찮은지 아닌지를 유추하는 데 도움이 될 것이다.