MP3ストリーミングでUTF-16なTAGの文字化けをなおす その2 [linux]
前回ices0での問題点とその対策を行いました。
ですが、これだけではまだ文字化けは直りません。icecast2側も対応が必要です。
それでは早速はじめましょう。
icecast2で必要な処理は、以下の2つです
(1)ices0で別の文字に置き換えた0x00を元に戻す
(2)icecast2でUTF-16(LE)のエンコードを選択できるようにする
前回もちらっと書きましたが、icecast-2.3.2はcharsetの導入により何かしらのエンコードができます
これは、ここに書いてありますが。。(以下、抜粋)
うーん、いまいちよくわからないので(^^;ソースを眺めてみることにします
icecast2のソースを眺めてみると
in_charsetをUTF-8に変換して、さらにUTF-8をout_charsetに変換しているようです
読み出し元は
さらに
となっています。(ふぅ。。)
まとめると、charsetで指定されたartist,title TAGをplugin->charsetに変換しているわけです。
charset(=in_charset)は、httpのキャラクタセットです
plugin->charset(=out_charset)は、icecast.xmlの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での設定方法をご紹介いたします
ですが、これだけではまだ文字化けは直りません。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-mountsetting. 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での設定方法をご紹介いたします
いかがだったでしょうか
コメント 0