vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
MP3 Zeiten ändern 
Autor: Volker Bunge
Datum: 25.12.18 12:11

Hallo zusammen,

erst einmal frohe Weihnachten Euch allen.

Ich habe mir ein Programm geschrieben (VB.NET 2010), mit dem ich meine MP3-Dateien verwalte bzw. in eine einheitliche Form bringe.

Jetzt kommen ab und zu Dateien auf, bei denen ich zwei unterschiedliche Spielzeiten ermitteln kann.

1. wird über

Dim aviFile As MediaFile = New MediaFile(Dateipfad)
Spieldauer = aviFile.General.DurationString

ermittelt

2. wird über

With m_UltraID3.FirstMPEGFrameInfo
Spieldauer2 = .Duration.ToString
Spieldauer2 = Mid(Spieldauer2, 1, 8)
End With

ermittelt

Da die Abweichungen teilweise doch recht hoch sind, frage ich den Benutzer (also mich), welche Zeit die richtige ist. So weit so gut.

Der VLC-Player gibt mir hier auch einer der beiden Zeiten richtig an, so dass ich mich an diesen Angaben orientieren kann.

Nun möchte ich aber diese "richtige" Zeit auch dauerhaft in der MP3-Datei ändern.

Frage: Geht so etwas überhaupt und wenn ja wie?

Vielen Dank

Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: effeff
Datum: 25.12.18 13:44

Was für eine Zeit bekommst Du heraus, wenn Du diese Funktion hier benutzt? https://www.vbarchiv.net/tipps/tipp_2071-l-nge-spieldauer-einer-mp3-datei-ermitteln.html

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: Volker Bunge
Datum: 25.12.18 18:52

Hallo effeff,

vielen Dank erst einmal für die schnelle Antwort.

Habe es gerade mal ausprobiert.

Also bei einer Datei kommen 534022 Millisekunden raus = 8:54 Minuten, richtig wäre lt. VLC Player 5:56 (habe mmir den Track angehört und die Zeit gestoppt, stimmte auf die Sekunde genau). Bei einer anderen kommt 0 m.Sek. raus, richtig wären 01:05:26.

Diese Methode scheint somit nicht immer die tatsächliche Dauer zu liefern.

Mir würde es ja schon reihen, wenn ich die Zeitinformationen ändern könnte.

Gruß

Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: Kuno60
Datum: 25.12.18 23:13

Hallo Volker,

soweit mir bekannt ist, wird die Gesamtzeit nicht in einer mp3-Datei gespeichert. Diese wird erst nach dem Entpacken der einzelnen Frames berechnet.

Ich hab bisher den FilgraphManager (Quartz.dll) oder den Windows.Media.MediaPlayer, für das Abspielen von Sound-Dateien (auch mp3) verwendet. Damit hat die Titellänge (Duration) immer gestimmt.

So mit dem Mediaplayer:
'Verweise auf PresentationCore und WindowsBase hinzufügen!
 
Private WithEvents Medi As New MediaPlayer
 
Sub StarteTitel(datei As String)
  Medi.Open(New Uri(datei))
End Sub
 
Private Sub Medi_MediaOpened(sender As Object, e As EventArgs) Handles _
  Medi.MediaOpened
  LabelDuration.Text = Medi.NaturalDuration.TimeSpan.ToString("mm':'ss")
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: Volker Bunge
Datum: 26.12.18 10:29

Hallo Kuno60,

vielen Dank für die Antwort.

So, haben Deinen Code mal getestet. Grundsätzlich funktioniert er, aber leider nur, wenn ich ihn im Einzelschrittmodus laufen lassen.

Hier mal meine Modifikation (ist zwar noch nicht optimal, funktioniert aber mit F8 tadellos. (Endlösung siehte weiter unten).

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) _
      Handles Button3.Click
        Spielzeit_ermitteln("Datei1.mp3")
        Spielzeit_ermitteln("Datei2.mp3")
    End Sub
 
    Sub Spielzeit_ermitteln(datei As String)
        Medi.Open(New Uri(datei))
        '        Application.DoEvents()
        Dim erg As String
        If Medi.NaturalDuration.HasTimeSpan = True Then
            erg = Medi.NaturalDuration.TimeSpan.Hours & ":" & _
              Medi.NaturalDuration.TimeSpan.Minutes & ":" & _
              Medi.NaturalDuration.TimeSpan.Seconds
            MsgBox(erg)
        End If
 
        Medi.Close()
    End Sub
Dann habe ich gedacht, ach mach den Code mal gleich so, wie er eigentlich sein soll. Hier das Ergebnis

#Region "Spielzeit von MP3-Dateien ermitteln"
    ' Verweise auf .net PresentationCore und .net WindowsBase hinzufügen!
    ' Imports System.Windows.Media (vor Public Class) muss auch noch eingefügt 
    ' werden
    Private WithEvents Medi As New MediaPlayer
    Function Spielzeit_ermitteln(datei As String) As String
        ' Öffnet 'intern' die übergebene Datei
        Medi.Open(New Uri(datei))
 
        ' Hierdurch habe ich die Lösung gefunden. Vorher war die Datei wohl 
        ' noch nicht vollständig geladen, aber das Programm war schon 'fertig' 
        ' und daher war das Ergebnis immer leer
        'MsgBox(Medi.BufferingProgress)
        'MsgBox("Weiter")
        'MsgBox(Medi.BufferingProgress)
 
        ' Habe deshalb diese Do While Schleife eingebaut
 
        ' Standardrückgabewert festlegen
        Spielzeit_ermitteln = ""
 
        ' Die Zeit solange ermitteln, bis der BufferingProgress = 1.0 ist und 
        ' die Variable Spielzeit_ermitteln <> "" ist
        ' Jetzt wird halt solange 'gewartet', bis die Datei vollständig geladen 
        ' wurde und die Spieldauer richtig ermittelt werden kann.
        Do
            ' Hier wird geprüft, ob die Zeitangabe vorhanden ist
            If Medi.NaturalDuration.HasTimeSpan = True Then
                ' Jetzt wird die Zeitdarstellung erstellt und über den 
                ' Funktionsnamen zurückgeliefert.
                Spielzeit_ermitteln = Format( _
                  Medi.NaturalDuration.TimeSpan.Hours, "00") & ":" & Format( _
                  Medi.NaturalDuration.TimeSpan.Minutes, "00") & ":" & Format( _
                  Medi.NaturalDuration.TimeSpan.Seconds, "00")
            End If
        Loop While Val(Medi.BufferingProgress) = 0 Or Spielzeit_ermitteln = ""
 
        ' Zum Schluss noch die Datei wieder schließen. Fertig
        Medi.Close()
    End Function
#End Region
So wie im Code beschrieben, bin ich mit BufferingProgress und der Do While Schleife an mein Ziel angekommen.

Werde jetzt mal meine alte Programmierung gegen diese hier tauschen und sehen was passiert.

Vielen Dank für den Denkanstoss, hoffe dass somit mein Problem behoben ist.

Volker

Beitrag wurde zuletzt am 26.12.18 um 10:35:43 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: Volker Bunge
Datum: 06.01.19 11:11

Hallo Kuno60,

ich habe jetzt ein kleines (großes) Problem mit Deiner Methode, sobald in der Pfadangabe Sonderzeichen drin sind, funktioniert das ganze nicht mehr (wird beie den anderen Sonderzeichen wahrscheinlich ähnlich aussehen).

Bsp: ...\100 % Rock\... wird lt. Medi.Source zu ...\100%25 Rock\...

Hast Du eine Ahnung, wie ich diesen Fehler umgehen kann und er mir den richtigen Pfad angibt?.

(Klar könnte ich die Sonderzeichen aus den Pfadangaben vermeiden, wäre aber so die letzte Option).

Vielen Dank

Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: Kuno60
Datum: 06.01.19 18:55

Hallo Volker,

Sonderzeichen im Dateinamen machen bei mir überhaupt keine Probleme.
Das wird bei dir eine andere Ursache haben.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: Volker Bunge
Datum: 08.01.19 10:01

Hallo Kuno60,

vielen Dank für die Antwort.

So, habe jetzt gerade mal ein wenig experimentiert.

Als erstes habe ich ein neues Projekt erstellt und dort einen Button und das WMP Control eingefügt und die beiden Verweise gesetzt.

Dann habe ich über den Button einige Dateipfade an die Starttitel übergeben. Dabei ist aufgefallen, wenn die Datei incl. Verzeichnisstruktur auf C liegt, klappt es. Leider liegen bei mir die Verzeichnisse auf einem Netzlaufwerk bzw. besser gesagt auf einer externen Platte, die an meinem Homeserver angeschlossen ist. Die Festplatte ist auf dem Clientrechner dann ganz normal als LW E anzusprechen. Es gab hier auch noch nie irgendwelche Probleme, bis auf diesen hier.

Danach habe ich mal diese UNCPath - Function https://stackoverflow.com/questions/16185716/vb-net-code-to-convert-shared-local-path-to-unc-path eingebaut, um dass Problem evtl. darüber zu lösen. Leider auch hier der gleiche Fehler bzw. keine Anzeige der Zeit.

Wie gesagt, wenn ich bei Medi in die Eigenschaften schaue bzw. mir den Source - Wert anschaue, steht dort hinter jedem % eine 25 (also %25).

Bin sogar hergegangen und habe das Verzeichnis und die Dateien mal ohne % umbenannt. Leider kein Erfolg.

Mit eienem anderen Verzeichnis und dem Sonderzeichen ' klappt es komischer Weise. (auch ohne UNC Path).

Daher meine Vermutung, dass das % bei Windows eine Art Sonderstellung einnimmt und die Programme/Funktionen hier ein paar Schwierigkeiten machen.

Jetzt weis ich halt nicht, ob Du (bzw. jemand anderes) einen Server haben und somit das Problem nachvollziehen
bzw. testen können.

Wäre daher über jeden Tipp bzw. Lösungsansatz dankbar.

Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: effeff
Datum: 08.01.19 10:17

Was für ein Server ist das? Was für ein Betriebssystem? Über welches Protokoll wird darauf zugegriffen?

Das Prozentzeichen wird benutzt, um bei bestimmten Protokollen Sonderzeichen zu maskieren; Das hast Du z. B. bei den URLs auf Webservern.

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: MP3 Zeiten ändern 
Autor: Volker Bunge
Datum: 08.01.19 20:30

Hallo effeff,

also mein Server ist ein Acer H340 mit dem BS Windows Home Server ServicePack 2.

Der Zugriff erfolgt dann ganz normal über Windows 7 bzw. Windows 10 Rechner.

Hoffe, dass ich Dir/Euch damit weitergeholfen habe.

Ach so, für das Einbinden habe ich mir schon vor Jahren ein eigenes Programm geschrieben, welches bestimmte Verzeichnisse auf dem Server als Netzlaufwerke auf dem Clint zur Verfügung stellt.

Hier mal ein kleiner Auszug aus meinem Programm

    Function Verzeichnis_Einbinden(Dateipfad As String, EinbindenAls As String, _
      ClientLW As String, Bezeichnung As String) As Boolean
        Dim objLocator As SWbemLocator
        Dim objServices As SWbemServices
        Dim objShare As SWbemObject
        Dim lRet As Long
 
        objLocator = New WbemScripting.SWbemLocator
        objServices = objLocator.ConnectServer(UCase(txtPCName.Text)) ', 
        ' "root", "Administrator", "Volkerbu12")
 
        objShare = objServices.Get("Win32_Share")
 
        ' Parameter der Create-Methode wie im WMI SDK beschrieben:
        ' 1. lokaler Pfad des freizugebenden Ordners
        ' 2. Freigabename
        ' 3. Art der Freigabe (0 = Disk)
        ' 4. Anzahl max. gleichzeitig verbundener Benutzer
        ' 5. Beschreibung des Shares
 
        lRet = objShare.Create(Dateipfad, EinbindenAls, 0, 5, Bezeichnung)
        If lRet = 0 Then
            Verzeichnis_Einbinden = True
        Else
            Verzeichnis_Einbinden = False
        End If
 
        objShare = Nothing
        objServices = Nothing
        objLocator = Nothing
 
        ' Das Einbinden festhalten
        'If InStr(UCase(EinbindenAls), "TT") = 0 Then
        '    VorhandeneVerknüpfungen.Items.Add(Mid(Dateipfad, 1, 3) & " " & 
        ' EinbindenAls & " als Laufwerk " & ClientLW)
        '    '  Threading.Thread.Currentthread.Sleep(2000)
        'End If
    End Function
Vielen Dank

Volker
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel