1

Mac OSX 上の Qt 5.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;

変数は、メタデータを保持するコードのtagオブジェクトです。がその関数から を返すconcreteTag()場合、 は「適切な」タグ オブジェクトを返します。のデータが良好であることを確認しました。FileRefTagUniontag()tag

processID3TagLib がTagLib::Tagオブジェクトでサポートする「基本」フィールドの一部ではないメタデータを書き込みます。

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()呼び出されることはありません)。

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));
        }
}

私のメタデータは、(現在のテスト ファイルの場合) アルバム アーティスト、トラック、ジャンル、および年で構成されています。現時点では使用してID3v2Frame::createTextualFrame()いますが、正しい ID3 フレーム ID (TRCK、TCON など) を使用して手動でテキスト フレームを作成しようとしました。

これが私の問題です。TagLib は、1 つのフィールド (最後に設定したフィールド) のみを含む ID3 v2.4 タグを保存しています。それに応じてコードを並べ替えると、アルバム アーティスト、トラック、ジャンル、または年のいずれかを正しく設定できますが、1 つのフィールドしか保存されません。

完全なコードには、processID3 と非常によく似た関数 processMP4 があります。MP4 ファイルの場合、すべてのタグが正しく保存されます。これにより、私のアプローチが健全であると確信できます。

私が間違っていることはありますか?

4

1 に答える 1

0

これはコンパイル設定が原因であることが判明しました。デフォルトでは、OSX 上の CMake は標準ライブラリの古い GNU libstdc++6 実装にリンクします。私のプロジェクトは、新しい C++11 libc++ 実装を使用しています。

興味深いのは、驚くほど明白な方法 (クラッシュなど) で死ぬのではなく、libstdc++6 を使用する TagLib コードは、私の libc++ コードによって生成された最初の反復子のみを読み取ることができたことです。さらに、libstdc++6 ランドのその反復子の operator++ はクラッシュせず、代わりに end() を返しました。

于 2013-06-09T12:17:26.367 に答える