SSブログ

MP3ストリーミングでUTF-16なTAGの文字化けをなおす その2 [linux]

前回ices0での問題点とその対策を行いました。
ですが、これだけではまだ文字化けは直りません。icecast2側も対応が必要です。
それでは早速はじめましょう。

本手法は環境によっては対応できないかもしれません。
試される方はあくまでも自己責任でお願いします。


icecast2で必要な処理は、以下の2つです

(1)ices0で別の文字に置き換えた0x00を元に戻す
(2)icecast2でUTF-16(LE)のエンコードを選択できるようにする

前回もちらっと書きましたが、icecast-2.3.2はcharsetの導入により何かしらのエンコードができます
これは、ここに書いてありますが。。(以下、抜粋)
•Character set support. Most non-Ogg streams (eg MP3) send metadata as Latin1 but it could be in other character 

sets. As icecast uses UTF-8, we need to convert to UTF-8 so that web pages and stream directories render correctly.

◦Allow a per-mount  setting. For when source clients do not indicate which character set is in use. 
◦a charset= parameter to the metadata request. 
◦Default for non-Ogg content is now Latin-1 (aka ISO-8859-1). Ogg content still uses UTF-8.

うーん、いまいちよくわからないので(^^;ソースを眺めてみることにします

icecast2のソースを眺めてみると
util.c
char *util_conv_string (const char *string, const char *in_charset, const char *out_charset)
{
                  :
        INFO2 ("converting metadata from %s to %s", in_charset, out_charset);
        xmlBufferCCat (orig, string);
        if (xmlCharEncInFunc (in, utf8, orig) > 0)
        {
            xmlCharEncOutFunc (out, conv, NULL);
            if (xmlCharEncOutFunc (out, conv, utf8) >= 0)
                ret = strdup ((const char *)xmlBufferContent (conv));
        }
                  :
なる記述を見つけました
in_charsetをUTF-8に変換して、さらにUTF-8をout_charsetに変換しているようです
読み出し元はformat_mp3.c
static void mp3_set_tag (format_plugin_t *plugin, const char *tag, const char *in_value, const char *charset)
{
            :
    value = util_conv_string (in_value, charset, plugin->charset);
            :

さらにadmin.c
       plugin->set_tag (plugin, "title", title, charset);
       plugin->set_tag (plugin, "artist", artist, charset);
       INFO3("Metadata on mountpoint %s changed to \"%s - %s\"",
                        source->mount, artist, title);

となっています。(ふぅ。。)
まとめると、charsetで指定されたartist,title TAGをplugin->charsetに変換しているわけです。

charset(=in_charset)は、httpのキャラクタセットです
plugin->charset(=out_charset)は、icecast.xmlのmountオプションに、
  <mount>
      :
    <charset>Shift_JIS</charset>
      :
  </mount>

のように指定することで設定されます。(注:オプションの詳細についてはここでは説明しません。)

なんの記述もない場合のplugin->charsetはISO8859-1になります。
ここまで判れば、対応は比較的簡単です。
以下の方針でソースを修正することにしました。
(1)isecast.xmlで in_charset,out_charsetを指定する
(2)mp3_tag_setで上記、in_charset,out_charsetが反映されるように修正
(3)util_conv_stringでices0で別の文字に置き換えた0x00を元に戻す
(4)util_conv_stringでUTF-16(LE)が正しくデコードできるように修正

いつものように上記方針に従って修正した内容でパッチファイルを作成しました



今回まででices0,icecast2とも修正ができました。
次回はいままで作成したパッチの当て方と、icecast.xmlでの設定方法をご紹介いたします

いかがだったでしょうか


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

MP3ストリーミングでUTF-16なTA..|- ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。