我正在尝试使用TagLib在.mp3中设置专辑封面,但我收到错误11(seg fault),我似乎无法找到解决方案。
到目前为止,这是我的代码:
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();
图片为.jpg,因此MIME类型正确无误。
当代码到达行mp3_tag->addFrame(&picture);
时,它存在seg错误,奇怪的是图像被设置为.mp3文件,因此我不明白可能导致此错误的原因。
我试图通过使用这个库查看一些C#和Ruby代码来寻找可能的原因,但我找不到不会导致分段错误的解决方案。
答案 0 :(得分:1)
我从未遇到过TagLib,但是,阅读the documentation,TagLib::ID3v2::AttachedPictureFrame picture;
变量需要在堆上分配,因为TagLib::ID3v2::Tag::addFrame(Frame* frame)
函数将取得框架的所有权,因此负责释放记忆
发生segfault是因为它试图释放堆栈上分配的内存(picture
变量)。
你可能想要的是:
[...]
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();
[...]