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 하는 방법도 공유하겠다.
끝.
'IT > programming' 카테고리의 다른 글
[C/C++] 오름차순 정렬, 내림차순 정렬 C언어, qsort 활용 (0) | 2022.01.10 |
---|---|
[C/C++] readdir을 활용한 파일 목록 읽기 예제, 파일 탐색기 (0) | 2022.01.07 |
[C/C++] ALSA PCM capture(recoding) 소스 코드 공유 (0) | 2021.12.28 |
[C/C++] signal handler library 활용과 소스코드 공유 (0) | 2021.12.24 |
[C/C++] C언어 main 함수 전/후에 함수를 실행 하는 방법 (0) | 2021.12.21 |
댓글