| |
VB.NET - Ein- und UmsteigerMP3 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 | |
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 | |
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 | |
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. | |
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 | |
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. | |
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 | |
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 | |
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 | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere Infos
|