Quantcast
Channel: プログラミング雑記
Viewing all articles
Browse latest Browse all 70

TagLibでwavファイルのタグを設定する方法

$
0
0

TagLibでmp3のタグ編集アプリを作りつつ、ついでにwavのタグ設定の試してみました。

mp3で文字化けに悩まされたましたが、wavでもやはり発生しました。

wavの場合の問題は、WindowsはwavのタグをShift-JISで読み書きするのに対し、TagLibはUTF8で読み書きすることです。

TagLibはファイルから読み込んだバイト列をByteVectorオブジェクトに格納し、これをStringで読み出すAPIでStringにしています。

なので、そのAPIを介さずに、TagLibが保持しているバイト列をShift-JIS EncodingでString化し、Saveする前にバイト列を直接セットすれば文字化けを回避できます。

TagFileを作るときはファイルの種類を意識する必要はありません。

TagLib.File TagFile = TagLib.File.Create(FilePath);

TagFileからTagを取得するときは、TagLib.TagTypes.RiffInfoを使います。

TagLib.Riff.InfoTag tag = TagFile.GetTag(TagLib.Riff.InfoTag, true);

次の要領でShift-JIS Endodingでバイト列をString化します。

Encoding SjisEnc = System.Text.Encoding.GetEncoding("shift-jis");

String GetStringFromSjisPropery(TagLib.Riff.InfoTag tag, TagLib.ByteVector id)
{
    TagLib.ByteVectorCollection vals = tag.GetValues(id);
    foreach (TagLib.ByteVector v in vals)
    {
        byte[] b = v.Data;
        if (b.Length > 0)
        {
            return SjisEnc.GetString(b);
        }
    }
    return null;
}

Artist, Album, Titleのidは次のようになります。

ByteVector idArtist = new ByteVector(Encoding.ASCII.GetBytes("IART"));
ByteVector idAlbum = new ByteVector(Encoding.ASCII.GetBytes("IPRD"));
ByteVector idTitle = new ByteVector(Encoding.ASCII.GetBytes("INAM"));

出力時は、save直前にShift-JISでバイト列化したByteVectorを当該項目にセットしてやります。

ByteVector ToByteVector(ByteVector id, String str)
{
    return new ByteVector(SjisEnc.GetBytes(str+ ""));
}

なぜか文字化けるので、strにスペースを一文字足してからバイト列化しています。
StringをByteVectorにしたものを、次の要領でtagにセットします。

((TagLib.Riff.InfoTag)tag).SetValue(id, ToByteVector(id, str));

uintのTrackなど、String以外の項目はTagLibのAPIで直接操作できます。

Windows内だけ利用する場合は、これでOKでしょう。他のOS環境や、アプリによっては文字化けるかもしれません。

-------

ついでながら、TagLibは様々なフォーマットに対応しています。
wma、m4a(aac)を試したところ、これらはutf8で問題ないようで、基本的にmp3と同じ要領で読み書きできます。

TagFile.GetTag(TagLib.TagTypes)の引数に使う定数は次のようになります。

wma: TagLib.TagTypes.Asf
m4a: TagLib.TagTypes.Apple




Viewing all articles
Browse latest Browse all 70

Trending Articles