본문 바로가기
IT/programming

[C/C++] parse mp3 header/C언어 MP3 헤더 분석 함수 공유

by 어느해겨울 2022. 1. 7.

parse mp3 header

C언어 MP3 헤더 분석에 도움이 될 함수를 공유한다.

이번 코드는 C언어를 기준으로 작성하였고 main()이 없이 함수만 공유하니 상황에 맞게 사용하면 되겠다.

 

MP3 파일 또는 스트리밍의 구성은 AAU(Audio Access Uint)의 연속으로 이루어져 있으며 각 AAU는 매직 비트, 헤더(프레임 정보), 프레임 데이터로 구성이 되어있다. 즉 MP3 파일을 재생하기 위해선 샘플 레이트, 비트레이트, 채널, MP3 코덱 정보 등 재생 정보가 필요한데 이 정보는 각각의 AAU마다 존재하는 헤더에 구성되어있단 것이다.

위의 이유로 프레임데이터를 추출하기 위해선 AAU의 정보를 추출하는 것이 매우 중요하고 아래 head parser는 그것에 도움을 줄 수 있다.

 

 

소스코드

#include <stdio.h>

typedef char MP3E_INT8;

const int ARR_SAMPLE_RATE[4] = {44100, 48000, 32000};
const int ARR_BIT_RATE[16] = {0, 32000, 40000, 48000, 56000, 64000, 80000, 96000,
			  112000, 128000, 160000, 192000, 224000, 256000, 320000, 0};
struct MP3_HEADER {
	int version;
	int layer;
	int errp;
	int bitrate;
	int freq;
	int pad;
	int priv;
	int mode;
	int modex;
	int copyright;
	int original;
	int emphasis;
} typedef MP3_HEADER_t;


int parse_mp3_header(const MP3E_INT8 *_ptr_frame, MP3_HEADER_t *_t_mp3_header) {
	unsigned char *ptr_frame = (unsigned char *)_ptr_frame;

	if( !(((ptr_frame[0] & 0xFF) == 0xFF) && ((ptr_frame[1] >> 5) & 0x07) == 0x07) ) {
		return -1;
	}

	_t_mp3_header->version		= (ptr_frame[1] & 0x08) >> 3;
	_t_mp3_header->layer 		= 4 - ((ptr_frame[1] & 0x06) >> 1);
	_t_mp3_header->errp 		= (ptr_frame[1] & 0x01);

	_t_mp3_header->bitrate 		= ARR_BIT_RATE[(ptr_frame[2] & 0xf0) >> 4];
	_t_mp3_header->freq 		= ARR_SAMPLE_RATE[(ptr_frame[2] & 0x0c) >> 2];
	_t_mp3_header->pad		= (ptr_frame[2] & 0x02) >> 1;
	_t_mp3_header->priv		= (ptr_frame[2] & 0x01);

	_t_mp3_header->mode 		= (ptr_frame[3] & 0xc0) >> 6;
	_t_mp3_header->modex 		= (ptr_frame[3] & 0x30) >> 4;
	_t_mp3_header->copyright 	= (ptr_frame[3] & 0x08) >> 3;
	_t_mp3_header->original 	= (ptr_frame[3] & 0x04) >> 2;
	_t_mp3_header->emphasis 	= (ptr_frame[3] & 0x03);

	printf("version   = %x \n", _t_mp3_header->version);
	printf("layer     = %x \n", _t_mp3_header->layer);
	printf("errp      = %x \n", _t_mp3_header->errp);
	printf("bitrate   = %d \n", _t_mp3_header->bitrate);
	printf("freq      = %d \n", _t_mp3_header->freq);
	printf("pad       = %x \n", _t_mp3_header->pad);
	printf("priv      = %x \n", _t_mp3_header->priv);
	printf("mode      = %x \n", _t_mp3_header->mode);
	printf("modex     = %x \n", _t_mp3_header->modex);
	printf("copyright = %x \n", _t_mp3_header->copyright);
	printf("original  = %x \n", _t_mp3_header->original);
	printf("emphasis  = %x \n", _t_mp3_header->emphasis);

	return 0;
}

 

이번 포스팅에는 header parse 함수만 공유하고 추후에 MP3 파일을 읽고 header를 parse 하여 en/decode 하는 방법도 공유하겠다.

 

끝.

 

 

댓글