프로그래밍/기타

미디어 파일 포맷에 대하여 - container, codec

동네로봇 2022. 1. 29. 21:25

미디어 파일들을 살펴보면 .mp3, .mov, .wav 등등의 다양한 확장자를 가지고 있는데, 확장자가 나타내는 의미는 무엇이며 어떤 요소를 통해 미디어 파일의 포맷이 결정되는 것일까?

미디어 파일의 포맷은 두 가지 요소에 의해 정의되는데, 오디오/비디오 코덱과 미디어 컨테이너 포맷이다. 이 글에서는 미디어 파일 포맷을 결정짓는 코덱(codec)과 컨테이너(container)에 대해서 알아보도록 하겠다.

컨테이너

컨테이너는 단어 그대로 여러 미디어 스트림을 담고 있는 박스, 컨테이너의 개념이다.

영화의 경우 영상과 오디오 데이터를 가지고 있을 것이고, 음원의 경우 오디오 데이터만 가지고 있을 것이다. 시간의 흐름에 따른 디지털 데이터를 저장하고 있기 때문에 각각의 미디어 데이터를 스트림이라고 한다. 컨테이너는 영상, 오디오, 자막 등 여러 개의 스트림을 가지고 있을 수도 있고, 또는 오디오 스트림만 가지고 있을 수도 있다.

컨테이너는 여러 개의 데이터 스트림을 묶어 하나의 단일 파일로 만들어주며, 보통은 메타데이터도 함께 저장하여 컨테이너가 포함하는 스트림의 자세한 정보를 함께 보여줄 수 있다.

image from wc3

일반적으로 우리가 파일 포맷(확장자)이라고 말하는 것은, 어떤 컨테이너 포맷인지를 말하는 것이다. 컨테이너 안에 담고 있는 스트림에 따라서 컨테이너도 달라진다.
또한 확장자만 변경한다고 해서 컨테이너가 달라지지 않는다. 무늬만 .wav이고 실제로는 MP3 컨테이너를 가진 파일이 있을 수 있다. (ffmpeg을 사용해 실제 미디어 정보를 확인할 수 있다.)

그런데 컨테이너 안에는 스트림을 담고 있다고 했는데, 저 그림에서의 코덱은 도대체 무엇일까?

코덱

코덱은 아날로그 데이터 스트림을 압축해 디지털 스트림으로 변환해주는 알고리즘이다. 스트림은 서로 다른 코덱들을 통해서 인코딩 되며, 효율적인 코덱을 사용할 수록 용량은 작으면서 퀄리티가 좋은 결과를 얻을 수 있다.

인코딩 된다는 것은 무엇일까?

https://www.muvi.com/blogs/video-streaming-codecs-container.html

제작자가 녹화하거나 녹음한 원본 아날로그 데이터는 용량이 크고 무겁다. 날 것의 파일을 어디선가 재생하기 위해서 대역폭을 신경쓰지 않고 그대로 전달한다면 많은 시간과 비용이 든다. 미디어 파일의 이동과 저장, 재생을 용이하게 하기 위해서 용량이 작은 디지털 파일로 압축하여 변환하는 작업을 인코딩이라 하며, 디지털 파일을 원본 데이터로 변환하여 재생하기 위한 작업을 디코딩이라고 한다. 인코딩과 디코딩은 코덱을 통해서 이루어진다.

대표적인 비디오 코덱으로는 H.264/AVC, 오디오 코덱으로는 AAC가 있다.

트랜스코딩

트랜스코딩이란 하나의 코덱에서 다른 형식의 코덱으로 전환하거나, 미디어 파일의 비트레이트나 샘플레이트 등을 변환하는 일련의 작업들을 통틀어 말한다. 이 글이 미디어 파일 포맷을 다루는 글이라 트랜스코딩에 대해서는 간단한 정의 정도만 알아두도록 한다.

https://steemit.com/multimedia/@dothebest0927/multimedia-muxing-encoding-1

코덱을 변환하는 트랜스코딩 과정을 간단하게 설명해보자면, 원본의 컨테이너를 해체하여(Demuxing == DeMultiplexing) 안에 들어있는 스트림 데이터를 읽는다. 이후 원본 raw 데이터로 디코딩을 한 후 원하는 코덱으로 변환하는 인코딩 작업을 거친다. 이후 변환된 코덱의 스트림을 가지는 컨테이너로 wrapping(Muxing == Multiplexing) 하여 하나의 파일로 다시 만들어준다.

FFMPEG으로 미디어 데이터 확인 예시

샘플 동영상을 하나 다운로드 받아 미디어 파일 정보를 확인해보았다.
Input #0 라인에서 이 동영상의 컨테이너는 mp4인 것을 알 수 있다. (다른 확장자들은 모두 apple quicktime에서 파생된 것이라 기본적인 구조가 같다.)
Metadata영역에서 해당 동영상의 정보를 확인할 수 있다.
Duration 라인에서 실제 동영상 길이와 비트레이트 정보를 확인할 수 있다.
비디오와 오디오 총 두 개의 Stream이 포함되어 있는 것을 알 수 있다. 비디오 스트림의 경우 H264 코덱으로 인코딩 되었으며, 오디오 스트림은 AAC 코덱으로 인코딩 되었다.

참고 사이트

https://video.stackexchange.com/questions/15821/how-are-video-and-audio-streams-placed-in-container-files-and-what-interrelati

How are video and audio streams placed in 'container' files and what interrelations do they have?

So far I have been guessing my way through the types of audio/video streams and getting them mixed up with containers. For example, I have had a friend tell me that a video file which won't play on...

video.stackexchange.com

https://www.muvi.com/blogs/video-streaming-codecs-container.html

What are Video Streaming Codecs & Container Formats | Muvi Live Server

Read Blog to understand what are video streaming codecs, container formats and their importance and role in live streaming.

www.muvi.com

https://developer.mozilla.org/ko/docs/Web/Media/Formats/Containers

미디어 컨테이너 포맷 (파일 타입) - Web media technologies | MDN

이 가이드 문서는 웹에서 널리 쓰이는 컨테이너 포맷에 대해 알아보고 기본적인 스펙와 장단점 그리고 적절한 사용법을 설명하고 있습니다.

developer.mozilla.org