동영상 파일의 실제 데이터 구조를 이해하기 위해 **컨테이너 포맷**과 **코덱**이 어떻게 데이터를 관리하고 저장하는지, 그리고 이 데이터를 어떻게 해석하는지 구체적인 예시를 통해 설명해보겠습니다. 여기서는 일반적인 **MP4 파일**을 예로 들고, 그 안에 포함된 **비디오 프레임**, **오디오 스트림**, 그리고 **메타데이터**의 구조를 설명하겠습니다. ### 1. **MP4 파일 구조** **MP4(MPEG-4 Part 14)** 는 널리 사용되는 **멀티미디어 컨테이너 포맷**입니다. **컨테이너**는 동영상 파일에서 **비디오, 오디오, 자막, 메타데이터**를 **하나의 파일**로 묶는 역할을 합니다. MP4 파일의 구조는 트랙(track)으로 나뉘며, 각 트랙은 **비디오, 오디오, 자막**과 같은 개별 스트림을 저장합니다. #### MP4 파일의 주요 구성 요소: - **ftyp (파일 타입)**: 파일의 형식을 정의하는 헤더. MP4 파일인지, 특정 규격을 사용하는지에 대한 정보가 포함됩니다. - **moov (무비 정보)**: 동영상 파일의 메타데이터, 타임코드, 트랙 정보를 담고 있습니다. - **mdat (미디어 데이터)**: 실제 비디오 및 오디오 데이터를 포함하는 부분입니다. ### 2. **MP4 파일의 구체적 데이터 구조 예시** #### 2.1 **파일 타입(ftyp)** MP4 파일의 시작 부분은 **파일 타입(ftyp)** 로, 이 파일이 MP4 포맷임을 명시하는 **헤더 정보**가 포함됩니다. 예를 들어: ``` 00000020 66747970 69736F6D 00000200 69736F6D 69736F32 ``` 이 부분에서: - **66747970**는 **'ftyp'** 을 나타내며, 이 파일이 MP4 파일임을 명시합니다. - 이후의 데이터는 이 MP4 파일이 어떤 규격을 따르는지에 대한 정보입니다. #### 2.2 **무비 정보(moov)** **moov**는 MP4 파일에서 중요한 메타데이터를 포함하는 섹션입니다. **moov**는 여러 **트랙(track)** 으로 나뉘어 있으며, 각 트랙에는 비디오 또는 오디오 스트림에 대한 정보가 포함됩니다. 각 트랙은 다시 여러 **샘플(sample)** 로 나뉩니다. 여기서 샘플은 비디오 프레임이나 오디오 프레임을 의미합니다. - **mvhd (Movie Header)**: 전체 동영상 파일에 대한 정보를 담고 있습니다. 예를 들어, 동영상의 **전체 길이**, **타임스케일(초당 프레임 수)**, **시작 시간** 등이 포함됩니다. - **trak (트랙 정보)**: 비디오 및 오디오 트랙에 대한 정보를 포함합니다. **trak**은 비디오와 오디오의 개별 트랙을 구분합니다. ##### 예시: ``` 0000026c 6d766864 00000000 d0000000 d0000000 00000000 00000001 ``` 이 부분에서: - **6d766864**는 **'mvhd'** 를 나타냅니다. - 이어지는 데이터는 동영상의 시간 정보 및 동기화 정보를 포함합니다. #### 2.3 **미디어 데이터(mdat)** **mdat** 섹션에는 실제 **비디오 및 오디오 데이터**가 저장됩니다. 이 데이터는 **압축된 형태**로 저장되며, 재생할 때 코덱을 사용해 디코딩됩니다. **비디오 프레임**과 **오디오 샘플**이 차례대로 저장됩니다. ##### 예시: ``` 00003000 6d646174 001fac23 afb34a29 ... ``` - **6d646174**는 **'mdat'** 를 나타내며, 여기부터 실제 비디오 및 오디오 데이터가 시작됩니다. - 이 이후의 데이터는 **비디오 코덱(H.264 등)**을 사용해 압축된 프레임들입니다. ### 3. **비디오 코덱에 따른 데이터 구조** 동영상 파일에서 가장 중요한 부분은 **비디오 데이터**입니다. 이 데이터는 **코덱**에 의해 압축되어 저장됩니다. 대표적으로 사용되는 **H.264** 코덱을 예로 들면, **I-프레임**, **P-프레임**, **B-프레임**의 구조로 나뉩니다. #### 3.1 **I-프레임(Intra-coded Frame)** - **I-프레임**은 **완전한 이미지**로, 독립적으로 디코딩될 수 있습니다. I-프레임은 압축이 덜 되어 크기가 크지만, 이 프레임을 기준으로 다른 프레임을 디코딩합니다. ##### I-프레임 예시: ``` 0001a23b 6764 00 33 acb27e b233... ``` - 여기서 **6764**는 H.264에서 I-프레임을 나타내는 비트 패턴입니다. 뒤따르는 데이터는 완전한 이미지로 복원될 수 있는 정보입니다. #### 3.2 **P-프레임(Predicted Frame)** - **P-프레임**은 **이전 프레임을 참조**하여 생성된 프레임입니다. P-프레임은 이전 프레임과의 **차이 정보**만 저장하여 압축률을 높입니다. ##### P-프레임 예시: ``` 0001c231 6765 00 23 df124e ... ``` - **6765**는 P-프레임을 나타내며, 뒤따르는 데이터는 이전 프레임(I-프레임 또는 P-프레임)과의 차이만 기록됩니다. #### 3.3 **B-프레임(Bidirectional Frame)** - **B-프레임**은 **이전 프레임과 다음 프레임을 모두 참조**하여 생성된 프레임입니다. B-프레임은 가장 높은 압축률을 제공하지만, 디코딩 시 **양방향 참조**가 필요합니다. ##### B-프레임 예시: ``` 0001e532 6766 00 12 af344d ... ``` - **6766**은 B-프레임을 나타내며, 양방향 참조를 통해 데이터를 압축합니다. ### 4. **오디오 데이터의 구조** **오디오 데이터**도 **트랙**으로 저장되며, 각각의 오디오 샘플이 비디오 프레임과 **동기화**되어 저장됩니다. MP4 파일의 경우, **AAC**와 같은 오디오 코덱이 자주 사용됩니다. ##### 예시 (AAC 오디오 데이터): ``` 0001f000 000000 010001 78e540 ... ``` - 이 데이터는 **AAC 코덱**으로 압축된 오디오 정보를 포함하고 있으며, 재생 시 동영상 프레임과 동기화됩니다. ### 5. **메타데이터** 동영상 파일에는 비디오와 오디오 스트림 외에도 **메타데이터**가 포함됩니다. 메타데이터는 동영상의 해상도, 길이, 코덱 정보, 타임코드, 자막 트랙 등의 정보를 포함합니다. #### 메타데이터 예시: ``` 00000400 6d657461 64617461 000000 ... ``` - **6d657461**는 **'meta'** 를 나타내며, 이후에는 동영상의 다양한 정보(길이, 해상도, 비트레이트 등)가 기록됩니다. --- ### 결론: 실제 데이터 구조 요약 - **MP4 파일**은 **컨테이너 포맷**으로, **ftyp**, **moov**, **mdat** 등의 섹션으로 나뉩니다. - **ftyp**은 파일 타입을 정의하고, **moov**는 메타데이터와 타임코드, 트랙 정보를 저장합니다. - **mdat**는 실제 비디오와 오디오 데이터를 포함하는 섹션입니다. - **코덱(H.264 등)** 을 사용해 비디오 프레임이 압축되어 저장되며, **I-프레임**, **P-프레임**, **B-프레임**의 구조로 압축됩니다. - **오디오 데이터**도 트랙으로 저장되며, 비디오와 **동기화**되어 재생됩니다. - **메타데이터**는 비디오의 해상도, 길이, 코덱 정보 등을 포함하여 동영상 재생과 관리를 돕습니다. 동영상의 데이터 구조는 사진보다 훨씬 복잡하며, **시간 정보**, **프레임 간 압축**, **오디오 데이터**와의 동기화가 중요한 역할을 합니다.