簡體   English   中英

Taglib設置專輯圖片但出現段錯誤

[英]Taglib sets album picture but gives seg fault

我正在嘗試使用TagLib在.mp3中設置專輯封面,但出現錯誤11(段錯誤),我似乎找不到解決方案。
到目前為止,這是我的代碼:

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); 它存在段錯誤,奇怪的是,圖像被設置為.mp3文件,所以我不明白是什么原因導致此錯誤。
我也嘗試通過使用該庫查看一些C#和Ruby代碼來尋找可能的原因,但我找不到不會導致分段錯誤的解決方案。

我從沒碰過TagLib,但是,閱讀文檔 TagLib::ID3v2::AttachedPictureFrame picture; 變量需要在堆上分配,因為TagLib::ID3v2::Tag::addFrame(Frame* frame)函數將獲得該幀的所有權,因此負責釋放內存。
發生段錯誤是因為它試圖釋放分配在堆棧上的內存( 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();
[...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM