Возникли проблемы при написании ArtWork с Taglib-sharp 2.0.4.0 в.Net

У меня проблемы с записью обложек в формате MP3. Я могу читать и отображать все изображения в файле MP3, используя Taglib-sharp, но когда дело доходит до вставки более 1 изображения (например, FrontCover и BackCover) в тег MP3, у меня возникают проблемы с этим.Если это всего лишь одно произведение искусства... я могу это сделать. Может, кто-нибудь скинет мне кости и покажет, как это сделать? (vb.net было бы здорово, но C# тоже справился).

Еще один запрос... и удаление изображения внутри тега mp3?? Может кто-нибудь, пожалуйста, дайте мне пример, как это сделать тоже.

Спасибо за вашу помощь

4 ответа

Я столкнулся с той же проблемой, что и Бобби Бхамра. Я обнаружил, что iTunes ненавидит UTF-16, и вот в чем проблема.

targetMp3File = TagLib.File.Create(...);

// define picture
TagLib.Id3v2.AttachedPictureFrame pic = new TagLib.Id3v2.AttachedPictureFrame();
pic.TextEncoding = TagLib.StringType.Latin1;
pic.MimeType     = System.Net.Mime.MediaTypeNames.Image.Jpeg;
pic.Type         = TagLib.PictureType.FrontCover;
pic.Data         = TagLib.ByteVector.FromPath(...);

// save picture to file
targetMp3File.Tag.Pictures = new TagLib.IPicture[1] { pic };    
targetMp3File.Save();

Так что, по сути, все дело в pic.TextEncoding линия. Кроме того, я назначил Mime Type через константу.NET.

В результате нет необходимости TagLib.PictureType.Other или обходной путь, используя описание. Единственным недостатком моего решения является то, что оно будет корректно работать только для файлов MP3.

Как вы вставляете и удаляете изображения? Можете ли вы опубликовать код?

Все теги работают с использованием интерфейса IPicture, а также методов получения и установки тегов Tag.Pictures. Изменение содержимого массива Tag.Pictures не повлияет на файл, поэтому изменение существующего списка включает получение текущего значения, манипулирование им, а затем его установку обратно. Просто установить или очистить картинку проще.

Вы можете установить файл, чтобы иметь одно изображение с:

IPicture pictures = new IPicture[1];
pictures[0] = new Picture("path/to/picture.jpg");
file.Tag.Pictures = pictures;

Вы можете удалить все изображения из тега с помощью следующего:

file.Tag.Pictures = new IPicture[0];
file.Save();

Манипулирование или более сложный, но следует тем же направлениям мышления. Было бы лучше, если бы Tag.Pictures был IEnumerable вместо массива, но что сделано, то сделано.

Вот пример программы, которая устанавливает изображения из аргументов командной строки: https://github.com/mono/taglib-sharp/blob/master/examples/SetPictures.cs

Я использую Taglib версии 2.1.0.0 и на данный момент нет документации для этой версии. Поэтому мне пришлось приехать сюда, чтобы найти ответы на все вопросы, чтобы найти что-то, что действительно работает с этой версией, и это то, что я придумал...

Private Sub SetTags()
    Me.Cursor = Cursors.WaitCursor

    'Set the version and force it.
    TagLib.Id3v2.Tag.DefaultVersion = 3
    TagLib.Id3v2.Tag.ForceDefaultVersion = True

    'Set all standard tags.
    strInput = Trim(txtMP3Input.Text)
    strTitle = Trim(txtTitle.Text)
    strArtist = Trim(txtArtist.Text)
    strAlbumArtist = Trim(txtAlbumArtist.Text)
    strAlbum = Trim(txtAlbum.Text)
    intYear = Convert.ToInt32(Val(cmbDate.SelectedItem))
    strGenre = cmbGenre.SelectedItem
    strComments = Trim(txtComment.Text)
    strArt = Trim(txtAlbumArt.Text)

    'Create a file (mp3)
    Dim fName As TagLib.File = TagLib.File.Create(strInput)

    'Set the Album art.
    Dim pics As Picture = New Picture(strArt)

    'Insert the standard tags.
    fName.Tag.Title = strTitle
    fName.Tag.Performers = New String() {strArtist}
    fName.Tag.AlbumArtists = New String() {strAlbumArtist}
    fName.Tag.Album = strAlbum
    fName.Tag.Year = intYear
    fName.Tag.Genres = New String() {strGenre}
    fName.Tag.Comment = strComments

    'Insert Album art and
    ' save to file and dispose.
    Dim picsFrame As New TagLib.Id3v2.AttachedPictureFrame(pics)
    picsFrame.MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg

    'set the type of picture (front cover)
    picsFrame.Type = TagLib.PictureType.FrontCover

    'Id3v2 allows more than one type of image, just one is needed here.
    Dim pictFrames() As TagLib.IPicture = {picsFrame}

    'set the pictures in the tag
    fName.Tag.Pictures = pictFrames

    fName.Save()
    fName.Dispose()

    Me.Cursor = Cursors.Default
    lblSuccess.Text = "Tags Set Successfully."
End Sub

Я установил эту версию с помощью Visual Studio 2012 и использовал пункты меню Инструменты-> Диспетчер пакетов библиотеки-> Консоль диспетчера пакетов. В приглашении "PM>" введите "Install-Package taglib". Это добавит пакет Taglib-Sharp в ваше приложение. На самом деле это утилита командной строки для Power Shell. Подождите несколько секунд, и вы готовы к работе.

Я использую следующий taglib-sharp код в своем приложении для тегирования MP3. Без установки "mime" и "type" я не смог отобразить иллюстрацию в ITunes и впоследствии на моем Ipod, хотя Windows/WMP правильно отображал его.

TagLib.File targetFileMp3Tag = TagLib.File.Create(...);

Picture picture = new Picture();
picture.Type = PictureType.Other;
picture.MimeType = "image/jpeg";
picture.Description = "Cover";        
picture.Data = ByteVector.FromStream(...);

targetFileMp3Tag.Tag.Pictures = new IPicture[1] { picture };
targetFileMp3Tag.save()

НТН

Другие вопросы по тегам