Macos TagLib未保存ID3标记

Macos TagLib未保存ID3标记,macos,taglib,Macos,Taglib,在MacOSX上使用带有Qt5.0.1的TagLib 1.8,我试图为AIFF文件创建一组新的ID3标记。该文件没有任何标记开始。这是我的密码: TagLib::Tag *t = concreteTag(); assert(tag); if (t) { auto id3Tag = dynamic_cast<TagLib::ID3v2::Tag *>(t); t -> setTitle(QStringToTagLib(tag -> ti

在MacOSX上使用带有Qt5.0.1的TagLib 1.8,我试图为AIFF文件创建一组新的ID3标记。该文件没有任何标记开始。这是我的密码:

TagLib::Tag *t = concreteTag();

assert(tag);

if (t) {
        auto id3Tag = dynamic_cast<TagLib::ID3v2::Tag *>(t);

        t -> setTitle(QStringToTagLib(tag -> title()));
        t -> setAlbum(QStringToTagLib(tag -> album()));
        t -> setComment(QStringToTagLib(tag -> comment()));
        t -> setYear(tag -> year());

        if (id3Tag)
                processID3(id3Tag, tag);

        return m_file.save();
}   

return false;
最后,addId3TextFrame看起来是这样的(我没有图像,因此从不调用
addID3Images()
):

我的元数据包括(对于我当前的测试文件)专辑艺术家、曲目、流派和年份。目前我使用的是
ID3v2Frame::createTextualFrame()
,但我已经尝试使用正确的ID3帧ID(TRCK、TCON等)手动创建文本帧

这是我的问题。TagLib正在保存一个ID3 v2.4标记,该标记只包含1个字段-我设置的最后一个字段。如果我对代码进行相应的重新排序,我可以使其正确设置任何专辑艺术家、曲目、流派或年份,但它将只保存一个字段

在完整的代码中,我有一个函数processMP4,它与processID3非常相似。对于MP4文件,所有标记都已正确保存。这让我相信我的方法是正确的


你知道我做错了什么吗?

原来这是由于编译设置造成的。默认情况下,OSX上的CMake将链接到标准库的较旧GNU libstdc++6实现。我的项目正在使用新的C++11 libc++实现

有趣的是,使用libstdc++6的TagLib代码能够读取libc++代码生成的第一个迭代器。此外,libstdc++6中该迭代器上的运算符++没有崩溃,而是返回end()

processID3(TagLib::ID3v2::Tag *dst, TagSP src) const {
        addID3Images(dst, src -> albumArt());
        addId3TextFrame(dst, "ALBUMARTIST", src -> albumArtist());
        addId3TextFrame(dst, "ARTIST", src -> artists());
        addId3TextFrame(dst, "GENRE", src -> genres());
        addId3TextFrame(dst, "COMPOSER", src -> composers());

        if (src -> track() > 0) {
                if (src -> totalTracks() > 0)
                        addId3TextFrame(dst, "TRACKNUMBER", QString(src -> track()) + "/" + src -> totalTracks());
                else
                        addId3TextFrame(dst, "TRACKNUMBER", QString(src -> track()));
        }

        if (src -> disc() > 0) {
                if (src -> totalDiscs() > 0)
                        addId3TextFrame(dst, "DISCNUMBER", QString(src -> disc()) + "/" + src -> totalDiscs());
                else
                        addId3TextFrame(dst, "DISCNUMBER", QString(src -> disc()));
        }
void addId3TextFrame(TagLib::ID3v2::Tag *tag, const char *type, const QStringList& value) {
        if (!value.isEmpty()) {
                TagLib::StringList sl;

                for (auto it = value.begin(); it != value.end(); it++) {
                        if (!it -> isEmpty())
                        sl.append(QStringToTagLibID3(*it));
                }

                tag -> removeFrames(type);
                tag -> addFrame(TagLib::ID3v2::Frame::createTextualFrame(type, sl));
        }
}