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 »

Hallo ccode_new.
Also in Zeile 142 steht:

Media\title = Trim(PeekS(taglib_tag_title(*FileInfo) ,-1, #PB_UTF8))

Mir ist unklar das #PB_UTF8 ein ungültiger Parameter ist.
Kann ich mir auch nicht erklären,denn das ist doch richtig.
Du könntest alle #PB_UTF8 Konstanten ja mal gegen #PB_Ascii ersetzen.
(Oder du lässt den letzten Parameter einfach mal weg.)
Hatte ich schon probiert ohne Erfolg. Gleicher Fehler. Er hat ein Problem mit der -1 .
Du könntest auch mal diese Zeile auskommentieren:
taglib_set_strings_unicode(#True)
Habe ich auch probiert. Fehler bleibt.
Ich meine diesen Wert:
If AUDIOAnalyzeFile(@File)
Debug AUDIOAnalyzeFile(@File)
.Da kommt wie es soll 1 raus.

Ich würde gern bei der Audigenie bleiben, weil dort ja alles drin ist. Ich wll mal in den nächsten Tagen versuchen selbst eine Procedur zu schreiben, die die Audiolänge errechnet. Bei VBR müssen nur bei mehr Frames die Bitrate ausgelesen werden und dann der Durchschnitt ermittelt werden für die Berechnung. Je mehr Frames desto genauer die Länge.
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 »

Die Nachforschung geht weiter.

Mp3 ist aber auch ein nerviges Format.

CBR 320 kbps und Joint Stereo ist immer noch das Beste mit einem guten Encoder (Lame).

Es gibt eben so viele verschiedene Tag Arten bei Mp3.

Das hier sieht auch noch ganz interessant aus:
https://squell.github.io/id3/
(Konsolenwerkzeug)
schleicher hat geschrieben:Bei VBR müssen nur bei mehr Frames die Bitrate ausgelesen werden und dann der Durchschnitt ermittelt werden für die Berechnung.
Ja ohne Headerinformationen müsste man so verfahren.
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 »

Das hier sieht auch noch ganz interessant aus:
https://squell.github.io/id3/
(Konsolenwerkzeug)
Nicht schlecht, kann aber die Audiolänge nicht wiedergeben.

Hab mir mal mit den Frames auslesen beschäftigt. Dafür reichen meine Programmierkünste nicht aus. Kann auch kein Beispiel finden :cry:
Hab mal mit mpval die mp3`s mit falsch ausgelesener Länge gecheckt. Der sagt VBR und keine VBR Header informationen verfügbar.
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 »

Kannst du bitte mal die Info-Msg-Box(en) der MediaInfo.dll als Bild posten.
Steht dort wirklich nur Variable und sonst nichts ?
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 »

Ja da stand wirklich nur "Variable" in der MSG Box von Mediainfo. Habe mich im Internet belesen und habe herausgefunden das es schon öfter vorgekommen ist damit der Header einer mp3 beschädigt ist bei vbr. Jenachdem was man verwendet hat zum Rippen von Cd oder welchen Codec man verwendet hat. Es gibt aber im Netz einige Freewaretools die den Header reparieren ( die duchschnittliche Bitrate errechnen und in den Header schreibem). Ich habe mal das Command line tool " Vbrfix" verwendet und nun wird in Audiogenie auch die richtige Audiolänge angezeigt.
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 »

Anbei:

Wie liest man den ohne ID3-Tag (also nur Mp3-Header-Frames) die korrekten Werte aus ?

Bei CBR (konstanter Bitrate) müsste doch die Bitrate immer konstant sein, oder ?

Hier ein mangelhafter Code von mir:

Code: Alles auswählen

Macro FillArray(name, count, items)
  For i=1 To CountString(items,",")+1
    name(count, i-1)=Val(StringField(items,i,","))
  Next
EndMacro

Procedure Testbit(val,bitnum)
  ;gibt Bitwert zurück
  Global Dim bit.b(8);
  t1 = val / 2 : If t1*2 <> val : bit(1) = 1 : EndIf
  t2 = t1 / 2  : If t2*2 <> t1  : bit(2) = 1 : EndIf
  t3 = t2 / 2  : If t3*2 <> t2  : bit(3) = 1 : EndIf
  t4 = t3 / 2  : If t4*2 <> t3  : bit(4) = 1 : EndIf
  t5 = t4 / 2  : If t5*2 <> t4  : bit(5) = 1 : EndIf
  t6 = t5 / 2  : If t6*2 <> t5  : bit(6) = 1 : EndIf
  t7 = t6 / 2  : If t7*2 <> t6  : bit(7) = 1 : EndIf
  t8 = t7 / 2  : If t8*2 <> t7  : bit(8) = 1 : EndIf
  result = bit(bitnum)
  ProcedureReturn result
EndProcedure

Procedure ReadMp3(fname.s)
  Protected cbyte.c = 0, tbyte.c = 255, tbit.s, fpos.q = 0, start.b = #False
  Protected fhpos.i = 0
  Protected mpegversion.i, layer.i, protectbit.i, bitrate.i, frequency.i
  Protected Dim brt.i(1, 15) ;BitRateTable
  Protected Dim ft.i(1, 3)   ;FrequencyTable
  
  FillArray(brt, 0, "0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1")
  FillArray(brt, 1, "0,8,16,24,32,64,80,56,64,128,160,112,128,256,320,-1")
  
  FillArray(ft, 0, "22050,24000,16000,0")
  FillArray(ft, 1, "44100,48000,32000,0")
  
  If ReadFile(0, fname, #PB_Ascii)
    StepFrame:
    Repeat
      cbyte = ReadCharacter(0, #PB_Ascii)
      ;Debug cbyte
      ;Laaangsam und mit Fragezeichen
      tbit = "%"+Str(Testbit(cbyte, 1))+Str(Testbit(cbyte, 2))+Str(Testbit(cbyte, 3))+Str(Testbit(cbyte, 4))+Str(Testbit(cbyte, 5))+Str(Testbit(cbyte, 6))+Str(Testbit(cbyte, 7))+Str(Testbit(cbyte, 8))
      If Val(tbit) = 255
        ;Sync
        cbyte = ReadCharacter(0, #PB_Ascii)
        tbit = "%"+Str(Testbit(cbyte, 1))+Str(Testbit(cbyte, 2))+Str(Testbit(cbyte, 3))
        If Val(tbit) = 7
          start = #True
        EndIf
      EndIf
    Until start = #True
    ;Frameheader
    fpos = Loc(0)
    fpos - 2
    fhpos = fpos
    Debug "1. Frame bei: "+Str(fhpos)
    
    ;MPEG-Version
    If Testbit(cbyte, 4) = 1 And Testbit(cbyte, 5) = 1
      Debug "MPEG 1 "
      mpegversion = 1
    ElseIf Testbit(cbyte, 4) = 0 And Testbit(cbyte, 5) = 1
      Debug "MPEG 2 "
      mpegversion = 0
    EndIf
    
    ;Layer
    If Testbit(cbyte, 6) = 1 And Testbit(cbyte, 7) = 0
      Debug "Layer III"
      layer = 3
    ElseIf Testbit(cbyte, 6) = 0 And Testbit(cbyte, 7) = 1
      Debug "Layer II"
      layer = 2
    ElseIf Testbit(cbyte, 6) = 1 And Testbit(cbyte, 7) = 1
      Debug "Layer I"
      layer = 1
    EndIf
    
    Debug "Layer: "+ Str(layer)
    
    If layer > 3
      Debug "Keine gültige Mp3-Datei!"
    EndIf
    
    ;CRC Prüfung
    protectbit = Testbit(cbyte, 8)
    If protectbit
      Debug "CRC: No"
    Else
      Debug "CRC: Yes"
    EndIf
    
    ;Nächstes Byte
    cbyte = ReadCharacter(0, #PB_Ascii)
    
    ;Bitrate
    tbit = "%"+Str(Testbit(cbyte, 1)) + Str(Testbit(cbyte, 2)) + Str(Testbit(cbyte, 3)) + Str(Testbit(cbyte, 4))
    If layer > 0 And layer <= 3
      bitrate = brt(mpegversion, Val(tbit))
    EndIf
    Debug "Bitrate: "+Str(bitrate)
    
    ;Frequenz
    tbit = "%"+Str(Testbit(cbyte, 5))+Str(Testbit(cbyte, 6))
    If layer > 0 And layer <= 3
      frequency = ft(mpegversion, Val(tbit))
    EndIf
    Debug "Frequenz: "+Str(frequency)
    
    ;Nächste 2 Bytes
    cbyte = ReadCharacter(0, #PB_Ascii)
    cbyte = ReadCharacter(0, #PB_Ascii)
    
    ;Suche den nächsten Frame-Header
    start = #False
;     If Not Eof(0)
;       Goto StepFrame
;     EndIf
    
    CloseFile(0)
  EndIf
  
EndProcedure

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

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 »

Wie könnte man das hier verbessern ?

Code: Alles auswählen

Structure Mp3HeaderBitsString
  MPEGTypeBitsString.s
  LayerBitsString.s
  BitrateBitsString.s
  FreqBitsString.s
  ChannelModeBitsString.s
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()
Declare.b CheckForZeroBytes(ByteToCheck.b)
Declare.s GetBitsString(StartIndex.i, EndIndex.i)
Declare.i GetMPEGType()
Declare.i GetLayer()
Declare.i GetProtection()
Declare.i GetBitrate()
Declare.i GetSamplingRateFreq()
Declare.i GetChannelMode()
Declare.i GetCopyRight()
Declare.d GetDuration()
Declare.s GetDurationString()
Declare.i GetVBRMp3Bitrate()
Declare ThreadMp3Info(test)

Global MP3.s, GBitrate.i = 0, Counter.i = 0

Global Mp3HeaderBitsStr.Mp3HeaderBitsString
Global Mp3HeaderBits
Global Mp3HeaderPosition.q, Mp3ClearSize.q
Global *Mp3File
Global FileCounter.q = -1

Global Thread, VBRBitrate, VBRTime.s, tende.b = #False

Procedure Mp3_New(MP3FilePath.s)
  Protected fsize.q
  If Not ReadFile(0, MP3FilePath)
    Debug "Die Datei existiert nicht."
    End
  Else
    fsize = Lof(0)
    *Mp3File = AllocateMemory(fsize, #PB_Memory_NoClear)
    ReadData(0, *Mp3File, MemorySize(*Mp3File))
    If Eof(0)
      CloseFile(0)
    Else
      Debug "Ein Lesefehler ist aufgetreten."
      CloseFile(0)
    EndIf
  EndIf
EndProcedure

Procedure.b GetMP3HeaderBytes() ;Hammer-Geile Funktion
  Protected TempMP3HeaderBits
  Protected Mp3HeaderBytes
  Protected IsSyncByte.b, CheckByte.b = 255
  Protected.i i, j, Index, BitOffSet
 
  Mp3HeaderBits = 24
  While FileCounter <= MemorySize(*Mp3File)
    FileCounter + 1
    If PeekB(*Mp3File+FileCounter) = CheckByte
      If Mp3HeaderPosition = 0
        Mp3HeaderPosition = FileCounter
      EndIf
      IsSyncByte = #True
    EndIf
    While IsSyncByte = #True
      FileCounter + 1
      PokeB(@Mp3HeaderBytes, PeekB(*Mp3File+FileCounter))
      FileCounter + 1
      PokeB(@Mp3HeaderBytes+1, PeekB(*Mp3File+FileCounter))
      FileCounter + 1
      PokeB(@Mp3HeaderBytes+2, PeekB(*Mp3File+FileCounter))
      TempMP3HeaderBits = Mp3HeaderBytes
      For i = 7 To 5 Step -1
        If Not BitRead(@TempMP3HeaderBits, i)
          IsSyncByte = #False
          FileCounter - 3
          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
        FileCounter - 3
        Break 2
      EndIf
      If Mp3HeaderBitsStr\LayerBitsString = "11" Or Mp3HeaderBitsStr\LayerBitsString = "10" Or Mp3HeaderBitsStr\LayerBitsString = "00"
        IsSyncByte = #False
        FileCounter - 3
        Break 2
      EndIf
      If Mp3HeaderBitsStr\BitrateBitsString = "1111"
        IsSyncByte = #False
        FileCounter - 3
        Break 2
      EndIf
      If Mp3HeaderBitsStr\FreqBitsString = "11"
        IsSyncByte = #False
        FileCounter - 3
        Break 2
      Else
        Mp3ClearSize = (FileCounter - Mp3HeaderPosition - 128)
        ProcedureReturn #True
      EndIf
    Wend
  Wend
  ProcedureReturn #False
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.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 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
  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
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.d GetDuration()
  Protected Duration.d
  If GBitrate > 0
    Duration = (Mp3ClearSize * 8) / GBitrate
  EndIf
  ProcedureReturn Duration
EndProcedure

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

Procedure.i GetVBRMp3Bitrate()
  Protected DoubleBitrate.d
  Protected Counter.q = 0
  Protected TmpBitrate.i
  Protected MagicBits.i = 9 ;?
  Protected flag = #False
  Repeat
    If GetMP3HeaderBytes()
      If Counter = 0
        TmpBitrate = GetBitrate()
      EndIf
      If Counter = 1 And TmpBitrate = GetBitrate()
        flag = #True
      EndIf
      GBitrate + GetBitrate()
      Counter + 1
    EndIf
  Until FileCounter >= MemorySize(*Mp3File)
  If flag = #True
    GBitrate = TmpBitrate
  EndIf
  If flag = #False
    DoubleBitrate = GBitrate
    DoubleBitrate / Counter
    DoubleBitrate + MagicBits
    GBitrate = Int(Round(DoubleBitrate, #PB_Round_Nearest))
  EndIf
  ProcedureReturn GBitrate
EndProcedure

Procedure ThreadMp3Info(test)
  VBRBitrate = GetVBRMp3Bitrate()
  VBRTime = GetDurationString()
  tende = #True
EndProcedure

;-Main
Global wait.d = 0

CompilerIf #PB_Compiler_Thread = 0
  MessageRequester("Warnung!!!", "Bitte Thread-Safe aktivieren!"+#LFCR$+"Danke!", #PB_MessageRequester_Warning)
CompilerElseIf #PB_Compiler_Thread = 1
  OpenConsole()
  ConsoleTitle("VBR-Time")
  EnableGraphicalConsole(#True)
  ConsoleCursor(0)
  MP3 = OpenFileRequester("Freedom for Mp3", "Select MP3 File", "MP3 Files (*.mp3)|*.mp3", 0)
  Mp3_New(MP3)
  PrintN(~"Die Mp3-Datei \""+GetFilePart(MP3)+~"\" wurde geöffnet.")
  PrintN("Es werden jetzt die Bitrate und die Songlänge ermittelt.")
  PrintN("Dies kann einen kleinen Moment dauern.")
  Thread = CreateThread(@ThreadMp3Info(), 0)
  Repeat
    wait = (100/MemorySize(*Mp3File)) * FileCounter
    ConsoleLocate(0, 5)
    Print("Bitte warten: "+RSet(StrD(wait,0), 3, " ")+"%")
  Until tende = #True
  PrintN(""):PrintN("")
  PrintN("VBR Bitrate: "+ Str(VBRBitrate))
  PrintN("VBR Zeit: "+ VBRTime)
  Input()
  PrintN("")
  PrintN("Danke für die Geduld.")
  PrintN("An einer besseren (schnelleren und präziseren) Berechnung wird (vielleicht) gearbeitet.")
  Input()
  CloseConsole()
  FreeMemory(*Mp3File)
  End
CompilerEndIf
Etwas optimiert !!! (Bleibt erstmal so)
Zuletzt geändert von ccode_new am 15.09.2018 23:44, insgesamt 3-mal geändert.
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 »

Weitere Tipps sind willkommen.
(Siehe oben)
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.
Besten Dank für deine Mühe. Wenn ich das doch auch könnte.


Ich hab es getestet und funktioniert auch bei defektem Header. Länge wird korrekt angezeigt. Winamp zeigte die gleiche Zeit.
Aber wie du schon sagst ist es ein wenig langsam. Vielleicht hat jemand einen Vorschlag wie es schneller geht.


Habe da mal ein Beispielcode in Visal Basic gefunden. Vielleicht kann man sich da was abschauen.
http://forums.devshed.com/visual-basic- ... 47121.html
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 »

123..
Da bin ich.

Hallo schleicher,

dieser Code sollte nur zum korrigieren von defekten ID3-Tags genutzt werden.

Die allg. Optimierung liegt an dem kompletten Einlesen in den Arbeitsspeicher.
Alle weiteren Aktionen erfolgen dann im RAM.

Eine Mp3 ist in erster Linie ein Musikformat was für Streaming ausgelegt ist. (Wie so viele andere auch.)

Das heißt eine Mp3 sollte von verschiedenen Stellen aus abgespielt werden können. (Wie so viele andere auch.)

Mein geposteter Code hat aber auch ein paar Denk/Design-Fehler.

Wenn ein Encoder für VBR eine Mp3 mit min. 2 gleichen Bitraten am Anfang erstellt, wird (einfach mal so) von einer CBR (konstanten Bitrate) ausgegangen.

Außerdem schreibt auch nicht jeder Encoder/ nicht jede Encodereinstellung auch "reinrassige" konstante Bitraten.
Der überwiegende Teil (die Frames) sollten aber eine gleiche Bitrate haben. (Außnahmen bestätigt die Überprüfung)

Das Ende vom Lied:
Mp3 Dateien mit korrekten ID3-Tags sind zu bevorzugen und in der "Else-Klausel" zu reparieren.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

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