Cover aus WMA Datei auslesen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Murdock.

    Cover aus WMA Datei auslesen

    Guten Abend alle miteinander.
    Ich bin mithilfe des (inzwischen schon etwas älteren) Codes von hier: codeproject.com/Articles/13328…rom-a-WMA-file-MP-as-well neben MP3 ID3Tags auch die Tags von WMA Datein auslesen (was ja im Endeffekt nichts weiter als ASF-Infos sind). Ich finde aber trotz vorhandener ASF Dokumentation keine Möglichkeit, das Cover auszulesen. Weiß jemand, wie das geht, oder ob es dafür eine Libary gibt? Oder gibt es vielleicht auch eine Libary mit der man nicht nur MP3 und WMA sondern vielleicht auch noch andere Datei-Tags auslesen kann?
    Liebe Grüße
    sothere
    @timonator : Die Klasse zeigt mir von WMA Datein auch kein Cover an.
    Da mir aber nur der WMP ein Cover anzeigt, und nicht mal VLC, kann ich dazu noch nichts sagen.
    Werde jetzt mal schauen, ob der TagEditor mir was nützt :)

    Da der TagEditor das auch nicht kann, lass ich es einfach (war ja nur nen Gedanke). Wenn ich wüsste, wie, könnte ich es ja auch selber schreiben. Wobei ich mir nicht mal sicher bin, ob das überhaupt geht bzw. ob es überhaupt Programme gibt, die in WMA Cover speichern.
    Liebe Grüße
    sothere

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sothere“ ()

    https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=6613&lngWId=10 schrieb:

    I added the ability to extract the
    picture as an image you can display in a picture box.
    The ID3 tag reader was written from scratch. It supports ID3V1.0/1.1 or
    ID3V2.3/2.4. ID3V2.2 is NOT supported--the tags are totally different
    from 2.3 and 2.4 and this version seems unsupported on ID3.org.

    Könnte es daran liegen ?
    @Murdock : Ja, von MP3s kann ich es ja auch selber ändern
    @timonator : Eigentlich nicht. Werde trotzdem mal alles Durchprobieren. Wobei man nicht vergessen darf, das die WMA Dateien eigentlich gar keine ID3Tags besitzen, diese werden entweder falsch rein- oder draufgeschrieben. Eigentlich haben sie, das sie ASF Ableitungen sind, ein eigenes Feld für solche Informationen. Die Bezeichnung ID3 Tags für WMA Dateien ist also mit Vorsicht zu genießen!

    EDIT: Ich habe das ganze jetzt nochmal über APE (Das ist das "ID3" Format für WMA Dateien) versucht und konnte auch keine Cover speichern. Scheint, als ob WMA das nicht kann / darf bzw. nur mit bestimmten Typen?
    EDIT2: Und kannst du damit Covers von WMA Dateien speichern oder auslesen?
    Liebe Grüße
    sothere

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sothere“ ()

    sothere schrieb:

    Und kannst du damit Covers von WMA Dateien speichern oder auslesen?


    @sothere wenn das Programm es schafft, wird das wohl machbar sein, lade dir das Ding einfach mal runter und probier es! Das funzt!

    Wieder´n Edit @sothere guck im Anhang
    Bilder
    • tag.jpg

      71,52 kB, 1.125×668, 163 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Murdock“ ()

    Mich juckt es nun auch in den Fingern, ich schau mal was sich wie machen lässt. Hab bisher nur mit ID3-Tags hantiert, werde mir das mit den WMA (Meta) Tags mal ansehen, das wäre doch einer Dll würdig. Wenn ich da was gecodet hab sag ich dir bescheid.
    Das wäre wahnsinnig lieb von dir! Ich hab mir ja selber für ID3 und WMA die Libarys geschrieben, ich bekomme halt nur die Cover (habe gerade gelesen, das da sogar mehrere Bild reinkönnen) aus der WMA nicht raus.
    Also das ist ja der Wahnsinn! Es können wohl bis zu 20 Covers abgespeichert werden. Die liegen alle in Binary vor und unter dem Attribut "WM/Picture". Weiter bin ich aber auch nicht gekommen, vielleicht kommst du ja weiter!

    Liebe Grüße
    sothere

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sothere“ ()

    Da hab ich mir grad meine eigene Lib für einige Arten von Tags schreibe, habe ich mich nun damit richtig beschäftigt, ich fand auch einen weniger schönen Code den ich einfach übersetzt und erweitert hab.
    Quelle des Ursprünglichen Codes:
    social.msdn.microsoft.com/Foru…object?forum=Vsexpressvcs

    Änderung in Select Case ValueType in Case 1
    Erweiterter Code in VB.net
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Public Class Form1
    4. Private Filename As String = "D:\1.wma"
    5. Private cdoGuid As Byte() = {&H33, &H26, &HB2, &H75, &H8E, &H66, &HCF, &H11, &HA6, &HD9, &H0, &HAA, &H0, &H62, &HCE, &H6C}
    6. Private ecdoGuid As Byte() = {&H40, &HA4, &HD0, &HD2, &H7, &HE3, &HD2, &H11, &H97, &HF0, &H0, &HA0, &HC9, &H5E, &HA8, &H50}
    7. Private dataSizes As Int16() = New Int16(4) {}
    8. Private data As String() = New String(4) {}
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Using fs As New FileStream(Filename, FileMode.Open)
    11. Using br As New BinaryReader(fs)
    12. 'Find Content Description Object
    13. If findGuid(cdoGuid, br, fs) Then
    14. 'Get size of object
    15. Dim size As Long = br.ReadInt64()
    16. 'Get size of data items
    17. For i As Integer = 0 To 4
    18. dataSizes(i) = br.ReadInt16()
    19. Next
    20. 'Read data content
    21. For i As Integer = 0 To 4
    22. Dim characters As Byte() = br.ReadBytes(dataSizes(i))
    23. data(i) = Encoding.Unicode.GetString(characters).TrimEnd(ControlChars.NullChar)
    24. If Not data(i).Equals(String.Empty) Then
    25. TextBox1.Text += data(i) + Environment.NewLine
    26. End If
    27. Next
    28. TextBox1.Text += "---------------" + Environment.NewLine
    29. Else
    30. TextBox1.Text = "Falied to find Content Description"
    31. End If
    32. 'Find Extended Content Description Object
    33. If findGuid(ecdoGuid, br, fs) Then
    34. 'Get size of object
    35. Dim size As Long = br.ReadInt64()
    36. 'Get descriptor count
    37. Dim dCount As Int16 = br.ReadInt16()
    38. 'Get descriptor items
    39. For i As Integer = 0 To dCount - 1
    40. 'Get descriptor name length
    41. Dim dNameLength As Int16 = br.ReadInt16()
    42. 'Get descriptor name
    43. Dim characters As Byte() = br.ReadBytes(dNameLength)
    44. Dim dName As String = Encoding.Unicode.GetString(characters).TrimEnd(ControlChars.NullChar)
    45. Dim valueType As Int16 = br.ReadInt16()
    46. 'Get value length
    47. Dim valueLength As Int16 = br.ReadInt16()
    48. 'Get value as string
    49. Dim dValue As String = ""
    50. Select Case valueType
    51. Case 0
    52. 'String type
    53. characters = br.ReadBytes(valueLength)
    54. dValue = Encoding.Unicode.GetString(characters).Trim(ControlChars.NullChar)
    55. Case 1
    56. If dName.Equals("WM/Picture") Then
    57. Dim imageType As Integer = br.ReadByte() 'frontcover backcover etc...
    58. Dim imageSize As Integer = BitConverter.ToInt32(br.ReadBytes(4), 0)
    59. Dim mimestring As String = Encoding.Unicode.GetString(br.ReadBytes(valueLength - imageSize - 5)).TrimEnd(ControlChars.NullChar)
    60. Try
    61. Dim bmp As Image = Image.FromStream(New MemoryStream(br.ReadBytes(imageSize)))
    62. Dim f As New Form
    63. f.StartPosition = FormStartPosition.CenterScreen
    64. f.BackgroundImage = bmp
    65. f.BackgroundImageLayout = ImageLayout.None
    66. f.ShowDialog()
    67. Catch ex As Exception
    68. Throw New Exception("Fehler beim auswerten des Bildes")
    69. End Try
    70. Else
    71. 'skip
    72. br.ReadBytes(valueLength)
    73. End If
    74. Case 2
    75. 'bool
    76. br.ReadInt32()
    77. Case 3
    78. 'Int32
    79. dValue = br.ReadInt32().ToString()
    80. Case 4
    81. 'Int64
    82. dValue = br.ReadInt64().ToString()
    83. Case 5
    84. 'Int16
    85. dValue = br.ReadInt16().ToString()
    86. End Select
    87. TextBox1.Text += (Convert.ToString(dName & Convert.ToString(" ")) & dValue) + Environment.NewLine
    88. Next
    89. Else
    90. TextBox1.Text += "No Extended Content Found"
    91. End If
    92. End Using
    93. End Using
    94. End Sub
    95. 'Searches for a match with the guid
    96. Private Function findGuid(guid As Byte(), b As BinaryReader, fs As FileStream) As Boolean
    97. Dim ix As Integer = 0
    98. Dim position As Long = fs.Position
    99. While position < fs.Length
    100. If b.ReadByte() = guid(ix) Then
    101. If ix = 15 Then
    102. Return True
    103. Else
    104. ix += 1
    105. End If
    106. Else
    107. ix = 0
    108. End If
    109. position += 1
    110. End While
    111. Return False
    112. End Function
    113. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Murdock“ ()