2016-05-01 21 views
3

Ich frage mich, ob es möglich ist, einen Songtext3v2 Tag-Typ aus einer MP3-Datei mit TagLibSharp Bibliothek zu entfernen.Kann mit TagLibSharp ein Lyrics3v2-Tag aus einer MP3-Datei entfernt werden?

This Dokumentation sagt, dass der Block Eintrag mit Wort beginnt „LYRICSBEGIN“ und endet mit „LYRICS200“, sagt auch, dass der ID3-Tag vorhanden sein soll, besteht den Lyrics3v2 Tag zu lassen .. .aber es gibt nicht auf, wenn verweist auf ID3v1 oder ID3v2 Tag, oder einer von ihnen, irgendwie verstehe ich nicht, dass ein Teil, weil Lyrics3v2 Tag ein einzelner Tag-Typ ist, ist nicht Teil eines ID3v1/ID3v2 Tag-Typ, es hat seinen eigenen Eintrag auf dem mp3-Header so ... Ich verstehe nicht, was es bedeutet über die ID3v1/ID3v2 "Abhängigkeit".

vorausgesetzt Anyways, dass Informationen richtig ist, dann sollte ich in der Lage sein TagLibSharp zu verwenden, um die ID3v1 und ID3v2 Tags aus der MP3-Datei die Lyrics3v2 Tag enthält zu entfernen, dann wird das Etikett zu entfernen? Das Tag ist jedoch noch vorhanden.

Auch die Lyrics Eigenschaft, die TagLibSharp ‚s Klassen scheint aussetzt wirkt sich nicht auf die Lyrics3v2 Tag, all dies ist sehr confussing.

+0

Diese Frage wieder geöffnet werden sollte, zunächst einmal meine Frage zu einer bestimmten Bibliothek spezifisch ist, sich nicht auf mp3-Struktur und zweitens habe ich eine funktionierende Lösung mit taglibsharp geschrieben, aber ich kann die Antwort nicht teilen, da meine Frage blockiert ist. Ich möchte die Lösung wirklich veröffentlichen, ein Moderator kann sie danach blockieren. – ElektroStudios

+1

Wenn sie Ihre Frage nicht erneut öffnen, fügen Sie Ihre Arbeitslösung als zweite Antwort der anderen verknüpften Frage hinzu. Ich würde gerne Ihre Lösung sehen! Vielen Dank. – PeterCo

+0

@PeterCo Ich veröffentlichte es: http://StackOverflow.com/Questions/26671210/How-to-Remove-Lyrics3-V2-Tag-from-ID3/36974341#36974341 Ich hoffe, es kann nützlich sein für Sie oder für jemanden sonst. – ElektroStudios

Antwort

2

Ich schrieb diese Lösung mit taglibsharp:

' ************************************************************* 
' THIS CLASS IS PARTIALLY DEFINED FOR THIS STACKOVERFLOW ANSWER 
' ************************************************************* 

Imports System.IO 
Imports System.Text 
Imports TagLib 

''' <summary> 
''' Represents the <c>Lyrics3</c> tag for a MP3 file. 
''' </summary> 
Public Class Lyrics3Tag 

    Protected ReadOnly mp3File As Mpeg.AudioFile 

    ''' <summary> 
    ''' The maximum length for the <c>Lyrics3</c> block to prevent issues like removing a false-positive block of data. 
    ''' <para></para> 
    ''' Note that this is a personal attempt to prevent catastrophes, not based on any official info. 
    ''' </summary> 
    Private ReadOnly maxLength As Integer = 512 ' bytes 

    Private Sub New() 
    End Sub 

    Public Sub New(ByVal mp3File As Mpeg.AudioFile) 
     Me.mp3File = mp3File 
    End Sub 

    ''' <summary> 
    ''' Entirely removes the <c>Lyrics3</c> tag. 
    ''' </summary> 
    <DebuggerStepThrough> 
    Public Overridable Sub Remove() 

     Dim initVector As New ByteVector(Encoding.UTF8.GetBytes("LYRICSBEGIN")) 
     Dim initOffset As Long = Me.mp3File.Find(initVector, startPosition:=0) 

     If (initOffset <> -1) Then 

      ' The Lyrics3 block can end with one of these two markups, so we need to evaluate both. 
      For Each str As String In {"LYRICS200", "LYRICSEND"} 

       Dim endVector As New ByteVector(Encoding.UTF8.GetBytes(str)) 
       Dim endOffset As Long = Me.mp3File.Find(endVector, startPosition:=initOffset) 

       If (endOffset <> -1) Then 

        Dim length As Integer = CInt(endOffset - initOffset) + (str.Length) 
        If (length < Me.maxLength) Then 
         Try 
          Me.mp3File.Seek(initOffset, SeekOrigin.Begin) 
          ' Dim raw As String = Me.mp3File.ReadBlock(length).ToString() 
          Me.mp3File.RemoveBlock(initOffset, length) 
          Exit Sub 

         Catch ex As Exception 
          Throw 

         Finally 
          Me.mp3File.Seek(0, SeekOrigin.Begin) 

         End Try 

        Else ' Length exceeds the max length. 
         ' We can handle it or continue... 
         Continue For 

        End If 

       End If 

      Next str 

     End If 

    End Sub 

End Class 

Beispiel Nutzung:

Dim mp3File As New Taglib.Mpeg.AudioFile("filepath") 

Using lyrics As New Lyrics3Tag(mp3File) 
    lyrics.Remove() 
End Using