2013-05-18 3 views
1

Как изменить поле «Исполнитель альбома» файла MP3 с библиотекой TagLib? Есть ли что-то подобное:taglib: как отредактировать Album Artist?

f.tag()->setArtist("blabla"); 

?

+0

Я не понимаю разницы между TagLib :: FileRef и TagLib :: File. Если я использую TagLib :: FileRef f ("foo.mp3") ;, я не могу использовать f.tag(). RemoveFrames. Если я использую TagLib :: MPEG :: File f ("foo.mp3") ;, я должен иметь возможность использовать f.ID3v2Tag() -> removeFrames. В чем разница между TagLib :: FileRef и TagLib :: File? – Basj

+0

'FileRef' - это просто класс удобства, который обрабатывает экземпляр соответствующего подкласса' TagLib :: File' для формата файла, т. Е. Он будет работать, будь вы бросаете в него и Ogg, FLAC или MP3-файл. Однако нет никакого стандарта для «Album Artist», поэтому вам нужно отказаться от менее общей абстракции, в которую входит «MPEG :: File». – scotchi

ответ

4

ID3v2 фактически не поддерживает поле под названием «художник альбома». ITunes использует кадр TPE2, который, как предполагается,:

TPE2
«Band/Оркестр/Аккомпанемент» кадра используется для получения дополнительной информации о исполнителях в записи.

Полный список фреймов см. http://id3.org/id3v2.3.0#Declared_ID3v2_frames.

Чтобы написать, что с TagLib, это будет делать трюк:

#include <mpegfile.h> 
#include <id3v2tag.h> 
#include <textidentificationframe.h> 

int main() 
{ 
    TagLib::MPEG::File file("foo.mp3"); 
    TagLib::ByteVector handle = "TPE2"; 
    TagLib::String value = "bar"; 
    TagLib::ID3v2::Tag *tag = file.ID3v2Tag(true); 

    if(!tag->frameList(handle).isEmpty()) 
    { 
     tag->frameList(handle).front()->setText(value); 
    } 
    else 
    { 
     TagLib::ID3v2::TextIdentificationFrame *frame = 
      new TagLib::ID3v2::TextIdentificationFrame(handle, TagLib::String::UTF8); 
     tag->addFrame(frame); 
     frame->setText(value); 
    } 

    file.save(); 

    return 0; 
} 

Если вы просто хотите, чтобы удалить кадры, вы можете просто сделать:

TagLib::MPEG::File file("foo.mp3"); 
TagLib::ID3v2::Tag *tag = file.ID3v2Tag(); 

if(tag) 
{ 
    tag->removeFrames("TPE2"); 
    file.save(); 
} 
+0

Большое спасибо. Фактически, я просто хотел удалить поле «Исполнитель альбомов». (извините, мой вопрос не был точным). Есть ли более короткий способ удалить этот тег «Исполнитель альбома»? Лучше ли: a) удалить поле или b) 'setText (" ")'? – Basj

+0

'removeFrames', похоже, не работает с' TagLib :: Tag': http://taglib.github.io/api/classTagLib_1_1Tag.html – Basj

+0

Вам нужно использовать 'TagLib :: ID3v2 :: Tag', как это было в моем примере: http://taglib.github.io/api/classTagLib_1_1ID3v2_1_1Tag.html Кадры в этом случае относятся к тегам ID3v2; они не существуют в базовом классе TagLib :: Tag, так как этот класс используется для форматов * all * тегов. – scotchi