Problem mp3 Titellänge bei MCI-MP3-Commands

Anfängerfragen zum Programmieren mit PureBasic.
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von schleicher »

ccode_new hat geschrieben: Das Ende vom Lied:
Mp3 Dateien mit korrekten ID3-Tags sind zu bevorzugen und in der "Else-Klausel" zu reparieren.
Bräuchte ich nur eine Idee wie man die mp3 Dateien mit inkorrekten ID3-Tags am schnellsten erkennt.Audiogenie liefert ja eine Länge,aber falsch. Da wäre besser, wenn es garkeine Länge wiedergeben würde. Mediainfo habe ich dafür nun eingebaut.
Purebasic 5.51
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von ccode_new »

Man könnte vielleicht erstmal mit der Dateigröße prüfen ob die Songlänge stimmen könnte. (Sehr grobe Prüfung)

Man könnte auch beim Abspielen der Mp3 einen Timer mit laufen lassen. Die Timer-Zeit nach Durchlauf könnte eingetragen werden.
(Sehr genau, aber sehr langsame und gedultige Prüfung)

Quatsch bei Seite!

Wie falsch ist den die falsch ausgelesene Zeit beim "AudioGenie" ?

Mich interessiert auch immernoch wie der Windows-Explorer so schnell die korrekte Länge ermittelt.

Die MCI/DirectShow (Win 32 API) versagt ja bei VBR.

Aber es gibt ja auch noch modernere Microsoft Multimedia-API (meistens über .Net-Framework.)

(Es fehlt nur noch das WIE unter PureBasic)

Der Weg über die MediaInfo.dll ist aber auch ersteinmal ganz ok.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von schleicher »

ccode_new hat geschrieben: Wie falsch ist den die falsch ausgelesene Zeit beim "AudioGenie" ?
Audiogenie zeigt über 21min statt über 3min.
Wie der Windowsexplorer das macht interessiert mich auch.
Solange es keine bessere Lösung gibt lasse ich das nun erst einmal so mit Mediainfo.
Purebasic 5.51
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von ccode_new »

Servus !

Ich habe tolle Nachrichten.

Es gibt eine Lösung.
(Benötigt Windows > XP (Vista, 7, …) )
(Unter Windows XP funktioniert es glaube ich nicht. Es könnte aber trotzdem mal getestet werden.)

Benötigt die tolle "COMatePLUS"-Bibliothek aus diesem Forum.

Code: Alles auswählen

IncludePath "..\"
XIncludeFile "COMatePLUS.pbi"

Structure _EOP
  Description.s
  Value.s
EndStructure

Global NewMap EOP_Items._EOP()

Procedure GetExtendedFileProperties(file$, Map Item._EOP())
  Define.COMateObject oShell
  Define.COMateObject oFolder
  Define.COMateObject oFolderItem
  Define.COMateObject oFolderItems
  Define   DetailCounter
  Define.s DetailDescription, DetailValue
  
  
  oShell = COMate_CreateObject("Shell.Application")
  
  If oShell
    oFolder = oShell\GetObjectProperty("NameSpace('" + GetPathPart(file$) + "')")
    
    If oFolder
      oFolderItems = oFolder\GetObjectProperty("Items")
      
      If oFolderItems
        oFolderItem  = oFolder\GetObjectProperty("ParseName('" + GetFilePart(file$) + "')")
        
        If oFolderItem
          For DetailCounter = 0 To 512
            DetailDescription = oFolder\GetStringProperty("GetDetailsOf(" + Str(oFolderItems) + " As COMateObject, " + Str(DetailCounter) + ")")
            DetailValue       = oFolder\GetStringProperty("GetDetailsOf(" + Str(oFolderItem)  + " As COMateObject, " + Str(DetailCounter) + ")")
            
            If DetailValue
              If AddMapElement(Item(), Str(DetailCounter))
                Item()\Description = DetailDescription
                Item()\Value       = DetailValue
                ;Debug "Nr." + Str(DetailCounter) + " -> " + DetailDescription + ": " + DetailValue
              EndIf
            EndIf
          Next
          
          oFolderItem\Release()
          
        Else
          Debug "!oFolderItem"
          Debug COMate_GetLastErrorDescription()
        EndIf
        
        oFolderItems\Release()
        
      Else
        Debug "!oFolderItems"
        Debug COMate_GetLastErrorDescription()
      EndIf
      
      oFolder\Release()
      
    Else
      Debug "!oFolder"
      Debug COMate_GetLastErrorDescription()
    EndIf
    
    oShell\Release()
    
  Else
    Debug "!oShell"
    Debug COMate_GetLastErrorDescription()
  EndIf
EndProcedure

Procedure.s GetSongDuration()
  ProcedureReturn EOP_Items("27")\Value
EndProcedure


media.s = OpenFileRequester("Mp3 Suche!", "*.mp3", "Mp3|*.mp3", 0)

GetExtendedFileProperties(media, EOP_Items())

MessageRequester("Song-Duration", "Die Mp3-Länge ist: "+ GetSongDuration(), #PB_MessageRequester_Info)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von schleicher »

Hallo ccode_new

Das sind ja wirklich tolle Nachrichten.
Ich habs getestet und funktoniert tadellos. Und schnell ist es auch . Prima.
Hab es gleich eingebaut.


Habe noch ein Problem bei Audiogenie festgestellt.
Manche Bilder werden nicht in den ID3Tag übernommen obwohl :

Code: Alles auswählen

If SetCoverImage(imagepad, "CoverFront", #CoverFront)
                  Debug "Das Bild wurde übernommen."
                Else
                  Debug "Das Bild wurde nicht übernommen."
                EndIf
Debug ausgibt : Das Bild wurde übernommen.
Alles andere vom ID3TAG wird immer richtig gespeichert. Die Bilder sind immer .jpg und haben eine Auflösung von 300x300
Purebasic 5.51
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von ccode_new »

Sorry!

Ändere es bitte so:

Return:
Int16 normalerweise -1, bei Fehler 0

PseudoCode:
If Abs(..Funktion..)
#True
Else
#False
EndIf
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von schleicher »

Habe das Problem finden können. Im Id3Tag können mehrere Bilder gespeichert sein.
Bei

Code: Alles auswählen

GetCoverImage(temp_CoverFront, 1) 
wird das Bild 1 geladen .
Wenn ich

Code: Alles auswählen

SetCoverImage(temp_coversave ,"Cover Front", #CoverFront)
mache dann wird das Bild 1 aber nicht überschrieben, sondern es wird als Bild 2 oder Bild 3 hinzugefügt.

Man müsste eine Funktion haben die alle vorhanden Bilder löscht.
Purebasic 5.51
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von ccode_new »

Habe das Problem finden können. Im Id3Tag können mehrere Bilder gespeichert sein.
Genau so ist es.

Für diesen Fall habe ich ja auch diese Konstellation in den Test eingebaut.

GetCoverImage(GetCurrentDirectory()+"song.jpg", 1)
GetCoverImage(GetCurrentDirectory()+"song.jpg", 2)
;RemoveTag()

RemoveTag() würde auch alle Bilder löschen.
Es müssen nur die anderen Daten zwischengespeichert und neu gesetzt werden.

Es ist bei Änderung der Set-Funktion auch möglich nur Bildlinks zu speichern.

In früheren Versionen der AudioGenie-Lib gib es noch die Funktion "ID3V2DeletePictures()".

Diese Funktion ist aber in der Version 3 nicht mehr enthalten.

Anbei:
Wie man überhaupt auf die Idee kommt den Rückgabewert standardmäßig auf -1 zulegen? So ein Mist! ;)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
schleicher
Beiträge: 214
Registriert: 30.03.2014 19:57
Computerausstattung: Purebasic 5.70
Wohnort: 18314 Löbnitz

Re: Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von schleicher »

RemoveTag() würde auch alle Bilder löschen.
Es müssen nur die anderen Daten zwischengespeichert und neu gesetzt werden.
Danke für den Tip. :allright:

RemoveTag() hat das Problem gelöst ! Wie du sagtest: Daten zwischenspeichern, RemoveTag()
ausführen und Daten mit neuem Bild speichern.
Purebasic 5.51
Antworten