Article View: borland.public.cppbuilder.multimedia
Article #1115mpeg audio headers
From: Adam Casperson
Date: Sun, 09 Dec 2001 09:45
Date: Sun, 09 Dec 2001 09:45
96 lines
3606 bytes
3606 bytes
Hi all
Im having a lot of trouble trying to read mp3 file headers (its driving me
nuts actually). I only need to read the version, layer, and bitrate so that
I can then calculate the play time of the song. Below is the code I'm using
to do this
int __fastcall TForm1::GetMPEGFileLength(String fileName)
{
DWORD buffer;
int fileSize, temp;
FILE *openFile;
if((openFile = fopen(fileName.c_str(), "rb")) != NULL) {
fileSize = fseek(openFile, 0, 2);
fseek(openFile, 0, 0);
fread(&buffer, 1, 4, openFile);
temp = ExtractBinary(buffer, 19, 20);
PlayList->Items->Add("Ver bin " + String(temp));
switch (temp)
{
case 1:
mpegVer = 0;
break;
case 2:
mpegVer = 2;
break;
case 3:
mpegVer = 1;
break;
default:
mpegVer = -1;
}
temp = ExtractBinary(buffer, 17, 18);
PlayList->Items->Add("Layer bin " + String(temp));
switch (temp)
{
case 1:
mpegLayer = 3;
break;
case 2:
mpegLayer = 2;
break;
case 3:
mpegLayer = 1;
break;
default:
mpegLayer = -1;
}
temp = ExtractBinary(buffer, 12, 15);
PlayList->Items->Add("Rate bin " + String(temp));
int x = -1;
if (mpegVer == 1)
{
if (mpegLayer == 1) x = 0;
else if (mpegLayer == 2) x = 1;
else if (mpegLayer == 3) x = 2;
}
else if (mpegVer == 2)
{
if (mpegLayer == 1) x = 3;
else if ((mpegLayer == 2) || (mpegLayer == 3)) x = 4;
}
mpegBitRate = bitrates[x][temp];
fclose(openFile);
int seconds = (fileSize * 8) / (mpegBitRate * 1000);
return seconds;
} else {
return 0;
}
}
//--------------------------------------------------------------------------
-
int __fastcall TForm1::ExtractBinary(DWORD binary, int leastSig, int
mostSig)
{
DWORD temp = binary;
for(int x = 0; x < (32 - (mostSig + 1)); x++) {
temp <<= 1;
}
for(int x2 = 0; x2 < (32 - (mostSig + 1)); x2++) {
temp >>= 1;
}
for(int y = 0; y < leastSig; y++) {
temp >>= 1;
}
return (int)temp;
}
Using this code, for some files I get the correct version and layer but
incorrect bitrate, or I get the wrong version and layer and the bitrate is
then blown out to some stupid number like -480000. Does anyone know what I'm
doing wrong? Thanks
Technical Details
Message-ID:
<3c13328e_1@dnews>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!newsfeed.direct.ca!look.ca!newsfeed.wirehub.nl!PeerFeed.KWeb.on.ca!dnewsShow Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 10d0fc,3b37c3bd0be588af,start X-Google-Attributes: gid10d0fc,public X-Google-ArrivalTime: 2001-12-09 01:55:54 PST From: "Adam Casperson" <casper2700@yahoo.com.au> Newsgroups: borland.public.cppbuilder.multimedia Subject: mpeg audio headers Date: Sun, 9 Dec 2001 19:45:47 +1000 Lines: 98 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 NNTP-Posting-Host: 203.102.79.171 Message-ID: <3c13328e_1@dnews> X-Trace: dnews 1007891086 203.102.79.171 (9 Dec 2001 01:44:46 -0800) Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!newsfeed.direct.ca!look.ca!newsfeed.wirehub.nl!PeerFeed.KWeb.on.ca!dnews