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

Problem mp3 Titellänge bei MCI-MP3-Commands

Beitrag von schleicher »

Ich habe mal diesen schon etwas älteren Code probiert und festgestellt das bei manchen mp3-Dateien die Länge nicht Korrekt angezeigt wird. Das hängt wohl mit der Bitrate zusammen.
Festgestelt habe ich es bei mp3-Dateien mit der Bitrate von 320 kbit/s oder variabler Bitrate.
Wie könnte man die Länge auf anderem Wege errechnen ? Ich habe schon viel gegoogelt, aber nur Berechnungen mit konstanter Bitrate gefunden.
Gefunden habe ich da noch die Userlib mp3info. Diese funktoniert jedoch nicht im Unicode.

Code: Alles auswählen

;Info: MCI-MP3-Commands
Enumeration 0
  #MP3_Unknown
  #MP3_Stopped
  #MP3_Playing
  #MP3_Paused
EndEnumeration
Procedure MP3_GetStatus(Nb)
  Result=#MP3_Unknown
  a$=Space(#MAX_PATH)
  i=mciSendString_("status MP3_"+Str(Nb)+" mode",@a$,#MAX_PATH,0)
  If i=0
    Debug a$
    Select a$
      Case "stopped":Result=#MP3_Stopped
      Case "playing":Result=#MP3_Playing
      Case "paused":Result=#MP3_Paused
    EndSelect
  EndIf
  ProcedureReturn Result
EndProcedure
Procedure MP3_Load(Nb,file.s)
  ;i=mciSendString_("open Sequencer!"+Chr(34)+file+Chr(34)+" alias mid"+Str(Nb),0,0,0)
  i=mciSendString_("OPEN "+Chr(34)+file+Chr(34)+" Type MPEGVIDEO ALIAS MP3_"+Str(Nb),0,0,0)
  If i=0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure
Procedure MP3_Play(Nb)
  i=mciSendString_("play MP3_"+Str(Nb),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_PlayStart(Nb)
  i=mciSendString_("play MP3_"+Str(Nb)+" from "+Str(0),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_PlayPart(Nb,Start,endPos)
  i=mciSendString_("play MP3_"+Str(Nb)+" from "+Str(Start)+" to "+Str(endPos),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_Pause(Nb)
  i=mciSendString_("pause MP3_"+Str(Nb),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_Resume(Nb)
  i=mciSendString_("resume MP3_"+Str(Nb),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_Stop(Nb)
  i=mciSendString_("stop MP3_"+Str(Nb),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_Free(Nb)
  i=mciSendString_("close MP3_"+Str(Nb),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_SetVolume(Nb,volume)
  i=mciSendString_("SetAudio MP3_"+Str(Nb)+" volume to "+Str(volume),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_GetVolume(Nb)
  a$=Space(#MAX_PATH)
  i=mciSendString_("status MP3_"+Str(Nb)+" volume",@a$,#MAX_PATH,0)
  ProcedureReturn Val(a$)
EndProcedure


Procedure MP3_SetSpeed(Nb,Tempo)
  i=mciSendString_("set MP3_"+Str(Nb)+" Speed "+Str(Tempo),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure MP3_GetSpeed(Nb)
  a$=Space(#MAX_PATH)
  i=mciSendString_("status MP3_"+Str(Nb)+" Speed",@a$,#MAX_PATH,0)
  ProcedureReturn Val(a$)
EndProcedure
Procedure MP3_GetLength(Nb)
  a$=Space(#MAX_PATH)
  i=mciSendString_("status MP3_"+Str(Nb)+" length",@a$,#MAX_PATH,0)
  ProcedureReturn Val(a$)
EndProcedure
Procedure MP3_GetPosition(Nb)
  a$=Space(#MAX_PATH)
  i=mciSendString_("status MP3_"+Str(Nb)+" position",@a$,#MAX_PATH,0)
  ProcedureReturn Val(a$)
EndProcedure
Procedure MP3_Seek(Nb,pos)
  i=mciSendString_("Seek MP3_"+Str(Nb)+" to "+Str(pos),0,0,0)
  ProcedureReturn i
EndProcedure
Procedure.s MP3_TimeString(Time)
  Time/1000
  sek=Time%60:Time/60
  min=Time%60:Time/60
  ProcedureReturn RSet(Str(Time),2,"0")+":"+RSet(Str(min),2,"0")+":"+RSet(Str(sek),2,"0")
EndProcedure
;Example

Enumeration 1
  #gadget_File
  #Gadget_VolumeTxt
  #Gadget_Volume
  #Gadget_SpeedTxt
  #Gadget_Speed
  #Gadget_PositionTxt
  #Gadget_Position
  #Gadget_Load
  #Gadget_Play
  #Gadget_Stop
  #Gadget_Pause
  #Gadget_Resume
EndEnumeration

Procedure SetVol(x)
  SetGadgetText(#Gadget_VolumeTxt,"Volume:"+Str(x))
  SetGadgetState(#Gadget_Volume,x)
EndProcedure
Procedure SetSpeed(x)
  SetGadgetText(#Gadget_SpeedTxt,"Speed:"+Str(x))
  SetGadgetState(#Gadget_Speed,x)
EndProcedure
Procedure SetPosition(x,max)
  SetGadgetText(#Gadget_PositionTxt,"Position:"+MP3_TimeString(x)+" : "+MP3_TimeString(max))
  If max>0
    SetGadgetState(#Gadget_Position,x*1000/max)
  Else
    SetGadgetState(#Gadget_Position,0)
  EndIf
EndProcedure

If OpenWindow(0, 100, 200, 310,310, "Simple MP3-Player", #PB_Window_SystemMenu |#PB_Window_ScreenCentered)
  ;       If CreateGadgetList(WindowID())
  top=5
  TextGadget    (#gadget_File       ,5,top,300,20,"File:"):top+25
  TextGadget    (#Gadget_VolumeTxt,  5,top,300,20,"Volume"):top+20
  TrackBarGadget(#Gadget_Volume     ,5,top,300,25,0,100):top+30
  TextGadget    (#Gadget_SpeedTxt   ,5,top,300,20,"Speed"):top+20
  TrackBarGadget(#Gadget_Speed      ,5,top,300,25,0,200):top+30
  TextGadget    (#Gadget_PositionTxt,5,top,300,20,"Position"):top+20
  TrackBarGadget(#Gadget_Position   ,5,top,300,25,0,1000):top+30
  ButtonGadget  (#Gadget_Load       ,5,top,300,20,"Load"):top+25
  ButtonGadget  (#Gadget_Play       ,5,top,300,20,"Play"):top+25
  ButtonGadget  (#Gadget_Pause      ,5,top,300,20,"Pause"):top+25
  ButtonGadget  (#Gadget_Resume     ,5,top,300,20,"Resume"):top+25
  ButtonGadget  (#Gadget_Stop       ,5,top,300,20,"Stop"):top+25
  loaded=#False
  Quit=#False
 
  Repeat
    EventID = WindowEvent()
   
    Select EventID
      Case 0
        If loaded And max>0
          x=MP3_GetPosition(1)
          If GetGadgetState(#Gadget_Position)<>x*1000/max
            SetPosition(x,max)
          EndIf
        EndIf
        Delay(100)
      Case #PB_Event_CloseWindow ; If the user has pressed on the close button
        Quit=#True
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Gadget_Load
            File$=OpenFileRequester("","","Media (Wave,MP3,OGG)|*.wav;*.ogg;*.mp3|Wave|*.wav|mp3|*.mp3|OGG|*.OGG|ALL|*.*",0)
            If File$<>""
              If loaded
                MP3_Free(1)
                loaded=#False
              EndIf
              If MP3_Load(1,File$)
                max=MP3_GetLength(1)
                SetVol(MP3_GetVolume(1)/10)
                SetSpeed(MP3_GetSpeed(1)/10)
                SetPosition(0,max)
                loaded=#True
                SetGadgetText(#gadget_File,"File:"+File$)
              Else
                SetGadgetText(#gadget_File,"File")
              EndIf
            EndIf
          Case #Gadget_Resume
            If loaded
              MP3_Resume(1)
            EndIf
          Case #Gadget_Pause
            If loaded
              MP3_Pause(1)
            EndIf
          Case #Gadget_Play
            If loaded
              MP3_Play(1)
            EndIf
          Case #Gadget_Stop
            If loaded
              MP3_Stop(1)
            EndIf
          Case #Gadget_Position
            If loaded And max>0
              x=GetGadgetState(#Gadget_Position)*max/1000
              SetPosition(x,max)
              MP3_Seek(1,x)
              MP3_Resume(1)
            EndIf
          Case #Gadget_Volume
            If loaded
              x=GetGadgetState(#Gadget_Volume)
              SetVol(x)
              MP3_SetVolume(1,x*10)
            EndIf
          Case #Gadget_Speed
            If loaded
              x=GetGadgetState(#Gadget_Speed)
              SetSpeed(x)
              MP3_SetSpeed(1,x*10)
            EndIf
        EndSelect
    EndSelect
   
  Until Quit
  If loaded
    MP3_Stop(1)
    MP3_Free(1)
  EndIf
  ;       EndIf
EndIf

End
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 »

Hallo schleicher,

ein Auslesen von VBR-Mp3 Dateien ist etwas problematisch.

Du könntest eine gute Soundbibliothek wie: fmod, bass, irrklang, ... verwenden.

Aber vielleicht hilft bei den meisten Mp3-Dateien auch ein einfaches Teilen durch 2.
Meistens gibt MCI bei VBR-Mp3-Dateien einfach nur die doppelte Größe aus.

Da bei VBR-Mp3-Dateien meistens der XING-Header verwendet wird habe ich mal etwas gebastelt:

Code: Alles auswählen

Structure Mp3HeaderBitsString
  MPEGTypeBitsString.s
  LayerBitsString.s
  BitrateBitsString.s
  FreqBitsString.s
  ChannelModeBitsString.s
EndStructure

Structure ID3v1TAG
  SongTitle.s
  Artist.s
  Album.s
  Year.s
  Comment.s
  GenreID.i
EndStructure

Structure XingHeader
  NumberOfFrames.i
  FileLength.i
  TOC.b[100]
  VBRScale.i
EndStructure

Procedure BitRead(*var.Integer, pos.i)
  *var + pos >> 3
  If *var\i & (1 << (pos & 7))
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf   
EndProcedure

Procedure BitWrite(*var.Ascii, pos, value = 1)
  *var + pos >> 3
  If value
    *var\a | (1 << (pos & 7))
    ProcedureReturn #True
  Else
    *var\a & ~(1 << (pos & 7))
    ProcedureReturn #False
  EndIf
EndProcedure

Enumeration MPEGType
  #MPEG1
  #MPEG2
  #MPEG2_5
EndEnumeration

Enumeration LayerType
  #LayerI
  #LayerII
  #LayerIII
EndEnumeration

Enumeration ProtectionType
  #ProtectedByCRC
  #NotProtected
EndEnumeration

Enumeration CopyRight
  #CopyRighted
  #NotCopyRighted
EndEnumeration

Enumeration ChannelMode
  #Stereo
  #JointStereo_Stereo
  #DualChannel_2MonoChannels
  #SingleChannel_Mono
EndEnumeration

Declare Mp3_New(MP3FilePath.s)
Declare.b GetMP3HeaderBytes(MP3FilePath.s)
Declare.b CheckForZeroBytes(ByteToCheck.b)
Declare.s GetBitsString(StartIndex.i, EndIndex.i)
Declare GetID3v1TAG(MP3FilePath.s)
Declare.b IsVBR()
Declare GetXingHeader(*XingHeader.XingHeader)
Declare.i GetMPEGType()
Declare.i GetLayer()
Declare.i GetProtection()
Declare.i GetBitrate()
Declare.i GetSamplingRateFreq()
Declare.i GetChannelMode()
Declare.i GetCopyRight()
Declare.i GetDuration()
Declare.s GetDurationString()


Global Mp3HeaderBitsStr.Mp3HeaderBitsString
Global Mp3HeaderBits
Global Dim XingHeaderBytes.b(115)
Global Mp3HeaderPosition.i, Mp3ClearSize.i

Procedure Mp3_New(MP3FilePath.s)
  If OpenFile(0, MP3FilePath)
    If Not GetMp3HeaderBytes(MP3FilePath)
      Debug "Keine gültige MP3-Datei."
    EndIf
  Else
    Debug "Die Datei existiert nicht."
  EndIf
EndProcedure

Procedure.b GetMP3HeaderBytes(MP3FilePath.s)
  Protected TempMP3HeaderBits
  Protected Mp3HeaderBytes
  Protected IsSyncByte.b, CheckByte.b = 255
  Protected.i i, j, Index, BitOffSet, StartPosition, count = 0
  Mp3HeaderBits = 24
  If ReadFile(0, MP3FilePath)
    While (Loc(0) + 4) <= Lof(0)
      If ReadByte(0) = CheckByte
        Mp3HeaderPosition = Loc(0)
        IsSyncByte = #True
      EndIf
      While IsSyncByte = #True
        ReadData(0, @Mp3HeaderBytes, 3)
        TempMP3HeaderBits = Mp3HeaderBytes
        For i = 7 To 5 Step -1
          If Not BitRead(@TempMP3HeaderBits, i)
            IsSyncByte = #False
            FileSeek(0, -3, #PB_Relative)
            Break 2
          EndIf
        Next i
        Index = 0
        BitOffSet = 0
        For j = 0 To 2
          For i = 7 To 0 Step -1
            BitWrite(@Mp3HeaderBits, Index, BitRead(@TempMP3HeaderBits, (BitOffSet + i)))
            Index + 1
          Next i
          BitOffSet + 8
        Next j
        Mp3HeaderBitsStr\MPEGTypeBitsString = GetBitsString(3, 4)
        Mp3HeaderBitsStr\LayerBitsString = GetBitsString(5, 6)
        Mp3HeaderBitsStr\BitrateBitsString = GetBitsString(8, 11)
        Mp3HeaderBitsStr\FreqBitsString = GetBitsString(12, 13)
        Mp3HeaderBitsStr\ChannelModeBitsString = GetBitsString(16, 17)
        If Mp3HeaderBitsStr\MPEGTypeBitsString = "01"
          IsSyncByte = #False
          FileSeek(0, -3, #PB_Relative)
          Break 2
        EndIf
        If Mp3HeaderBitsStr\LayerBitsString = "11" Or Mp3HeaderBitsStr\LayerBitsString = "10" Or Mp3HeaderBitsStr\LayerBitsString = "00"
          IsSyncByte = #False
          FileSeek(0, -3, #PB_Relative)
          Break 2
        EndIf
        If Mp3HeaderBitsStr\BitrateBitsString = "1111"
          IsSyncByte = #False
          FileSeek(0, -3, #PB_Relative)
          Break 2
        EndIf
        If Mp3HeaderBitsStr\FreqBitsString = "11"
          IsSyncByte = #False
          FileSeek(0, -3, #PB_Relative)
          Break 2
        Else
          Mp3ClearSize = (Lof(0) - Mp3HeaderPosition - 128)
          ProcedureReturn #True
        EndIf
      Wend
    Wend
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.b CheckForZeroBytes(ByteToCheck.b)
  If ByteToCheck = 0
    ProcedureReturn 0
  Else
    ProcedureReturn ByteToCheck
  EndIf
EndProcedure

Procedure.s GetBitsString(StartIndex.i, EndIndex.i)
  Protected BitsString.s
  For i = StartIndex To EndIndex
    If BitRead(@Mp3HeaderBits, i) = #True
      BitsString + "1"
    ElseIf BitRead(@Mp3HeaderBits, i) = #False
      BitsString + "0"
    EndIf
  Next i
  ProcedureReturn BitsString
EndProcedure

Procedure GetID3v1TAG(MP3FilePath.s)
  ;...
EndProcedure

Procedure.b IsVBR()
  Protected XingBytes
  Protected XingString.s
  Protected *ReadBuffer
  If Not GetChannelMode() = #SingleChannel_Mono
    FileSeek(0, (Mp3HeaderPosition + 35))
    ReadData(0, @XingBytes, 4)
  Else
    FileSeek(0, (Mp3HeaderPosition + 20))
    ReadData(0, @XingBytes, 4)
  EndIf
  XingString = PeekS(@XingBytes,-1,#PB_Ascii)
  If XingString = "Xing"
    *ReadBuffer = AllocateMemory(255)
    ReadData(0, *ReadBuffer, 115)
    For i = 0 To 115
      XingHeaderBytes(i) = PeekB(*ReadBuffer+i)
    Next i
    FreeMemory(*ReadBuffer)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure GetXingHeader(*XingHeader.XingHeader)
  Protected CXingHeader.XingHeader
  Protected FrameCountBytes
  Protected FileLengthBytes
  Protected VBRScaleBytes
  Protected Dim TOC.b(99)
  Protected.i Index, i
  If IsVBR() = #True
    Debug "IsVBR"
    For i = 3 To 0 Step -1
      PokeB(@VBRScaleBytes+Index, XingHeaderBytes(112 + i))
      PokeB(@FrameCountBytes+Index, XingHeaderBytes(4 + i))
      PokeB(@FileLengthBytes+Index, XingHeaderBytes(8 + i))
      Index + 1
    Next i
    For i = 0 To 99
      TOC(i) = XingHeaderBytes(12 + i)
    Next i
  Else
    Debug "Mp3 is not VBR"
  EndIf
  With CXingHeader
    \FileLength = PeekI(@FileLengthBytes)
    \NumberOfFrames = PeekI(@FrameCountBytes)
    \VBRScale = PeekI(@VBRScaleBytes)
    \TOC = TOC()
  EndWith
  *XingHeader = @CXingHeader
  ProcedureReturn *XingHeader
EndProcedure

Procedure.i GetMPEGType()
  Select Mp3HeaderBitsStr\MPEGTypeBitsString
    Case "11"
      ProcedureReturn #MPEG1
    Case "10"
      ProcedureReturn #MPEG2
    Case "00"
      ProcedureReturn #MPEG2_5
  EndSelect
EndProcedure

Procedure.i GetLayer()
  Select Mp3HeaderBitsStr\LayerBitsString
    Case "01"
      ProcedureReturn #LayerIII
    Case "10"
      ProcedureReturn #LayerII
    Case "11"
      ProcedureReturn #LayerI
  EndSelect
EndProcedure

Procedure.i GetProtection()
  If Not BitRead(@Mp3HeaderBits, 7)
    ProcedureReturn #ProtectedByCRC
  Else
    ProcedureReturn #NotProtected
  EndIf
EndProcedure

Procedure.i GetBitrate()
  Protected Dim BitrateArray.i(13)
  Protected Dim TmpBitrateArray.i(13)
  Protected CXingHeader.XingHeader, *RCXingHeader
  Protected LastByte.i, AverageFrameLength.i, AverageBitrate.i
  If GetMPEGType() = #MPEG1
    TmpBitrateArray(0) = 32 : TmpBitrateArray(1) = 40 : TmpBitrateArray(2) = 48 : TmpBitrateArray(3) = 56
    TmpBitrateArray(4) = 64 : TmpBitrateArray(5) = 80 : TmpBitrateArray(6) = 96 : TmpBitrateArray(7) = 112
    TmpBitrateArray(8) = 128 : TmpBitrateArray(9) = 160 : TmpBitrateArray(10) = 192 : TmpBitrateArray(11) = 224
    TmpBitrateArray(12) = 256 : TmpBitrateArray(13) = 320
    CopyArray(TmpBitrateArray(), BitrateArray())
  Else
    TmpBitrateArray(0) = 8 : TmpBitrateArray(1) = 16 : TmpBitrateArray(2) = 24 : TmpBitrateArray(3) = 32
    TmpBitrateArray(4) = 40 : TmpBitrateArray(5) = 48 : TmpBitrateArray(6) = 56 : TmpBitrateArray(7) = 64
    TmpBitrateArray(8) = 80 : TmpBitrateArray(9) = 96 : TmpBitrateArray(10) = 112 : TmpBitrateArray(11) = 128
    TmpBitrateArray(12) = 144 : TmpBitrateArray(13) = 160
    CopyArray(TmpBitrateArray(), BitrateArray())
  EndIf
  If Not IsVBR()
    Select Mp3HeaderBitsStr\BitrateBitsString
      Case "0001"
        ProcedureReturn BitrateArray(0)
      Case "0010"
        ProcedureReturn BitrateArray(1)
      Case "0011"
        ProcedureReturn BitrateArray(2)
      Case "0100"
        ProcedureReturn BitrateArray(3)
      Case "0101"
        ProcedureReturn BitrateArray(4)
      Case "0110"
        ProcedureReturn BitrateArray(5)
      Case "0111"
        ProcedureReturn BitrateArray(6)
      Case "1000"
        ProcedureReturn BitrateArray(7)
      Case "1001"
        ProcedureReturn BitrateArray(8)
      Case "1010"
        ProcedureReturn BitrateArray(9)
      Case "1011"
        ProcedureReturn BitrateArray(10)
      Case "1100"
        ProcedureReturn BitrateArray(11)
      Case "1101"
        ProcedureReturn BitrateArray(12)
      Case "1110"
        ProcedureReturn BitrateArray(13)
    EndSelect
  Else
    *RCXingHeader = GetXingHeader(@CXingHeader)
    CXingHeader\FileLength = PeekI(*RCXingHeader+OffsetOf(XingHeader\FileLength))
    CXingHeader\NumberOfFrames = PeekI(*RCXingHeader+OffsetOf(XingHeader\NumberOfFrames))
    For i = 0 To 99
      CXingHeader\TOC[i] = PeekB(*RCXingHeader+(OffsetOf(XingHeader\TOC)+i))
    Next i
    CXingHeader\VBRScale = PeekI(*RCXingHeader+OffsetOf(XingHeader\VBRScale))
    LastByte = (CXingHeader\TOC[99] / 256) * CXingHeader\FileLength
    AverageFrameLength = CXingHeader\FileLength / CXingHeader\NumberOfFrames
    AverageBitrate = (AverageFrameLength * GetSamplingRateFreq() / 144) / 1000
    fsize.d = (CXingHeader\FileLength / 1024) / 1024
    Debug "Dateigroeße: "+ StrD(fsize)
    ProcedureReturn AverageBitrate
  EndIf
EndProcedure

Procedure.i GetSamplingRateFreq()
  Select Mp3HeaderBitsStr\FreqBitsString
    Case "00"
      ProcedureReturn 44100
    Case "01"
      ProcedureReturn 48000
    Case "10"
      ProcedureReturn 32000
  EndSelect
EndProcedure

Procedure.i GetChannelMode()
  Select Mp3HeaderBitsStr\ChannelModeBitsString
    Case "00"
      ProcedureReturn #Stereo
    Case "01"
      ProcedureReturn #JointStereo_Stereo
    Case "10"
      ProcedureReturn #DualChannel_2MonoChannels
    Case "11"
      ProcedureReturn #SingleChannel_Mono
  EndSelect
EndProcedure

Procedure.i GetCopyRight()
  If BitRead(@Mp3HeaderBits, 20) = #True
    ProcedureReturn #CopyRighted
  Else
    ProcedureReturn #NotCopyRighted
  EndIf
EndProcedure

Procedure.i GetDuration()
  Protected Duration.i
  Debug "Bitrate: "+ Str(GetBitrate())
  Duration = (Mp3ClearSize * 8) / GetBitrate()
  ProcedureReturn Duration
EndProcedure

Procedure.s GetDurationString()
  Protected DurationString.s
  Protected CurrentDuration.i = GetDuration()
  Protected DurationMin.i, DurationSec.i
  DurationMin = (CurrentDuration / 1000) / 60
  DurationSec = Int(Mod((CurrentDuration / 1000), 60))
  DurationString = Str(DurationMin) + ":" + Str(DurationSec)
  ProcedureReturn DurationString
EndProcedure

Global MP3.s

;-Main
MP3 = OpenFileRequester("", "Select MP3 File", "MP3 Files (*.mp3)|*.mp3", 0)
Mp3_New(MP3)
Debug "Time: "+ GetDurationString()
CloseFile(0)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
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 »

Huhu!!!

Ich habe dann mal noch etwas zusammen-gefriemelt.

Mit Hilfe der Tag-Lib kann man sehr gut Medieninfos auslesen.

Die aktuelle Lib-Version habe ich mal mit VisualStudio 2017 und CMake kompiliert.

Hier alles kompakt zusammen:

https://workupload.com/file/dCB9jRHK (SoundInfo - UPDATE)

Code: Alles auswählen

EnableExplicit

DeclareModule SoundInfo
  ImportC "tag_c.lib"
    taglib_file_new(filename.p-ascii) As "taglib_file_new"  ;Ascii-Pflicht !
    taglib_file_new_type(filename.p-ascii, type.i) As "taglib_file_new_type"
    taglib_file_save(file.i) As "taglib_file_save"
    taglib_file_tag(file.i) As "taglib_file_tag"
    taglib_file_free(file.i) As "taglib_file_free"  
    taglib_file_is_valid(file.i) As "taglib_file_is_valid"
    taglib_id3v2_set_default_text_encoding(encoding.i) As "taglib_id3v2_set_default_text_encoding" 
    taglib_set_string_management_enabled(management.b) As "taglib_set_string_management_enabled"
    taglib_set_strings_unicode(flag.b) As "taglib_set_strings_unicode"
    taglib_tag_free_strings() As "taglib_tag_free_strings"
    taglib_tag_title(tag.i) As "taglib_tag_title"
    taglib_tag_artist(tag.i) As "taglib_tag_artist"
    taglib_tag_album(tag.i) As "taglib_tag_album"
    taglib_tag_comment(tag.i) As "taglib_tag_comment"
    taglib_tag_genre(tag.i) As "taglib_tag_genre"
    taglib_tag_year(tag.i) As "taglib_tag_year"
    taglib_tag_track(tag.i) As "taglib_tag_track"
    taglib_audioproperties_bitrate(ap.i) As "taglib_audioproperties_bitrate"  
    taglib_audioproperties_channels(ap.i) As "taglib_audioproperties_channels"
    taglib_audioproperties_length(ap.i) As "taglib_audioproperties_length"
    taglib_audioproperties_samplerate(ap.i) As "taglib_audioproperties_samplerate"
    taglib_file_audioproperties(file.i) As "taglib_file_audioproperties"
    taglib_tag_set_title(tag.i, *title) As "taglib_tag_set_title"
    taglib_tag_set_artist(tag.i, *artist) As "taglib_tag_set_artist"
    taglib_tag_set_album(tag.i, *album) As "taglib_tag_set_album"
    taglib_tag_set_comment(tag.i, *comment) As "taglib_tag_set_comment"
    taglib_tag_set_genre(tag.i, *genre) As "taglib_tag_set_genre"
    taglib_tag_set_year(tag.i, year.i) As "taglib_tag_set_year"
    taglib_tag_set_track(tag.i, track.i) As "taglib_tag_set_track"
  EndImport
  
  Enumeration 
    #TagLib_File_MPEG
    #TagLib_File_OggVorbis
    #TagLib_File_FLAC
    #TagLib_File_MPC
    #TagLib_File_OggFlac
    #TagLib_File_WavPack
    #TagLib_File_Speex
    #TagLib_File_TrueAudio
    #TagLib_File_Type
  EndEnumeration
  
  Enumeration 
    #TagLib_ID3v2_Latin1
    #TagLib_ID3v2_UTF16
    #TagLib_ID3v2_UTF16BE
    #TagLib_ID3v2_UTF8
    #TagLib_ID3v2_Encoding
  EndEnumeration
  
  Structure MediaInfo
    title.s
    artist.s
    album.s
    year.s
    comment.s
    track.s
    genre.s
    bitrate.s
    samplerate.s
    channels.s
    length.s
  EndStructure
  
  Global Media.MediaInfo
  Global IsMedia.b = #False
  Global tagFile.i
  Global *FileInfo, *FileValue
  
  Declare.b InitMedia(File.s)
  Declare.s GetTitle()
  Declare SetTitle(title.s)
  Declare.s GetArtist()
  Declare SetArtist(artist.s)
  Declare.s GetAlbum()
  Declare SetAlbum(album.s)
  Declare.s GetYear()
  Declare SetYear(year.s)
  Declare.s GetComment()
  Declare SetComment(comment.s)
  Declare.s GetTrack()
  Declare SetTrack(track.s)
  Declare.s GetGenre()
  Declare SetGenre(genre.s)
  Declare.s GetBitrate()
  Declare.s GetSamplerate()
  Declare.s GetChannels()
  Declare.s GetLength()
  Declare SetNewTag()
  Declare CloseMedia()
  
EndDeclareModule

Module SoundInfo
  taglib_set_strings_unicode(#True)
  
  Procedure.b InitMedia(MediaFile.s)
    If MediaFile <> "" And (FileSize(MediaFile) <> -1 Or FileSize(MediaFile) <> 0)
      tagFile = taglib_file_new(MediaFile)
      If tagFile
        *FileInfo = taglib_file_tag(tagFile)
        *FileValue = taglib_file_audioproperties(tagFile)
        If *FileInfo
          Media\title   = Trim(PeekS(taglib_tag_title(*FileInfo) ,-1, #PB_UTF8))
          Media\artist  = Trim(PeekS(taglib_tag_artist(*FileInfo) ,-1, #PB_UTF8))
          Media\album   = Trim(PeekS(taglib_tag_album(*FileInfo) ,-1, #PB_UTF8))
          Media\year    = Str(taglib_tag_year(*FileInfo))
          Media\comment = Trim(PeekS(taglib_tag_comment(*FileInfo), -1, #PB_UTF8))
          Media\track   = Str(taglib_tag_track(*FileInfo))
          Media\genre   = Trim(PeekS(taglib_tag_genre(*FileInfo) ,-1, #PB_UTF8))
        EndIf
        If *FileValue
          Media\bitrate    = Str(taglib_audioproperties_bitrate(*FileValue))
          Media\samplerate = Str(taglib_audioproperties_samplerate(*FileValue))
          Media\channels   = Str(taglib_audioproperties_channels(*FileValue))
          Media\length     = Str(taglib_audioproperties_length(*FileValue))
        EndIf
        IsMedia = #True
        ProcedureReturn #True
      Else
        IsMedia = #False
        ProcedureReturn #False
      EndIf
    Else
      IsMedia = #False
      ProcedureReturn #False
    EndIf
  EndProcedure
  
  Procedure.s GetTitle()
    If IsMedia = #True
      ProcedureReturn Media\title
    EndIf
  EndProcedure
  
  Procedure SetTitle(title.s)
    If IsMedia = #True
      Media\title = title
      taglib_tag_set_title(*FileInfo, UTF8(Media\title))
    EndIf
  EndProcedure
  
  Procedure.s GetArtist()
    If IsMedia = #True
      ProcedureReturn Media\artist
    EndIf
  EndProcedure
  
  Procedure SetArtist(artist.s)
    If IsMedia = #True
      Media\artist = artist
      taglib_tag_set_artist(*FileInfo,  UTF8(Media\artist))
    EndIf
  EndProcedure
  
  Procedure.s GetAlbum()
    If IsMedia = #True
      ProcedureReturn Media\album
    EndIf
  EndProcedure
  
  Procedure SetAlbum(album.s)
    If IsMedia = #True
      Media\album = album
      taglib_tag_set_album(*FileInfo, UTF8(Media\album))
    EndIf
  EndProcedure
  
  Procedure.s GetYear()
    If IsMedia = #True
      ProcedureReturn Media\year
    EndIf
  EndProcedure
  
  Procedure SetYear(year.s)
    If IsMedia = #True
      Media\year = year
      taglib_tag_set_year(*FileInfo, Val(Media\year))
    EndIf
  EndProcedure
  
  Procedure.s GetComment()
    If IsMedia = #True
      ProcedureReturn Media\comment
    EndIf
  EndProcedure
  
  Procedure SetComment(comment.s)
    If IsMedia = #True
      Media\comment = comment
      taglib_tag_set_comment(*FileInfo, UTF8(Media\comment))
    EndIf
  EndProcedure
  
  Procedure.s GetTrack()
    If IsMedia = #True
      ProcedureReturn Media\track
    EndIf
  EndProcedure
  
  Procedure SetTrack(track.s)
    If IsMedia = #True
      Media\track = track
      taglib_tag_set_track(*FileInfo, Val(Media\track))
    EndIf
  EndProcedure
  
  Procedure.s GetGenre()
    If IsMedia = #True
      ProcedureReturn Media\genre
    EndIf
  EndProcedure
  
  Procedure SetGenre(genre.s)
    If IsMedia = #True
      Media\genre = genre
      taglib_tag_set_genre(*FileInfo, UTF8(Media\genre))
    EndIf
  EndProcedure
  
  Procedure.s GetBitrate()
    If IsMedia = #True
      ProcedureReturn Media\bitrate
    EndIf
  EndProcedure
  
  Procedure.s GetSamplerate()
    If IsMedia = #True
      ProcedureReturn Media\samplerate
    EndIf
  EndProcedure
  
  Procedure.s GetChannels()
    If IsMedia = #True
      ProcedureReturn Media\channels
    EndIf
  EndProcedure
  
  Procedure.s GetLength()
    Protected Time.i, RTime.s
    Protected H.i, M.i, S.i
    If IsMedia = #True
      Time = Val(Media\length) * 1000
      If Time > 0
        Time / 1000
        S = Time % 60
        Time / 60
        M = Time % 60
        Time / 60
        H = Time % 60
      EndIf
      RTime = RSet(Str(H), 2, "0") + ":" + RSet(Str(M), 2, "0") + ":" + RSet(Str(S), 2, "0")  
      ProcedureReturn RTime
    Else
      ProcedureReturn "00:00:00"
    EndIf
  EndProcedure
  
  Procedure SetNewTag()
    taglib_file_save(tagFile)
  EndProcedure
  
  Procedure CloseMedia()
    taglib_tag_free_strings()
    taglib_file_free(tagFile)
  EndProcedure
  
EndModule

;-Main
CompilerIf #PB_Compiler_IsMainFile
  Global MediaFile.s, Eingabe.s, ende.b = #False
  OpenConsole()
  MediaFile = OpenFileRequester("", "Wähle eine Musikdatei aus.", "Musik Files|*.mp3;*.ogg;*.flac;*.wav", 0)
  UseModule SoundInfo
  If InitMedia(MediaFile) = #True ;InitMedia ist WICHTIG !
    Anfang:
    PrintN("Titel: "+GetTitle())
    PrintN("Artist: "+GetArtist())
    PrintN("Album: "+GetAlbum())
    PrintN("Year: "+GetYear())
    PrintN("Comment: "+GetComment())
    PrintN("Track: "+GetTrack())
    PrintN("Genre: "+GetGenre())
    PrintN("Bitrate: "+GetBitrate())
    PrintN("Channels: "+GetChannels())
    PrintN("Length: "+GetLength())
    Input()
    ;Beispiel-Einträge
    SetTitle("Vorhanden")
    SetArtist("Auch vorhanden")
    SetAlbum("Unknow")
    SetYear("2018") ;Bitte eine Zahl als String übergeben, Danke!
    SetComment("Alles nur dummes Gelapp.")
    SetTrack("0") ;Bitte auch hier eine Zahl als String übergeben, Danke!
    SetGenre("Muss erst noch erfunden werden.")
    
    If ende = #False
      ende = #True
      Goto Anfang
    Else
      PrintN("Möchten Sie die neuen Einträge dauerhaft übernehmen ? (ja oder nein)")
      Eingabe = Input()
      If UCase(Eingabe) = "JA"
        SetNewTag()
      EndIf
    EndIf
    CloseMedia() ;Bitte nicht vergessen !
  EndIf 
  UnuseModule SoundInfo
CompilerEndIf

DisableExplicit
Zuletzt geändert von ccode_new am 04.09.2018 19:02, insgesamt 1-mal geändert.
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 »

Wow. Vielen Dank das du dir soviel Arbeit gemacht hast. Mit der taglib habe ich mich auch schon befasst. Ich habe auf deren Internetseite gelesen, das man damit auch Id3tags schreiben kann. Finde ich irgendwo dafür die entsprechenden Befehle ?
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 »

schleicher hat geschrieben:Ich habe auf deren Internetseite gelesen, das man damit auch Id3tags schreiben kann. Finde ich irgendwo dafür die entsprechenden Befehle ?
Sodele!

Jetzt lohnt ein Blick auf den vorherigen Beitrag.

Viel Spaß beim Testen!!!
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(gelöst mit taglib)

Beitrag von schleicher »

Oh sorry. Habe ich doch glatt übersehen, das die emtsprechenden Befehle fürs ID3tag schreiben auch schon in deinem Code drinnen sind.

Ist es mit der Lib auch möglich Coverimages auszulesen oder vielleicht sogar im Songs zu speichern ?
Das wäre super. Dann hätte man alle Funktionen in einem Modul.
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 »

Hallo schleicher!
Du hast ja Wünsche. 8)

Von Coverbilder war bisher nicht die Rede und an diese habe ich auch noch nicht gedacht.

Leider gibt es jetzt ein kleines Problem.
Die Tag-Lib ist dazu in der Lage, aber die tag_c.lib nicht !!!
Eine Einbindung in PureBasic dürfte schwierig werden.

Ich werde versuchen eine andere Lösung zu finden.

Bild
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.
Du hast recht eigentlich ging es nur um die Länge von Songs zu ermitteln. Umsomehr freue ich mich, das es jetzt auch durch deine Hilfe die Möglichkeit gibt auch Id3tags zu schreiben. Cover aus mp3 zu extrahieren habe ich ja auch schon ,aber auch eigenes Cover in Songs zu speichern zu können das wäre noch das I-Tüppfelchen.

Danke für die Mühe.
Purebasic 5.51
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
Habe heute Abend die Zeit gefunden deinen Code mit taglib zu testen. Leider kam ich nicht weit. Den Purebasic sagt schon bei der 1.Zeile beim EnableExplicit - Error Speicherfehler :?: :?:

Getestet habe ich mit windows 10 home und purebasic 5.61
Getestet auch auf windows Vista home(Visual C++ Redistributable nachinstalliert) mit und purebasic 5.61
Beides gleicher Speicherfehler. Kann die tag_c.lib nicht geladen werden?

Was läuft da falsch ?
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 »

Sei gegrüßt schleicher,

ich habe mal noch etwas rumprobiert und gebastelt.

Vielleicht läuft die tag_c.lib ja so: (über tag_c.dll)

Code: Alles auswählen

EnableExplicit

DeclareModule SoundInfo
  
  Prototype.i taglib_file_new(filename.p-ascii) ;Ascii-Pflicht !
  Prototype.i taglib_file_new_type(filename.p-ascii, type.i)
  Prototype.i taglib_file_save(file.i)
  Prototype.i taglib_file_tag(file.i)
  Prototype.i taglib_file_free(file.i) 
  Prototype.i taglib_file_is_valid(file.i)
  Prototype taglib_id3v2_set_default_text_encoding(encoding.i)
  Prototype taglib_set_string_management_enabled(management.b)
  Prototype.i taglib_set_strings_unicode(flag.b)
  Prototype taglib_tag_free_strings()
  Prototype.i taglib_tag_title(tag.i)
  Prototype.i taglib_tag_artist(tag.i)
  Prototype.i taglib_tag_album(tag.i)
  Prototype.i taglib_tag_comment(tag.i)
  Prototype.i taglib_tag_genre(tag.i)
  Prototype.i taglib_tag_year(tag.i)
  Prototype.i taglib_tag_track(tag.i)
  Prototype.i taglib_audioproperties_bitrate(ap.i)
  Prototype.i taglib_audioproperties_channels(ap.i)
  Prototype.i taglib_audioproperties_length(ap.i)
  Prototype.i taglib_audioproperties_samplerate(ap.i)
  Prototype.i taglib_file_audioproperties(file.i)
  Prototype taglib_tag_set_title(tag.i, *title)
  Prototype taglib_tag_set_artist(tag.i, *artist)
  Prototype taglib_tag_set_album(tag.i, *album)
  Prototype taglib_tag_set_comment(tag.i, *comment)
  Prototype taglib_tag_set_genre(tag.i, *genre)
  Prototype taglib_tag_set_year(tag.i, year.i)
  Prototype taglib_tag_set_track(tag.i, track.i)
  
  Enumeration 
    #TagLib_File_MPEG
    #TagLib_File_OggVorbis
    #TagLib_File_FLAC
    #TagLib_File_MPC
    #TagLib_File_OggFlac
    #TagLib_File_WavPack
    #TagLib_File_Speex
    #TagLib_File_TrueAudio
    #TagLib_File_Type
  EndEnumeration
  
  Enumeration 
    #TagLib_ID3v2_Latin1
    #TagLib_ID3v2_UTF16
    #TagLib_ID3v2_UTF16BE
    #TagLib_ID3v2_UTF8
    #TagLib_ID3v2_Encoding
  EndEnumeration
  
  Structure MediaInfo
    title.s
    artist.s
    album.s
    year.s
    comment.s
    track.s
    genre.s
    bitrate.s
    samplerate.s
    channels.s
    length.s
  EndStructure
  
  Global Media.MediaInfo
  Global IsMedia.b = #False
  Global tagFile.i
  Global *FileInfo, *FileValue
  Global TagLib
  
  TagLib = OpenLibrary(#PB_Any, "tag_c.dll")
  If TagLib
    Global taglib_file_new.taglib_file_new = GetFunction(TagLib, "taglib_file_new")   
    Global taglib_file_new_type.taglib_file_new_type = GetFunction(TagLib, "taglib_file_new_type")
    Global taglib_file_save.taglib_file_save = GetFunction(TagLib, "taglib_file_save")
    Global taglib_file_tag.taglib_file_tag = GetFunction(TagLib, "taglib_file_tag")
    Global taglib_file_free.taglib_file_free = GetFunction(TagLib, "taglib_file_free")
    Global taglib_file_is_valid.taglib_file_is_valid = GetFunction(TagLib, "taglib_file_is_valid")
    Global taglib_id3v2_set_default_text_encoding.taglib_id3v2_set_default_text_encoding = GetFunction(TagLib, "taglib_id3v2_set_default_text_encoding")
    Global taglib_set_string_management_enabled.taglib_set_string_management_enabled = GetFunction(TagLib, "taglib_set_string_management_enabled")
    Global taglib_set_strings_unicode.taglib_set_strings_unicode = GetFunction(TagLib, "taglib_set_strings_unicode")
    Global taglib_tag_free_strings.taglib_tag_free_strings = GetFunction(TagLib, "taglib_tag_free_strings")
    Global taglib_tag_title.taglib_tag_title = GetFunction(TagLib, "taglib_tag_title")
    Global taglib_tag_artist.taglib_tag_artist = GetFunction(TagLib, "taglib_tag_artist")
    Global taglib_tag_album.taglib_tag_album = GetFunction(TagLib, "taglib_tag_album")
    Global taglib_tag_comment.taglib_tag_comment = GetFunction(TagLib, "taglib_tag_comment")
    Global taglib_tag_genre.taglib_tag_genre = GetFunction(TagLib, "taglib_tag_genre")
    Global taglib_tag_year.taglib_tag_year = GetFunction(TagLib, "taglib_tag_year")
    Global taglib_tag_track.taglib_tag_track = GetFunction(TagLib, "taglib_tag_track")
    Global taglib_audioproperties_bitrate.taglib_audioproperties_bitrate = GetFunction(TagLib, "taglib_audioproperties_bitrate")
    Global taglib_audioproperties_channels.taglib_audioproperties_channels = GetFunction(TagLib, "taglib_audioproperties_channels")
    Global taglib_audioproperties_length.taglib_audioproperties_length = GetFunction(TagLib, "taglib_audioproperties_length")
    Global taglib_audioproperties_samplerate.taglib_audioproperties_samplerate = GetFunction(TagLib, "taglib_audioproperties_samplerate")
    Global taglib_file_audioproperties.taglib_file_audioproperties = GetFunction(TagLib, "taglib_file_audioproperties")
    Global taglib_tag_set_title.taglib_tag_set_title = GetFunction(TagLib, "taglib_tag_set_title")
    Global taglib_tag_set_artist.taglib_tag_set_artist = GetFunction(TagLib, "taglib_tag_set_artist")
    Global taglib_tag_set_album.taglib_tag_set_album = GetFunction(TagLib, "taglib_tag_set_album")
    Global taglib_tag_set_comment.taglib_tag_set_comment = GetFunction(TagLib, "taglib_tag_set_comment")
    Global taglib_tag_set_genre.taglib_tag_set_genre = GetFunction(TagLib, "taglib_tag_set_genre")
    Global taglib_tag_set_year.taglib_tag_set_year = GetFunction(TagLib, "taglib_tag_set_year")
    Global taglib_tag_set_track.taglib_tag_set_track = GetFunction(TagLib, "taglib_tag_set_track")
  EndIf
  
  Declare.b InitMedia(File.s)
  Declare.s GetTitle()
  Declare SetTitle(title.s)
  Declare.s GetArtist()
  Declare SetArtist(artist.s)
  Declare.s GetAlbum()
  Declare SetAlbum(album.s)
  Declare.s GetYear()
  Declare SetYear(year.s)
  Declare.s GetComment()
  Declare SetComment(comment.s)
  Declare.s GetTrack()
  Declare SetTrack(track.s)
  Declare.s GetGenre()
  Declare SetGenre(genre.s)
  Declare.s GetBitrate()
  Declare.s GetSamplerate()
  Declare.s GetChannels()
  Declare.s GetLength()
  Declare SetNewTag()
  Declare CloseMedia()
  
EndDeclareModule

Module SoundInfo
  taglib_set_strings_unicode(#True)
  
  Procedure.b InitMedia(MediaFile.s)
    If MediaFile <> "" And (FileSize(MediaFile) <> -1 Or FileSize(MediaFile) <> 0)
      tagFile = taglib_file_new(MediaFile)
      If tagFile
        *FileInfo = taglib_file_tag(tagFile)
        *FileValue = taglib_file_audioproperties(tagFile)
        If *FileInfo
          Media\title   = Trim(PeekS(taglib_tag_title(*FileInfo) ,-1, #PB_UTF8))
          Media\artist  = Trim(PeekS(taglib_tag_artist(*FileInfo) ,-1, #PB_UTF8))
          Media\album   = Trim(PeekS(taglib_tag_album(*FileInfo) ,-1, #PB_UTF8))
          Media\year    = Str(taglib_tag_year(*FileInfo))
          Media\comment = Trim(PeekS(taglib_tag_comment(*FileInfo), -1, #PB_UTF8))
          Media\track   = Str(taglib_tag_track(*FileInfo))
          Media\genre   = Trim(PeekS(taglib_tag_genre(*FileInfo) ,-1, #PB_UTF8))
        EndIf
        If *FileValue
          Media\bitrate    = Str(taglib_audioproperties_bitrate(*FileValue))
          Media\samplerate = Str(taglib_audioproperties_samplerate(*FileValue))
          Media\channels   = Str(taglib_audioproperties_channels(*FileValue))
          Media\length     = Str(taglib_audioproperties_length(*FileValue))
        EndIf
        IsMedia = #True
        ProcedureReturn #True
      Else
        IsMedia = #False
        ProcedureReturn #False
      EndIf
    Else
      IsMedia = #False
      ProcedureReturn #False
    EndIf
  EndProcedure
  
  Procedure.s GetTitle()
    If IsMedia = #True
      ProcedureReturn Media\title
    EndIf
  EndProcedure
  
  Procedure SetTitle(title.s)
    If IsMedia = #True
      Media\title = title
      taglib_tag_set_title(*FileInfo, UTF8(Media\title))
    EndIf
  EndProcedure
  
  Procedure.s GetArtist()
    If IsMedia = #True
      ProcedureReturn Media\artist
    EndIf
  EndProcedure
  
  Procedure SetArtist(artist.s)
    If IsMedia = #True
      Media\artist = artist
      taglib_tag_set_artist(*FileInfo,  UTF8(Media\artist))
    EndIf
  EndProcedure
  
  Procedure.s GetAlbum()
    If IsMedia = #True
      ProcedureReturn Media\album
    EndIf
  EndProcedure
  
  Procedure SetAlbum(album.s)
    If IsMedia = #True
      Media\album = album
      taglib_tag_set_album(*FileInfo, UTF8(Media\album))
    EndIf
  EndProcedure
  
  Procedure.s GetYear()
    If IsMedia = #True
      ProcedureReturn Media\year
    EndIf
  EndProcedure
  
  Procedure SetYear(year.s)
    If IsMedia = #True
      Media\year = year
      taglib_tag_set_year(*FileInfo, Val(Media\year))
    EndIf
  EndProcedure
  
  Procedure.s GetComment()
    If IsMedia = #True
      ProcedureReturn Media\comment
    EndIf
  EndProcedure
  
  Procedure SetComment(comment.s)
    If IsMedia = #True
      Media\comment = comment
      taglib_tag_set_comment(*FileInfo, UTF8(Media\comment))
    EndIf
  EndProcedure
  
  Procedure.s GetTrack()
    If IsMedia = #True
      ProcedureReturn Media\track
    EndIf
  EndProcedure
  
  Procedure SetTrack(track.s)
    If IsMedia = #True
      Media\track = track
      taglib_tag_set_track(*FileInfo, Val(Media\track))
    EndIf
  EndProcedure
  
  Procedure.s GetGenre()
    If IsMedia = #True
      ProcedureReturn Media\genre
    EndIf
  EndProcedure
  
  Procedure SetGenre(genre.s)
    If IsMedia = #True
      Media\genre = genre
      taglib_tag_set_genre(*FileInfo, UTF8(Media\genre))
    EndIf
  EndProcedure
  
  Procedure.s GetBitrate()
    If IsMedia = #True
      ProcedureReturn Media\bitrate
    EndIf
  EndProcedure
  
  Procedure.s GetSamplerate()
    If IsMedia = #True
      ProcedureReturn Media\samplerate
    EndIf
  EndProcedure
  
  Procedure.s GetChannels()
    If IsMedia = #True
      ProcedureReturn Media\channels
    EndIf
  EndProcedure
  
  Procedure.s GetLength()
    Protected Time.i, RTime.s
    Protected H.i, M.i, S.i
    If IsMedia = #True
      Time = Val(Media\length) * 1000
      If Time > 0
        Time / 1000
        S = Time % 60
        Time / 60
        M = Time % 60
        Time / 60
        H = Time % 60
      EndIf
      RTime = RSet(Str(H), 2, "0") + ":" + RSet(Str(M), 2, "0") + ":" + RSet(Str(S), 2, "0")  
      ProcedureReturn RTime
    Else
      ProcedureReturn "00:00:00"
    EndIf
  EndProcedure
  
  Procedure SetNewTag()
    taglib_file_save(tagFile)
  EndProcedure
  
  Procedure CloseMedia()
    taglib_tag_free_strings()
    taglib_file_free(tagFile)
    CloseLibrary(TagLib)
  EndProcedure
  
EndModule

;-Main
CompilerIf #PB_Compiler_IsMainFile
  Global MediaFile.s, Eingabe.s, ende.b = #False
  OpenConsole()
  MediaFile = OpenFileRequester("", "Wähle eine Musikdatei aus.", "Musik Files|*.mp3;*.ogg;*.flac;*.wav", 0)
  UseModule SoundInfo
  If InitMedia(MediaFile) = #True ;InitMedia ist WICHTIG !
    Anfang:
    PrintN("Titel: "+GetTitle())
    PrintN("Artist: "+GetArtist())
    PrintN("Album: "+GetAlbum())
    PrintN("Year: "+GetYear())
    PrintN("Comment: "+GetComment())
    PrintN("Track: "+GetTrack())
    PrintN("Genre: "+GetGenre())
    PrintN("Bitrate: "+GetBitrate())
    PrintN("Channels: "+GetChannels())
    PrintN("Length: "+GetLength())
    Input()
    ;Beispiel-Einträge
    SetTitle("Vorhanden")
    SetArtist("Auch vorhanden")
    SetAlbum("Unknow")
    SetYear("2018") ;Bitte eine Zahl als String übergeben, Danke!
    SetComment("Alles nur dummes Gelapp.")
    SetTrack("0") ;Bitte auch hier eine Zahl als String übergeben, Danke!
    SetGenre("Muss erst noch erfunden werden.")
    
    If ende = #False
      ende = #True
      Goto Anfang
    Else
      PrintN("Möchten Sie die neuen Einträge dauerhaft übernehmen ? (ja oder nein)")
      Eingabe = Input()
      If UCase(Eingabe) = "JA"
        SetNewTag()
      EndIf
    EndIf
    CloseMedia() ;Bitte nicht vergessen !
  EndIf 
  UnuseModule SoundInfo
CompilerEndIf

DisableExplicit
Wenn dem nicht so ist: (es geht weiter :mrgreen: )
....
Zuletzt geändert von ccode_new am 07.09.2018 16:01, insgesamt 1-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten