2017-09-28 11 views
0

J'essaye de mettre une pochette d'album dans un .mp3 avec TagLib mais j'obtiens une erreur 11 (erreur de seg) et je n'arrive pas à trouver une solution.
Ceci est mon code à ce jour:Taglib définit l'image de l'album mais donne la faute de segmen

TagLib::MPEG::File mp3_file(filename.c_str()); 
TagLib::ID3v2::Tag *mp3_tag; 

mp3_tag = mp3_file.ID3v2Tag(true); 
TagLib::ID3v2::AttachedPictureFrame picture; 
picture.setMimeType("image/jpeg"); 
picture.setDescription("Cover"); 
picture.setType(TagLib::ID3v2::AttachedPictureFrame::FrontCover); 

std::ifstream image(image_path, std::ios::binary | std::ios::ate); 
const auto fileSize = image.tellg(); 
image.seekg(0); 
TagLib::ByteVector image_data((unsigned int) fileSize, 0); 
image.read(image_data.data(), fileSize); 
image.close(); 
picture.setPicture(image_data); 
mp3_tag->addFrame(&picture); 
mp3_file.save(); 

L'image est un .jpg de sorte que le type MIME est correct. Lorsque le code atteint la ligne mp3_tag->addFrame(&picture); il existe avec seg faute, la chose étrange est que l'image est définie sur le fichier .mp3 donc je ne comprends pas ce qui pourrait causer cette erreur.
J'ai essayé de chercher une cause possible en examinant certains codes C# et Ruby en utilisant cette bibliothèque, mais je ne trouve pas de solution qui n'entraîne pas une erreur de segmentation.

Répondre

1

Je n'ai jamais tombé sur TagLib, cependant, la lecture the documentation, les besoins variables TagLib::ID3v2::AttachedPictureFrame picture; à répartir sur un tas, puisque la fonction TagLib::ID3v2::Tag::addFrame(Frame* frame) prendra la propriété pour le cadre, est donc responsable de la libération de la mémoire.
La segfault se produit car il essaie de libérer la mémoire (variable picture) allouée sur une pile.

Qu'est-ce que vous voulez sans doute est quelque chose comme:

[...] 
std::ifstream image(image_path, std::ios::binary | std::ios::ate); 
const auto fileSize = image.tellg(); 
image.seekg(0); 
TagLib::ByteVector image_data((unsigned int) fileSize, 0); 
image.read(image_data.data(), fileSize); 
image.close(); 

TagLib::ID3v2::AttachedPictureFrame* picture = new TagLib::ID3v2::AttachedPictureFrame(image_data); 
mp3_tag->addFrame(&picture); 
mp3_file.save(); 
[...] 
+0

marquer votre réponse correcte, qui était le principal problème de ma mise en œuvre tout en laissant tout le monde qui pourrait venir sur cette question savent que, après '' 'image.close(); '' 'pour définir correctement l'image, il est nécessaire de faire' '' auto * image = new TagLib :: ID3v2 :: AttachedPictureFrame(); '' 'puis définissez le type MIME, la description et le type comme je l'ai fait dans la question d'origine et enfin utiliser '' 'picture-> setPicture (image_data);' '' et '' 'mp3_tag-> addFrame (image);' '' pour définir l'image dans le fichier mp3. –

+0

@JohnSmith Cool, content que ça a aidé! – ProXicT