FFmpeg Player with Visual Studio - 03 미디어 파일 └ FFMPEG

3. 미디어 파일


이번 장에서는 본격적인 실습에 앞서, 미디어 파일에 대한 간략한 설명과 함께 플레이어가 어떤 과정을 거쳐서 미디어 파일을 재생하게 되는지에 대해서 알아보려고 합니다. 비록 자세한 설명은 아니지만 향후 강좌 이해에 조금이나마 도움이 될까해서 이번 장을 마련했습니다.


> 미디어 파일


이후 제 강좌에서 미디어 파일이란 “플레이어에서 재생하기 위한 오디오/비디오 데이터를 가지고 있는 파일” 이라고 정의하겠습니다. 물론 이게 미디어 파일에 대한 올바른 정의라고 보기는 힘들지만 최소한 이번 장에서 만큼은 위의 의미로 사용할 것입니다.


오늘 날 우리는 많은 미디어 파일을 접하고 있습니다. 누구나 컴퓨터를 통해서 동영상을 재생해 본 경험이 있을 것입니다. 그럼 이런 미디어 파일은 어떻게 만들어질까요?

먼저 미디어 파일이 어떻게 만들어지는지를 한번 알아봅시다.


완전하지는 않지만 대략적으로 미디어 파일은 아래의 과정을 걸쳐서 만들어지게 됩니다.




과정을 좀 더 자세하게 들여다 봅시다. 크게 2가지 과정이 필요합니다.


A. 가공되지 않은 원본 영상 및 소리 ( Video/Audio Source 입니다 ) 를 압축 및 가공하는 Encoding (인코딩) 과정이 있습니다. 결과물을 Video / Audio Elements 라고 하겠습니다. 데이터를 가공해 주는 녀석을 우리는 Encoder (인코더) 라고 부르며, 여기서 말하는 Encoder (인코더) 가 (이후 언급할 Decoder(디코더)와 합쳐서 ) 우리가 흔히 말하는 Codec (코덱) 입니다. 모두 한번쯤은 들어보셨을 겁니다. H.264 (AVC) 라던가 최근 UHD 컨텐츠에 주로 사용되고있는 H.265(HEVC) 등이 그것입니다.


그렇다면 왜 인코딩 과정이 필요할까요?

여러가지 이유가 있겠지만 가장 큰 이유는 역시 가공되지 않은 원본 영상 및 소리의 크기가 너무 크기 때문입니다. 이 부분은 매우 크리티컬한 이슈가 됩니다. 데이터가 크기가 너무 클 경우 이는 곧 원할한 재생을 보장하지 못하기 때문입니다.

가령, 최근 보편화되고 있는 FHD 영상을 예로 들어 보겠습니다.

FHD 해상도 영상 (Image)의  경우 한장당 압축하지 않은 이미지의 크기가 약 6MB 정도 합니다. 보통 영상이 1초에 30 프레임으로 재생된다고 했을 때, 1초에 디스크에서 읽어야 할 데이터의 크기는 영상만 놓고 봤을 때, 약 180 MB 가 됩니다. 최신 PC에서는 그럭저럭 허용 범위입니다만, 그 외 구형 PC나 모바일 환경 및 HDD보다 상대적으로 I/O가 매우 느린 ODD를 통한 재생의 경우에는 원할한 재생을 보장하기 힘들 수 밖에 없습니다.


B. Source를 압축, 가공 한 후에는 결과물인 Video / Audio Elements 들을 포장하는 Muxing ( Muxing ( 먹싱 ) 은 Multiplexing ( 멀티플렉싱 ) 의 약자입니다 ) 과정이 있습니다. 일반적으로 한 종류의 Video와 Audio 를 포장하지만 경우에 따라서는 다수의 Video / Audio Elements를 포장하는 경우도 있습니다. 이 결과물이 우리가 원하는 미디어 파일이 됩니다.


포장을 하기 위해서는 Elements들을 담을 무언가가 필요하겠죠? 간단하게 상자를 상상해 봅시다. 상자의 (크기나 모양에 따른) 종류에 따라서 우리는 서로 다른 방식으로 포장을 하게 됩니다. 이런 상자들을 우리는 Container (컨테이너) 포맷이라고 합니다. 우리는 이러한 컨테이너 포맷을 자주 접하고 있습니다. 바로 파일의 확장자를 통해서죠. 미디어 파일 형식에는 다양한 종류가 있죠? AVI, MPG, MOV, MKV, MP4, 3GP 등 이 모두가 컨테이너 포맷들입니다.




참고로 종종 파일 확장자(컨테이너 포맷)와 코덱을 동일시 하시는 분들이 계시는데 다르게 보시는게 맞습니다. 물론 mp4 포맷에는 H.264 코덱을 사용하라고 강력히 권하고 있고, 그로 인해 대부분의 mp4 파일의 영상은 H.264로 인코딩 되어 있습니다.  때문에 보통 mp4 파일은 H.264라고 봐도 무방합니다만, 컨테이너 포맷과 코덱의 개념은 분명히 분리하고 가야 한다고 봅니다. 예로 mp4 포맷에 MPEG4 코덱이 사용될 수도 있고, MPG 포맷에 H.264 코덱이 사용될 수 있습니다. ( 물론 미디어 파일 중 오디오 전용 미디어 파일만 놓고 봤을 때는 파일확장자가 곧 코덱 이름인 것도 있습니다. 가령, mp3 파일이나 flac 파일 등은 코덱이름 역시 파일 확장자와 같습니다.  )


> 플레이어가 하는 일


그렇다면, 플레이어가 하는 일은 무엇일까요?

그렇습니다. 위에서 미디어 파일을 만들기 위한 과정을 역으로 진행하면 바로 플레이어가 하는 일이 됩니다.




A. 가장 먼저 Demuxing 과정입니다. 컨테이너 포맷 이라는 상자를 열고 안에 내용물을 들여다 봅니다.


컨테이너 포맷 안에는 설명서 또는 명세서 역할을 하는 특별한 데이터가 들어있습니다. 해당 데이터를 분석함으로써 우리는 이 상자 (컨테이너 포맷) 안에 몇 종류의 Video/Audio Elements들이 들어있고, 어떤 코덱을 사용하여 인코딩 되어있는지 등의 정보를 알 수 있습니다. 이 단계에서 우리는 Video/Audio Elements들을 디코딩하기 위한 디코더를 준비할 수 있습니다.


디코더가 준비되었다면, 상자 (컨테이너 포맷) 에서 Video/Audio Elements들을 하나씩 꺼내기 시작힙니다.


B.  상자 (컨테이너 포맷) 에서 꺼낸 Video/Audio Elements들은 준비된 디코더에 의해서 디코딩이 진행됩니다. 디코딩 된 Elements 들은 각각 원본 영상 및 소리로 변환됩니다.


C. 사용자가 원한다면, 이 단계에서 원본 영상 및 소리를 가지고 후처리 작업을 진행할 수도 있습니다. ( 영상처리 작업이나 소리 보정 또는 왜곡 등 다양한 작업을 진행해 볼 수 있겠죠? )


D. 마지막으로 플레이어는 영상과 소리를 시간에 맞게 잘 동기화해서 화면 또는 스피커로 출력해주면 됩니다. 일반적으로 사람은 영상보다는 소리에 민감하기 때문에 소리를 계속해서 재생하면서 소리 시간에 맞추어 영상을 출력해 주는 동기화 방법을 가장 많이 사용합니다.


> 플레이어에서 FFmpeg의 역할


그렇다면 FFmpeg 라이브러리는 어디까지 지원해 줄까요? 앞서 제일 첫 시간에 FFmpeg에 미디어 처리에 관련된 거의 모든 과정을 지원한다고 했었습니다. 따라서 위에서 언급한 과정 중 마지막 과정인 출력 (E) 을 제외한 모든 과정 (A ~ D)을 FFmpeg 라이브러리를 이용해서 처리한다고 보시면 되겠습니다.



다음 시간에는 FFmpeg 라이브러리를 이용해서 Demuxing 을 어떻게 시작하는지에 대해서 알아보도록 하겠습니다. 이제부터 본격적인 FFmpeg 코딩이 들어갑니다 ^^



덧글

  • K 2014/04/24 13:47 # 삭제 답글

    감사합니다 !! ㅎ
  • minch 2016/03/11 22:31 # 삭제 답글

    좋은 설명 감사합니다.
  • 돌민 2017/08/04 15:54 # 삭제 답글

    설명이 정말 잘 써져있어서 정말정말 감사합니다!
  • 부라퀴옹 2017/10/12 16:25 # 삭제 답글

    고맙습니다.
댓글 입력 영역