[BC3] [Visual Basic] Mp3: ID3 Tag inlezen

Pagina: 1
Acties:
  • 168 views sinds 30-01-2008
  • Reageer

  • BC3 Victim
  • Registratie: Juli 2001
  • Laatst online: 29-09-2006
Ik werk aan een programma om de ID3 Tag van eem MP3-bestand in te lezen
Ik heb iets dat ''werkt'' maar het gaat nogal traag. Is er iemand die mij hierbij kan helpen?

Hier volgt het script:

''DEEL1
''DIT IS HET DEEL DAT TRAAG IS

Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.OpenTextFile(Pad & Bestandsnaam)
Do While a.AtEndOfStream <> True
Tekst = TekstString
TekstString = a.Read(30000)
Loop
a.Close
TekstString = Tekst & TekstString
Plaats = (InStr(1, TekstString, "TAG"))

''DEEL2

If Plaats <> 0 Then
Titel = RTrim(Mid(TekstString, Plaats + 3, 30))
Artiest = RTrim(Mid(TekstString, Plaats + 33, 30))

''DEEL3

Stopplaats = 0
N = 1
If Len(Artiest) = 30 Then
Do While Stopplaats = 0 And N <= 30
If (Len(Artiest) >= N) Then
If (Asc(Mid(Artiest, N, 1))) = 0 Then
Stopplaats = N
End If
End If
N = N + 1
Loop
If Stopplaats <> 0 Then
Artiest = Mid(Artiest, 1, N - 2)
End If
End If
If Len(Titel) = 30 Then
Stopplaats = 0
N = 1
Do While Stopplaats = 0 And N <= 30
If (Len(Titel) >= N) Then
If (Asc(Mid(Titel, N, 1))) = 0 Then
Stopplaats = N
End If
End If
N = N + 1
Loop
If Stopplaats <> 0 Then
Titel = Mid(Titel, 1, N - 2)
End If
End If


End If


Een woordje uitleg:
Eerst en vooral: de ID3-Tag staat helemaal achteraan in het bestand

DEEL1: Ik lees de tekst in, in blokken van 30000 (omdat het maximum een dikke 60000 is en ik voeg straks 2 blokken samen)
Hier voeg ik ze samen: TekstString = Tekst & TekstString
Dit doe ik omdat het laatste overschotje bvb maar 5 tekens zouden kunnen zijn, en dan heb ik niet mijn ganse ID3 Tag.
In de constante plaats sla ik de plaats van de Tag in het tekstblok op

DEEL2
In deel 2 kap ik de achterste spaties weg van Artiest en Titel

DEEL3
Deel 3 doet niets meer dan tekens met ASCII-code 0 die achter Artiest of Nummer kunnen staan, weghalen. De nieuwste versies van WinAmp zetten namelijk geen spaties achter Artiest en Nummer, maar gewoon NULL-tekens (of hoe noemt ASCII 0)

Het is het inlezen en telkens kopiëren van het tekstblok (dat van 30000 tekens) dat véél tijd in beslag neemt. Ik heb al geprobeerd met een ReadLine (omdat je dan het vorige tekstblok niet zou moeten opslaan) maar dit kreeg ik niet aan de praat.

Ik ben benieuwd wie mij hiermee kan helpen.
Veel succes ermee ;)

De username van de oorspronkelijke plaatser van deze posting is bij Big Crash 3 eind mei 2001 verloren gegaan. Om toch de posting zelf terug te kunnen plaatsen is de user BC3 Victim in het leven geroepen


  • Lord-M
  • Registratie: September 2000
  • Laatst online: 17-07 20:42
Ik heb vrijwel geen verstand van VB, maar kun je niet gewon de grote van het bestand opvragen en dan mbv die grote de plaats van de ID3 Tag bepalen?

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 09:44

johnwoo

3S-GTE

Gebruik geen FileSystemObject; dat wordt door een scriptengine afgehandeld en is sowieso trager dan gecompileerde code.

Gebruik in plaats daarvan gewoon dit:
code:
1
2
3
4
5
6
7
8
9
Private Const TagGrootte = 50 ' Grootte van ID3 tag

[...]

Dim buffer As String * TagGrootte
FileNum = FreeFile
Open "bla.mp3" For Binary As FileNum
Get FileNum, LOF(FileNum) - TagGrootte, buffer
Close FileNum

Om een directory (of tree) door te snuffelen gebruik je Dir$(). Dit gaat veel sneller dan een script object.
En als die ID3 tag bestaat uit strings van vaste grootte maak je daar natuurlijk een user-defined type van en lees je direct in van de file naar een variabele van dat type, in plaats van een string.

Owja, en plaats is geen constante maar een variabele :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Klont
  • Registratie: Maart 2000
  • Laatst online: 17-07-2021

Klont

Destroyer of words

Er is een manier om voor Binary Input ofzo de leespositie op LOF(sFile)-128 te zetten en dan doodleuk de resterende 128 bytes uit te lezen.
Ik weet die alleen niet uit mn hoofd, moet je maar even rondzoeken.
Maar de HELE file inlezen totdat je bij het woordje ''TAG'' komt is geen oplossing, de tag zit toch altijd aan het einde van de mp3.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 09:44

johnwoo

3S-GTE

Op maandag 30 april 2001 19:26 schreef Klont het volgende:
Er is een manier om voor Binary Input ofzo de leespositie op LOF(sFile)-128 te zetten en dan doodleuk de resterende 128 bytes uit te lezen.
Ik weet die alleen niet uit mn hoofd, moet je maar even rondzoeken.
Maar de HELE file inlezen totdat je bij het woordje ''TAG'' komt is geen oplossing, de tag zit toch altijd aan het einde van de mp3.
Ja, met Seek kan dat, maar je kan het ook direct met de Get meegeven (zie mijn voorbeeldje boven jouw reply :))

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • Klont
  • Registratie: Maart 2000
  • Laatst online: 17-07-2021

Klont

Destroyer of words

Owja, Seek wat het :P
OK je bent me voor en het is nog korter ook :)

Verwijderd

Als je de laatste 128 bytes inleest moet je je code wel helemaal aanpassen als je''m ook compatible met ID3V2 en Lyrics3 tags wil maken.. :7

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:03

BdR

TV is gooder then books

beter laat dan nooit.. in Visual Basic kan je et als volgt doen. Om dit te testen maak je ff een formpje met 2 text boxes, de ene noem je txtFileName en de andere txtInfo. Van txtInfo zet je Multiline op true en scrollbars op both. Maak nu een knop (command button) en plak de volgende code erachter.. als je op de knop klikt gaat hij de mp3 die opgegeven staat in de textbox txtFileName behandelen, bijv. "c:\test.mp3"
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Dim vID3location

Open txtFileName.Text For Binary As #1   ' Open file as binary.
vID3location = LOF(1) - 127
Seek #1, vID3location

vCheckTag = Input(3, #1)

If (vCheckTag = "ID3" Or vCheckTag = "TAG") Then
  
  vTrackname = Input(30, #1)
  vArtistname = Input(30, #1)
  vAlbumname = Input(30, #1)
  vYear = Input(4, #1)
  vComment = Input(30, #1)
  vGenre = Input(1, #1)
  
  RTrim (vTrackname)
  RTrim (vArtistname)
  RTrim (vAlbumname)
  RTrim (vYear)
  RTrim (vComment)
  RTrim (vGenre)

  txtInfo.Text = "vCheckTag = " & vCheckTag
  txtInfo.Text = txtInfo.Text & vbCrLf & "Trackname = " & vTrackname
  txtInfo.Text = txtInfo.Text & vbCrLf & "Artistname = " & vArtistname
  txtInfo.Text = txtInfo.Text & vbCrLf & "Albumname = " & vAlbumname
  txtInfo.Text = txtInfo.Text & vbCrLf & "Year = " & vYear
  txtInfo.Text = txtInfo.Text & vbCrLf & "Comment = " & vComment
  txtInfo.Text = txtInfo.Text & vbCrLf & "Genre = " & vGenre
  
End If

Close #1

eitje toch :7

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider

Pagina: 1