/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Læsning af mp3 fil
Fra : Claus Jørgensen


Dato : 26-08-04 00:47

Hej



Er der nogen som har et link på en hjemmeside som beskriver, hvordan man
læser en fil i C++, som ikke er en alm. tekst-fil (fx en mp3 fil)? De fleste
hjemmesider jeg har fundet beskriver ikke, hvad man kan gøre, hvis man gerne
vil læse en fil, som et andet program har lavet.



Jeg er igang med at lave et program i Borland C++ som kan læse en mp3 fil
for at hente de forskellige oplysninger ud som: titel, kunstner, osv.
Problemet er at jeg bliver nødt til at finde de forskellige tags i filen,
hvor de forskellige oplysninger befinder sig, men når jeg bruger find fra
<string>, så er det forskelligt fra fil til fil, om den kan finde den tag
jeg ønsker at finde. Sålænge det er en tekst fil, som en *.h eller *.cpp så
virker det fint. Jeg bruger string::size_type pos = string.find (str) til at
finde positionen på den tag jeg skal bruge, og vil så benytte file.seekg()
til at flytte pointeren det rigtige sted hen. Hvordan kan jeg finde
positionen på de forskellige tags, for det virker ikke helt, så længe det er
en mp3 fil jeg ønsker at læse?



Venlig hilsen

Claus Jørgensen



 
 
Niels Dybdahl (26-08-2004)
Kommentar
Fra : Niels Dybdahl


Dato : 26-08-04 15:08

> Jeg er igang med at lave et program i Borland C++ som kan læse en mp3 fil
> for at hente de forskellige oplysninger ud som: titel, kunstner, osv.
> Problemet er at jeg bliver nødt til at finde de forskellige tags i filen,
> hvor de forskellige oplysninger befinder sig, men når jeg bruger find fra
> <string>, så er det forskelligt fra fil til fil, om den kan finde den tag
> jeg ønsker at finde. Sålænge det er en tekst fil, som en *.h eller *.cpp

> virker det fint. Jeg bruger string::size_type pos = string.find (str) til
at
> finde positionen på den tag jeg skal bruge, og vil så benytte file.seekg()
> til at flytte pointeren det rigtige sted hen. Hvordan kan jeg finde
> positionen på de forskellige tags, for det virker ikke helt, så længe det
er
> en mp3 fil jeg ønsker at læse?

Du skal for det første sætte dig ind i læsning af "binære filer". Det er
ikke helt så nemt som at læse tekstfiler. Jeg kan desværre ikke huske hvad
standardfunktionerne til det hedder.

Desuden skal du læse om MP3 formatet. Du kan sikkert finde brugbare links
http://www.wotsit.org

Niels Dybdahl



Søren Boll Overgaard (26-08-2004)
Kommentar
Fra : Søren Boll Overgaard


Dato : 26-08-04 20:01

Hej,

Den Thu, 26 Aug 2004 16:08:01 +0200, skrev Niels Dybdahl:

[...]
> Du skal for det første sætte dig ind i læsning af "binære filer". Det er
> ikke helt så nemt som at læse tekstfiler. Jeg kan desværre ikke huske hvad
> standardfunktionerne til det hedder.

Du tænker muligvis på fread og venner?
http://www.rt.com/man/fread.3.html

--
Søren O.

Bertel Brander (26-08-2004)
Kommentar
Fra : Bertel Brander


Dato : 26-08-04 20:49

Claus Jørgensen wrote:

> Hej
>
>
>
> Er der nogen som har et link på en hjemmeside som beskriver, hvordan man
> læser en fil i C++, som ikke er en alm. tekst-fil (fx en mp3 fil)? De fleste
> hjemmesider jeg har fundet beskriver ikke, hvad man kan gøre, hvis man gerne
> vil læse en fil, som et andet program har lavet.
>

Man burde kunne bruge noget i stil med følgende.
Hvis ikke filen har en tag vil det tilføje en,
ellers udskriver den tag'en.

Jeg har hentet det meste information om tag'en her:
http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm


#include <iostream>
#include <fstream>
#include <string>

int main()
{
std::fstream File;
File.open("D:\\test.mp3", std::ios::binary | std::ios::in |
std::ios::out);
if(!File.is_open())
{
std::cerr << "Failed to open File" << std::endl;
return 0;
}
File.seekg(-128, std::ios::end);
char Tag[4];
Tag[3] = 0;
File.read(Tag, 3);
if(!strcmp(Tag, "TAG"))
{ // The file contains a tag, read it
char Buf[31];
Buf[30] = 0;
File.read(Buf, 30);
std::cout << "Title: " << Buf << std::endl;
File.read(Buf, 30);
std::cout << "Artist: " << Buf << std::endl;
File.read(Buf, 30);
std::cout << "Album: " << Buf << std::endl;
Buf[4] = 0;
File.read(Buf, 4);
std::cout << "Year: " << Buf << std::endl;
File.read(Buf, 30);
std::cout << "Comment: " << Buf << std::endl;
}
else
{ // No tag, add one
int i;
File.seekg(0, std::ios::end);
File.write("TAG", 3);
File.write("MyTitle", 7); // 30 bytes Title
for(i = 0; i < 23; i++)
File.write("", 1);
File.write("MyArtist", 8); // 30 bytes Artist
for(i = 0; i < 22; i++)
File.write("", 1);
File.write("MyAlbum", 7); // 30 bytes Album
for(i = 0; i < 23; i++)
File.write("", 1);
File.write("2004", 4); // 4 bytes Year
File.write("MyComment", 9); // 30 bytes Comment
for(i = 0; i < 21; i++)
File.write("", 1);
File.write("", 1); // One byte genre
}
}

--
What's in a name?
That which we call a rose by any other name would smell as sweet.
- Juliet

Claus Jørgensen (29-08-2004)
Kommentar
Fra : Claus Jørgensen


Dato : 29-08-04 01:12

> Jeg har hentet det meste information om tag'en her:
> http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm

Tak for svarene. Jeg har læst om MP3 formatet på http://www.id3.org/ og
ifølge denne hjemmeside er der en del forskellige tags som befinder sig
forskellige steder i MP3 filen. Det er disse tags jeg gerne vil finde ved
hjælp af positionen som jeg får returneret fra string.find(), men det virker
åbenbart kun for en alm. tekst fil. Er det fordi en MP3 fil er en binær fil,
at jeg ikke kan finde positionen ved hjælp af følgende kode?

ifstream file;
string s;
string str2 = "TIT2"; // TIT2 Title/songname/content description
int pos = 0;

file.open(PathEdit->Text.c_str(), ios::binary);

while(getline(file, s)) {
pos = s.find(str2);
}

RichEdit1->Text = pos;

file.close();

Venlig hilsen
Claus Jørgensen



Bertel Brander (29-08-2004)
Kommentar
Fra : Bertel Brander


Dato : 29-08-04 13:47

Claus Jørgensen wrote:
>>Jeg har hentet det meste information om tag'en her:
>>http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm
>
>
> Tak for svarene. Jeg har læst om MP3 formatet på http://www.id3.org/ og
> ifølge denne hjemmeside er der en del forskellige tags som befinder sig
> forskellige steder i MP3 filen. Det er disse tags jeg gerne vil finde ved
> hjælp af positionen som jeg får returneret fra string.find(), men det virker
> åbenbart kun for en alm. tekst fil. Er det fordi en MP3 fil er en binær fil,
> at jeg ikke kan finde positionen ved hjælp af følgende kode?
>

Ja, man kan ikke bruge getline og std::string's find med binære filer.
Du er vist nødt til at lave din egen søge algoritme, måske noget i
stil med:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
std::fstream File;
File.open("D:\\test.mp3", std::ios::binary | std::ios::in |
std::ios::out);
if(!File.is_open())
{
std::cerr << "Failed to open File" << std::endl;
return 0;
}
int state = 0;
char ToFind[] = "TIT2";
char x;

while(File.read(&x, 1))
{
if(x == ToFind[state])
{
state++;
if(ToFind[state] == 0)
{
unsigned int Pos = File.tellg();
Pos -= strlen(ToFind);
std::cout << "Found it: " << Pos << std::endl;
state = 0;
}
}
else
state = 0;
}
return 0;
}

--
What's in a name?
That which we call a rose by any other name would smell as sweet.
- Juliet

Bertel Brander (29-08-2004)
Kommentar
Fra : Bertel Brander


Dato : 29-08-04 14:31

Bertel Brander wrote:
> Claus Jørgensen wrote:
>
>>> Jeg har hentet det meste information om tag'en her:
>>> http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm
>>
>>
>>
>> Tak for svarene. Jeg har læst om MP3 formatet på http://www.id3.org/ og
>> ifølge denne hjemmeside er der en del forskellige tags som befinder sig
>> forskellige steder i MP3 filen. Det er disse tags jeg gerne vil finde ved
>> hjælp af positionen som jeg får returneret fra string.find(), men det
>> virker
>> åbenbart kun for en alm. tekst fil. Er det fordi en MP3 fil er en
>> binær fil,
>> at jeg ikke kan finde positionen ved hjælp af følgende kode?
>>
>
> Ja, man kan ikke bruge getline og std::string's find med binære filer.
> Du er vist nødt til at lave din egen søge algoritme, måske noget i
> stil med:
>

Den opmærksomme læser vil straks opdage at algoritmen ikke virker
hvis der står f.ex. TITIT2 i filen.

Et fix for dette overlader jeg til læseren.
Man kunne skrue fil pointeren tilbage med seekg hvis state er != 0
når state sættes til 0 i loopen.

--
What's in a name?
That which we call a rose by any other name would smell as sweet.
- Juliet

Claus Jørgensen (31-08-2004)
Kommentar
Fra : Claus Jørgensen


Dato : 31-08-04 17:34

> Ja, man kan ikke bruge getline og std::string's find med binære filer.
> Du er vist nødt til at lave din egen søge algoritme, måske noget i
> stil med:

Tak for hjælpen

Venlig hilsen
Claus Jørgensen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste