본문 바로가기
Knowledge/CS 지식

[Codec 분석] Signature Code

by 잘 까먹는 다람쥐 2025. 3. 4.
오래된 스토리지의 음원 파일을 새로운 스토리지로의 데이터 이전 요청을 받았다.
그리고 각 코덱별로 분류를 해달라고 한다.
어떤 파일들이 들어있나.. 확인해보니 이게 뭐야..
pcm, mp3, g723.1(ms), g729(sipro), gsm 온갖 짬뽕이네!

이걸 어떻게 분류하지??

 

 

오디오 파일은 Header 정보에 Codec에 대한 고유 코드 (Signature Code)를 가지고 있다.

 

우리는 Signature Code 정보를 활용하여 각 음원 형태 별로 대응 방안을 다르게 구성할 수 있다.

 

그 방법을 자세하게 알아보자.

1. 시그니처 코드란?

시그니처 코드(Signature Code)는 특정 오디오 또는 비디오 코덱이 파일 내에서 사용되었는지를 식별하는 고유한 값이다. WAV, MP3, AAC와 같은 다양한 오디오 포맷은 각각 특정한 시그니처 값을 포함하고 있으며, 이를 통해 코덱을 판별할 수 있다.

 

2. C#을 이용한 코덱 시그니처 코드 확인

아래는 WAV 파일에서 특정 오디오 코덱을 확인하는 함수이다.

private bool CheckCodecG729(string tempWavDecFile)
        {
            try
            {
                using (FileStream fs = new FileStream(tempWavDecFile, FileMode.Open, FileAccess.Read))
                {
                    // 파일 헤더의 크기: 256로 고정 (수정 가능)
                    const int headerSize = 256;
                    byte[] buffer = new byte[headerSize];

                    // 파일에서 헤더 부분만 Read
                    int bytesRead = fs.Read(buffer, 0, buffer.Length);

                    if (bytesRead > 0)
                    {
                        // 헤더에서 시그니처 코드 확인
                        if (CheckSignatureInBuffer(buffer, bytesRead))
                        {
                            return true; // G.729 코덱 확인된 경우
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("[Error][Message]:MethodBase.GetCurrentMethod().Name + " - " + ex.Message");                
            }

            return false; // G.729 코덱이 아님
        }

        /// <summary>
        /// 버퍼에서 G729 시그니처 코드를 확인하는 메서드
        /// </summary>
        private bool CheckSignatureInBuffer(byte[] buffer, int length)
        {
            for (int i = 0; i < length - 1; i++) // 최소 2바이트씩 검사
            {
                ushort value = BitConverter.ToUInt16(buffer, i);

                //Sipro Lab G.729_307
                if (value == 307)
                {
                    return true; // G.729 시그니처 코드 발견한 경우
                }
            }

            return false; // 시그니처 코드가 없는 경우
        }

 

위의 코드와 같이 특정 시그니처 코드에 대한 검사를 통해 해당 음원이 어떤 코덱으로 이루어졌는 지 확인이 가능하다.

예시의 경우에는 g729 (sipro) 를 대상으로 진행했지만, 탐색을 원하는 Signature Code로 변경하여 원하는 코덱의 음원을 분류할 수 있다.

 

3. 주요 오디오 코덱의 시그니처 코드

아래 표는 주요 오디오 코덱과 해당하는 시그니처 코드 값(16진수 및 10진수) 목록이다. 

Value (Hex) Value (Dec) Audio Encoding
0x0001 1 Microsoft PCM
0x0002 2 Microsoft ADPCM
0x0006 6 ITU G.711 a-law
0x0007 7 ITU G.711 μ-law
0x0011 17 IMA ADPCM
0x0022 34 Microsoft GSM 6.10
0x0030 48 Microsoft G723.1
0x0031 49 IBM AVC Adaptive Differential
0x0050 80 MPEG Layer-3 (MP3)
0x0055 85 MPEG AAC
0x0072 114 G.726
0x0083 131 GSM 610
0x0123 291 G.723
0x0133 307 Sipro Lab G.729
0xA109 41225 Speex

 

4. 어디에 활용하는가?

  • 자동화 시스템에서 오디오 파일의 코덱 확인: 특정 코덱이 필요한 경우, 시그니처 코드를 기반으로 파일을 분류할 수 있다.
  • 멀티미디어 변환 프로그램(ffmpeg)과의 연동: 변환 전에 코덱 정보를 확인하여 적절한 변환 옵션을 부여할 수 있다.

 

정리하면, C#을 이용한 시그니처 코드 분석을 통해 오디오 파일의 코덱을 판별할 수 있고,  FFmpeg 등의 툴과 함께 활용하면 효과적인 멀티미디어 처리가 가능하다.

 

위에서 소개한 시그니처 코드 표를 참고하여 다양한 오디오 포맷을 식별하는 데 활용해보자.

'Knowledge > CS 지식' 카테고리의 다른 글

오디오 포맷 : WAV  (1) 2025.01.29