首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TagLib未保存ID3标记

TagLib未保存ID3标记
EN

Stack Overflow用户
提问于 2013-06-09 15:10:05
回答 1查看 490关注 0票数 1

在Mac上使用AIFF1.8和Qt 5.0.1,我正在尝试为TagLib文件创建一组新的ID3标签。该文件没有任何开头的标记。下面是我的代码:

代码语言:javascript
复制
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;

tag变量是我的代码中保存元数据的对象。如果FileRef从其tag()函数返回一个TagUnion,则concreteTag()将返回一个“适当的”标记对象。我已经验证了tag中的数据是好的。

processID3将写入不属于TagLib在TagLib::Tag对象上支持的“基本”字段的元数据:

代码语言:javascript
复制
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()));
        }

最后,addId3TextFrame看起来像这样(我没有图像,所以永远不会调用addID3Images() ):

代码语言:javascript
复制
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));
        }
}

我的元数据(对于我当前的测试文件)包括专辑Artist、曲目、流派和年份。目前,我正在使用ID3v2Frame::createTextualFrame(),但我尝试使用正确的ID3框架ID3 (TRCK、TCON等)手动创建文本框架。

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

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

你知道我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-09 20:17:26

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

有趣的是,使用libstdc++6的TagLib代码只能够读取我的libc++代码生成的第一个迭代器,而不是以令人震惊的明显方式死亡(崩溃或其他)。此外,libstdc++6中那个迭代器上的operator++并没有崩溃,而是返回了end()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17007298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档