[[diary/Kojima]]

・LinuxでのBluray Disc再生の現状(その2)

試行錯誤していたので、ずいぶん間が空いちゃったけど、とりあえず「その2」。

前回紹介したように、MakeMKVを使えば Linux 上でも
AACSで暗号化されたBDディスクのデータをmkv形式に変換できるものの、
やはり一々mkv形式に変換しなければいけないというのは面倒なので、
もう少しなんとかならないかと、libbluray + libaacs を試してみた。

[[libbluray:https://www.videolan.org/developers/libbluray.html]]と
[[libaacs:https://www.videolan.org/developers/libaacs.html]]は
VLCを公開しているVideoLanプロジェクトが開発しているライブラリで、
libblurayがBDディスクの構造解析、libaacsがAACS暗号を解読する機能を担っているらしい。

両者とも開発版のコードはgitで提供されているようなので、
まずはlibblurayのコードをgit cloneで持ってきてビルドしようとしたところ、
"Apache Ant"というJava用のビルドシステムが無い、旨のエラーになる。

じゃあ、"Apache Ant"を入れるか、、と試したら、Javaの開発環境が必要、ということで、
結局 OpenJDK が公開しているJava開発環境を入れた上でApache Antをインストールし、
ようやくlibblurayがビルドできた。

libblurayのコード自体はC++みたいなのに、なんでJavaな開発環境が必要なんだろ、、と調べたところ、
どうやらBDには対話的なメニューやゲーム等を提供する機能があって、
その部分がJavaになっているので、BD対応用のライブラリであるlibblurayもJavaに対応する必要があるらしい。

libaacsはKEYDB.cfgというキーファイルが必要ということで、それもダウンロードしておく。
KEYDB.cfgはprocessing keyとHost certificate、disc VUK keyという3種のデータが並んだ、
かなり大きなファイル。詳しくは調べてないけど、processing keyとHost certificateが公開
鍵と秘密鍵みたいなものなもので、これらがきちんと機能すれば全てのBD discを読めるものの、
漏洩した鍵は定期的に無効にされるため、disc VUK keyというBD discごとのIDも用意しておく
必要があるらしい。

libblurayに付属の bd_info というコマンドで、BDの情報を確認してみるとこんな感じ。

 $ bd_info /dev/sr1
 Using libbluray version 1.0.2
 aacs.c:546: Error calculating media key. Missing right processing key ?
 Volume Identifier   : GUP_TV_AND_OVA_51CH_BDBOX_D1
 BluRay detected     : yes
 First Play supported: yes
 Top menu supported  : yes
 HDMV titles         : 6
 BD-J titles         : 0
 UNSUPPORTED titles  : 0
 
 BD-J detected       : no
 
 AACS detected       : yes
 libaacs detected    : yes
 Disc ID             : 3CA717B91B1FEB9EB36AF86FB92730B8EDDDA653
 AACS MKB version    : 65
 AACS handled        : yes
 
 BD+ detected        : no
 
 Application info:
   initial mode preference : 2D
   3D content exists       : No
   video format            : ignored (0x0)
   frame rate              : ignored (0x0)
   provider data           : '                                '
 
 Disc library metadata:
 Metadata file       : bdmt_jpn.xml
 Language            : jpn
 Disc name           : ガールズ&パンツァー TV&OVA 5.1ch Blu-ray Disc BOX 1
 Alternative         : <undefined>
 Disc #              : <undefined>/<undefined>
 TOC count           : 0
 Thumbnail count     : 2
 	./GuP_51ch_BOX_META_S.jpg 	416x240
 	./GuP_51ch_BOX_META_L.jpg 	640x360

一応、内容は認識できている感じ。

こうして用意したlibblurayとlibaacsを組み込むように、
vlc-3.0.3とmpv-0.29.1をビルドしてみた。

試行錯誤の過程は省いて結論だけ述べると、
vlcでは[メディア]=>[ディスク]=>[ブルーレイ]/[ディスクデバイス]を指定してやると、
しばらくBDを読み込んでなにやらやっているものの、
タイトルロゴしか表示できなかった。

#ref("vlc_BD.jpg")

[ツール]=>[メッセージ]で出力レベルを「デバッグ」にしたら、こんな感じのログが取れた。

 main debug: incoming request - stopping current input
 main debug: removing module "libbluray"
 libbluray info: Closing overlays.
 main debug: dead input
 main debug: processing request item: bluray:///dev/sr1, node: プレイリスト, skip: 0
 main debug: rebuilding array of current - root プレイリスト
 main debug: rebuild done - 2 items, index 1
 main debug: starting playback of new item
 main debug: resyncing on bluray:///dev/sr1
 main debug: bluray:///dev/sr1 is at 1
 main debug: creating new input thread
 main debug: Creating an input for 'bluray:///dev/sr1'
 main debug: requesting art for new input thread
 main debug: looking for meta fetcher module matching "any": 1 candidates
 lua debug: Trying Lua scripts in /home/kojima/.local/share/vlc/lua/meta/fetcher
 lua debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/fetcher
 lua debug: Trying Lua scripts in /usr/share/vlc/lua/meta/fetcher
 main debug: no meta fetcher modules matched
 main debug: looking for art finder module matching "any": 2 candidates
 lua debug: Trying Lua scripts in /home/kojima/.local/share/vlc/lua/meta/art
 lua debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/art
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
 lua debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/01_googleimage.luac
 lua debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/01_googleimage.luac
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
 lua debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/03_lastfm.luac
 lua debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/03_lastfm.luac
 lua debug: Trying Lua scripts in /usr/share/vlc/lua/meta/art
 main debug: no art finder modules matched
 main debug: looking for meta fetcher module matching "any": 1 candidates
 lua debug: Trying Lua scripts in /home/kojima/.local/share/vlc/lua/meta/fetcher
 lua debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/fetcher
 lua debug: Trying Lua scripts in /usr/share/vlc/lua/meta/fetcher
 main debug: no meta fetcher modules matched
 main debug: looking for art finder module matching "any": 2 candidates
 lua debug: Trying Lua scripts in /home/kojima/.local/share/vlc/lua/meta/art
 lua debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/art
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
 main debug: using timeshift granularity of 50 MiB
 main debug: using default timeshift path
 main debug: `bluray:///dev/sr1' gives access `bluray' demux `any' path `/dev/sr1'
 main debug: creating demux: access='bluray' demux='any' location='/dev/sr1' file='/dev/sr1'
 main debug: looking for access_demux module matching "bluray": 15 candidates
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/01_googleimage.luac
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/03_lastfm.luac
 lua debug: Trying Lua scripts in /usr/share/vlc/lua/meta/art
 main debug: no art finder modules matched
 qt debug: IM: Deleting the input
 qt debug: IM: Setting an input
 qt debug: IM: Deleting the input
 qt debug: IM: Setting an input
 libbluray info: First play: 1, Top menu: 1 HDMV Titles: 6, BD-J Titles: 0, Other: 0
 libbluray debug: Disc is using AACS
 libbluray debug: Selecting Title 0
 main debug: using access_demux module "libbluray"
 main debug: creating demux: access='' demux='ts' location='' file='(null)'
 main debug: looking for demux module matching "ts": 48 candidates
 main debug: no demux modules matched
 main debug: attempt to destroy nonexistent variable "title 0"
 main debug: attempt to destroy nonexistent variable "title 1"
 main debug: attempt to destroy nonexistent variable "title 2"
 main debug: attempt to destroy nonexistent variable "title 3"
 main debug: attempt to destroy nonexistent variable "title 4"
 main debug: attempt to destroy nonexistent variable "title 5"
 main debug: looking for meta reader module matching "any": 2 candidates
 lua debug: Trying Lua scripts in /home/kojima/.local/share/vlc/lua/meta/reader
 lua debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/reader
 lua debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/reader/filename.luac
 lua debug: Trying Lua scripts in /usr/share/vlc/lua/meta/reader
 main debug: no meta reader modules matched
 main debug: `bluray:///dev/sr1' successfully opened
 main debug: creating demux: access='' demux='ts' location='' file='(null)'
 main debug: looking for demux module matching "ts": 48 candidates
 main debug: no demux modules matched

イマイチこのログをどう読むのかは分かってないのだけれど、
libblurayが対象のBDをAACS使用と認識し、
AACSをデコードするためのdemuxを探したものの "no demux modules matched"で再生できなかった、
って感じかな。

一方、mpvとそれをバックエンドにしているsmplayerでは、
メニューの[ディスクを開く]からでは再生できなかったものの、
起動時の引数として直接 "bd:////dev/sr1" みたいな URL を指定してやれば再生できた。

#ref("smplayer_BD.jpg")

URLの指定方法は bd://[track_no]//[device_name] みたいな感じで、
再生したいトラック番号が分かっていれば直接それを指定できるし、
track_noを指定しなければディスクの頭から再生するらしい。
手元ではBDドライブは/dev/sr1にしているので、
最初から再生する場合は "smplayer bd:////dev/sr1" という形になる模様。

UIの無いmpvでは確認できなかったけど、smplayerならば字幕の有無とか、
オーディオコメンタリーなトラックの選択もできたので、
メニューが無いことを除けば、とりあえず再生はできてる感じ。

#ref("smplayer_BD2.jpg")

「やったー、OSSなソフトだけでBDが再生できた!!」と喜んだのも束の間、
大きな落とし穴が待ち構えていたのであった。。([[続く:http://plamo.linet.gr.jp/index.html/index.php?diary%2FKojima%2F2019-02-17]])
大きな落とし穴が待ち構えていたのであった。。([[続く:http://plamo.linet.gr.jp/index.html/index.php?diary%2FKojima%2F2019-02-18]])

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS