ARIB外字をVLCで表示するには

はじめに

VLCARIB外字の字幕を表示する方法

ろくに規格を見ずにソースコードと振る舞いの確認のみで終わらせてしまったので間違った情報かもしれません、まったく精査してません

tl;dr

drcs_conv.ini を育てる必要がある

nkoriyama/aribb24

詳細

VLCで撮り溜めたm2tsを見るとたまに次のようなものを見ることがある

f:id:naari_3:20201225024350p:plain

例では薩摩の という字が に置き換えられている

これは外字置換という事象が発生している

ARIB外字とは

ja.wikipedia.org

ひらたく言うと、放送データに添付される字幕データにはたまにShift_JISの範囲外になるような規格の文字も含まれている そのような字のことをARIB外字と呼ぶ
(ARIB外字制定後一部はShift_JISの範疇になったらしいが、それ以外については)同時にフォントのデータも送信される これはARIB STD-B24という規格によって定められた方法で送られるらしい
基本的にはJIS X 0208に収録されいてない文字が対象になっており、先程例としてあげた もその対象になっている

外字置換とは

外字置換とは、上記のデータが受信できなかった/送信されなかった/使用されなかった場合に代替として使われる文字に置換されることで、上で上げた例のようによく下駄文字が使われる

VLCでのARIB外字の扱い方をしらべる

例で上げた通りだが、そのまま表示するだけでは下駄になってしまう

検索すると出てくる情報

この件について検索すると https://github.com/nkoriyama/vlc-aribsub パッチをあてたVLCついての話が出てくる
特別な対応を当てる必要があることの記述があるが、結果としては確認せずスキップで良さそうだった

それ以外にもおすすめのフォントについての記述があるので、それだけは見ても良さそうに思う(がこれでは解決しなさそう) VLCでARIB字幕を見る · GitHub

また、このページで紹介されているパッチやビルドがskydriveの消滅とともにリンク切れになっており内容を推測する他ないのだが、nkoriyama/aribb24というARIB STD-B24を扱うライブラリを使うパッチなのではないかと思っている

根拠として、vlc-aribsubの説明はほとんどnkoriyama/aribb24の動作と同じであることが挙げられる

であるならば、パッチがあてられたVLCを使用している前提でvlc-aribsubのREADME.mdに従うことでARIB外字を扱うことができるのではないかと推測した

実際に解決できた方法

実は最新版(少なくとも3.0.11)のVLCではnkoriyama/aribb24を使用するパッチは既にマージされていて、残りは単に所定のディレクトリにしかるべきファイルを置くだけで動作する

このあたり参照 https://github.com/videolan/vlc/blob/95e01f73802460ec2374894cdb769888e23b108d/contrib/src/aribb24/rules.mak

aribb24のbasedirを指定している箇所 https://github.com/videolan/vlc/blob/95e01f73802460ec2374894cdb769888e23b108d/modules/codec/arib/aribsub.c#L134

aribb24に使用するbasedirを指定する箇所 https://github.com/videolan/vlc/blob/95e01f73802460ec2374894cdb769888e23b108d/modules/codec/arib/aribsub.c#L200

実際にそのようにしてみる

%APPDATA%\vlc\arib を確認してみると、既に data ディレクトリが存在している
中身を確認すると、次のような画像が存在していた

f:id:naari_3:20201225034248p:plain
b1d62062d089551469efaeb94466263e.png
これは https://github.com/nkoriyama/vlc-aribsub の説明どおりで、受信したビットマップのデータは保存するが、特に使用されることはない

一部外字については、ビットマップデータ自体がDRCS外字として伝送されます。 このデータを直接画面に表示することもできなくはないのですが、現状は既存の文字に置換して表示するようにしています。

(実装としてはこのあたり https://github.com/nkoriyama/aribb24/blob/5e9be272f96e00f15a2f3c5f8ba7e124862aec38/src/drcs.c )

そのため、ここで受信したような文字について、(おそらく)手動でマッピングをする必要がある

そのファイルが drcs_conv.ini となる

drcs_conv.init の記述方法

単純で、先程の保存されたビットマップのファイル名( b1d62062d089551469efaeb94466263e.pngb1d62062d089551469efaeb94466263 部分)と、それに対応するUnicode文字を記述すれば良い

https://github.com/nkoriyama/vlc-aribsub/blob/master/drcs_conv.ini が参考として優秀だったが、以下に具体的な追加例を示してみる

例えば次の通り

; ここ以上は https://github.com/nkoriyama/vlc-aribsub/blob/master/drcs_conv.ini そのままか何もなしの状態
; 薩
b1d62062d089551469efaeb94466263e=U+85A9

このようなファイルを次のパスに置いてからVLCを起動する

%APPDATA%\vlc\arib\drcs_conv.ini

すると、実際に表示される字幕も次のようになる

f:id:naari_3:20201225035025p:plain

また、このマッピングは好きな文字を割り当てることが出来るので、ミスったりすると次のような感じになる

f:id:naari_3:20201225035134p:plain
パソ摩

これで一旦対応されていないAIRB外字のマッピングに成功できた

基本的には下駄文字が表示されたときに %APPDATA%\vlc\arib\data を確認し、追加された画像を参考に置き換える文字を探せばよいのだともう

疑問

これ、インターネットの集合知を利用して更新された健全な drcs_conv.ini があれば良いと思うのですが、無いのでしょうか?

個人同士で管理するのはちょっと馬鹿げていると思います