Linux で 4K Ultra HD Blu-ray を再生したかった

はじめに

結論から言うと,4K UHD BD は私の環境 (CentOS7) では再生出来なかった.

まぁなんとかなるかと思って衝動的な物欲に負けて珍しく円盤を買った.色々調べて見たものの,2021 年現在の OSS では再生環境構築は難しいらしい.

Amazon.co.jp

BD ドライブに無駄な出費をするより,はじめから専用のプレイヤーを買ったほうが良い.

以下は失敗談の備忘.

4K UHD BD 再生環境を取り巻く諸事情等

4K や 8K という言葉が広く認知されるようになった昨今.4K 対応のテレビやプレイヤー,UHD BD のラインナップも豊富になってきている.一方,PC でその再生環境を用意するのはハードウェア的にもソフトウェア的にもハードルが非常に高い.

専用プレイヤーを使う方法

単に再生したいだけであれば UHD BD に対応したディスプレイ+プレイヤーを用意すれば再生環境は整う.PC での再生にこだわらない人はこの方法を選んだほうが良い.

Bitly

安いもので 17,000 円程度でプレイヤーを購入できる.

また Xbox One S/X,PlayStation 5 といったゲーム機もプレイヤーとして利用できる.こちらは概ね 25,000 円程度.

Amazon.co.jp

PC で再生する方法

わざわざ専用機器を増やしたくない人や,パワーユーザーは PC で再生できないか考えるかもしれない.が,PC での再生環境構築は難易度が高い.Wiki によると必要な物は次の通り.

  • UHD BD 対応再生ソフトウェア
  • UHD BD 対応ディスクドライブ
  • AACS 2.0の解除のためにIntel SGX (en) に対応し、なおかつ映像出力機能を搭載したインテル製のCPU(第7世代(Kaby Lake)から第10世代(Ice Lake及びComet Lake)までのCore iプロセッサ)
  • HDCP 2.2に対応したディスプレイ
  • 上記のSGXとHDCPに対応したマザーボード

Windows であればパイオニアが提供している「Ultra HD Blu-rayアドバイザーツール」を利用することで再生環境を確認することができる.この結果に合わせて環境を整備すればいいが,場合によってはマザーボード交換の必要もあるため,既存環境の拡張だけでは対応出来ない場合もある.

Ultra HD Blu-ray Drive World | ブルーレイドライブ | PC・スマホ関連 | パイオニア株式会社
パイオニアUHDドライブ/パイオニアBDドライブ/パイオニアULTRA HD Blu-ray

Linux ではどうかというと Arch Linux の Blu-ray のページが最も情報が整理されている.Linux において 4K UHD BD 再生に最低限必要なものは次の通り.

  • UHD BD 対応ドライブ
  • BD 再生及びコンテンツ復号ライブラリ
    • libbluray (コンテンツ再生用ライブラリ)
    • libaacs (コンテンツ復号用ライブラリ)
    • libbdplus (コンテンツ復号用ライブラリ)
    • KEYDB.cfg (復号用の鍵)
  • VLC メディアプレイヤー

なお Arch のページに記載されている通り,日本では著作権法の改正によって保護技術を回避しての複製は違法だが,再生は問題ない.関心事は,ディスクの複製ではなく,正当に購入したディスクをただただ再生したいだけである.

Blu-ray - ArchWiki

ただ,上記のドライブやライブラリ,プレイヤーを揃えても実際に再生できるかはまた別の問題である.

UHD BD 外付けドライブは Amazon で 1 万円程度で選択肢があるが,私のように試行錯誤した結果再生出来ないという結果の場合があるので無駄な出費となる可能性を覚悟すること.また,利用するソフトウェアによっては推奨するドライブやファームウェアのバージョンが決まっている場合があるので注意が必要.

Bitly

ちなみに私が用意したのはこれ.

Amazon.co.jp

コンテンツの復号には libaacs などを利用する.詳細は Arch のページなど色々なページで解説されているが,要するに libaacs は既知の鍵を使って AACS(Advanced Access Content System) の復号プロセスのいくつかをスキップすることができる.これらのライブラリは,ディストリビューションによってはパッケージ管理ツールからインストールできる場合もあり比較的入手は簡単.ただし,世の中に流通する全てのディスクで必要な鍵が明らかになっているわけではない.

なお復号について,かつては MakeMKV のストリーミング機能を利用することが出来たが,この機能は v1.14.0 において削除されている.代わりに VLC や Kodi と一緒に libmmbd を使えとのこと. libmmbd は libaacs と互換性があるらしい.

Removed UPNP streaming (Use VLC or Kodi with libmmbd instead)

http://www.makemkv.com/download/history.html

プレイヤーソフトについては,前述の VLCKodi の他に MPlayer が利用できる.Kodi はプレイヤーと言うよりもメディアセンターなので,大抵の人は VLC もしくは Mplayer を選ぶことになるはず.今回は VLC を使って見たが,VLC のフォーラムを見て分かる通り BD の再生に成功している人もいれば,失敗している人もいるので,自身の環境で再生できるかはやってみないと分からない.

プレイヤーやライブラリをビルドする

VLC やライブラリは前述の通りディストリビューションによってはパッケージ管理ツールからインストールすることができる.CentOS7 においても RPM Fusion を利用すれば VLC 本体,libaacs,libbdplus はインストールできる.パッケージからインストールしてみたり,ソースからビルドしてみたり,いろいろやってみたものの結局私の環境では再生出来なかった.ビルドの流れだけ書いておく.

基本的にはどれも ./bootstrap して,./configure して,make して,sudo make install するだけ.ローカルを汚したくないので基本的に Docker 内の /mnt で作業する.

共通作業

まずはコンテナを作成して各作業で必要となるパッケージをインストールする.ついでに作業環境の OS なども次の通り.

local $ cat /etc/centos-release ; uname -r
CentOS Linux release 7.9.2009 (Core)
5.13.0-1.el7.elrepo.x86_64
local $ docker run --rm -it -v /path/to/work:/mnt centos:7
docker# yum install   autoconf.noarch     \
                      automake.noarch     \
                      libtool             \
                      make                \
                      file                \
                      wget                \
                      git
docker# source /etc/profile

Build VLC Media Player

VLC 本体のビルドは標準リポジトリの GCC では対応出来なかったので,scl の devtoolset を使った.その上で,必要なパッケージをインストールして,ビルドを行った.以降のビルドの流れは大体同じ.ビルドのオプションは環境に合わせてお好みでどうぞ.ビルド出来たものは Docker を抜けてから sudo make install すればいい.

docker# yum install centos-release-scl && \
        yum install devtoolset-10-gcc-c++.x86_64 && \
        scl enable devtoolset-10 bash
docker# yum install https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
docker# yum install   flex            \
                      bison           \
                      byacc           \
                      lua-devel       \
                      ffmpeg-devel    \
                      liba52-devel    \
                      libxcb-devel    \
                      alsa-lib-devel
docker# cd /mnt
docker# wget http://get.videolan.org/vlc/3.0.16/vlc-3.0.16.tar.xz && \
        tar xf vlc-3.0.16.tar.xz && \
        cd vlc-3.0.16/
docker# ./bootstrap
docker# ./configure
docker# make

Build libbluray

docker# yum install   epel-release.noarch
docker# yum install   libxml2-devel       \
                      freetype-devel      \
                      fontconfig-devel    \
                      libudfread-devel    \
                      ant.noarch
docker# cd /mnt/ && \
        git clone https://code.videolan.org/videolan/libbluray.git && \
        cd libbluray/
docker# ./bootstrap
docker# ./configure
docker# make

Build libaacs

Java 関連のパッケージで漏れがあるかも.

docker# yum install  libgcrypt-devel     \
                     byacc               \
                     bison               \
                     flex
docker# cd /mnt/
        git clone https://code.videolan.org/videolan/libaacs.git
        cd libaacs/
docker# ./bootstrap
docker# ./configure
docker# make

Build libbdplus

docker# cd /mnt/ && \
        git clone https://code.videolan.org/videolan/libbdplus.git && \
        cd libbdplus/
docker# ./bootstrap
docker# ./configure
docker# make

いろいろやってみたものの再生出来ない

私の場合は,ブルーレイとしてディスクを開くとスピンアップせず,何もおこらない.試しに DVD としてディスクを開けばスピンアップはするものの当然再生出来ない.

ライブラリのパス

ライブラリのインストールパスはディストリビューションによって異なる.基本的には,パッケージツールでインストールされる先,もしくは,LD_LIBRARY_PATH で通したパスへインストールすればいいらしい.libaacs を参考に,CentOS7 の場合は /usr/lib64/ だと思ってライブラリをインストールしてみたものの,VLC からディスクを開くを選択してもスピンアップせず...MakeMKV の libmmbd のリンクを作成してみるも結果は変わらず...

local $ repoquery --list libaacs-0.8.1-1.el7.1.x86_64
/usr/lib64/libaacs.so.0
/usr/lib64/libaacs.so.0.5.1
/usr/share/doc/libaacs-0.8.1
/usr/share/doc/libaacs-0.8.1/COPYING
/usr/share/doc/libaacs-0.8.1/ChangeLog
/usr/share/doc/libaacs-0.8.1/KEYDB.cfg
/usr/share/doc/libaacs-0.8.1/README.txt

VLC のログ

VLC のログは,メニューバーの「ツール」→「メッセージ」を開いて,出力レベルを「2 (デバッグ)」にすると詳細なログが表示できる.ログによると no access modules matched らしいが解決策わからず...libbluray を読みに行ってないような...

main debug: processing request item: bluray:///dev/sr1, node: プレイリスト, skip: 0
main debug: rebuilding array of current - root プレイリスト
main debug: rebuild done - 3 items, index 2
main debug: starting playback of new item
main debug: resyncing on bluray:///dev/sr1
main debug: bluray:///dev/sr1 is at 2
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: 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": 19 candidates
main debug: no access_demux modules matched
main debug: creating access: bluray:///dev/sr1
main debug: (path: /dev/sr1)
main debug: looking for access module matching "bluray": 29 candidates
main debug: no access modules matched
main debug: looking for meta fetcher module matching "any": 1 candidates
lua debug: Trying Lua scripts in <ないしょ>/.local/share/vlc/lua/meta/fetcher
lua debug: Trying Lua scripts in /usr/lib64/vlc/lua/meta/fetcher
lua debug: Trying Lua scripts in /usr/share/vlc/lua/meta/fetcher
main debug: dead input
main debug: no meta fetcher modules matched
main debug: looking for art finder module matching "any": 2 candidates
lua debug: Trying Lua scripts in <ないしょ>/.local/share/vlc/lua/meta/art
lua debug: Trying Lua scripts in /usr/lib64/vlc/lua/meta/art
lua debug: Trying Lua playlist script /usr/lib64/vlc/lua/meta/art/00_musicbrainz.luac
lua debug: skipping script (unmatched scope) /usr/lib64/vlc/lua/meta/art/00_musicbrainz.luac
lua debug: Trying Lua playlist script /usr/lib64/vlc/lua/meta/art/01_googleimage.luac
lua debug: skipping script (unmatched scope) /usr/lib64/vlc/lua/meta/art/01_googleimage.luac
lua debug: Trying Lua playlist script /usr/lib64/vlc/lua/meta/art/02_frenchtv.luac
lua debug: skipping script (unmatched scope) /usr/lib64/vlc/lua/meta/art/02_frenchtv.luac
lua debug: Trying Lua playlist script /usr/lib64/vlc/lua/meta/art/03_lastfm.luac
lua debug: skipping script (unmatched scope) /usr/lib64/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: changing item without a request (current 2/3)
main debug: nothing to play

BD の情報

libbluray をインストールすると bd_infodb_list_titlesbd_splice といったツールもインストールされる.そもそも今回再生したいディスクの情報にツールからアクセスできるのかというと,アクセスできる.AACS は v71 で,BD+ は使ってないようす.

local $ bd_info /dev/sr1 2>/dev/null 
Using libbluray version 1.3.0
Volume Identifier   : THE_PHANTOM_MEANCE
BluRay detected     : yes
First Play supported: no
Top menu supported  : no
HDMV titles         : 8
BD-J titles         : 4
UNSUPPORTED titles  : 4

BD-J detected       : yes
Java VM found       : yes
BD-J handled        : no
BD-J organization ID: <ないしょ>
BD-J disc ID        : <ないしょ>

AACS detected       : yes
libaacs detected    : yes
Disc ID             : <ないしょ>
AACS MKB version    : 71
AACS handled        : no
                      (no matching processing key)

BD+ detected        : no

Application info:
  initial mode preference : 2D
  3D content exists       : No
  video format            : ignored (0x0)
  frame rate              : ignored (0x0)
  initial dynamic range   : SDR (0x0)
  provider data           : '                       Lucasfilm'

Disc library metadata:
Metadata file       : bdmt_eng.xml
Language            : eng
Disc name           : Star Wars: The Phantom Menace - Ultra HD™
Alternative         : <undefined>
Disc #              : <undefined>/<undefined>
TOC count           : 0
Thumbnail count     : 2
	./SW1_Jacket_416_JFIF.jpg 	416x240
	./SW1_Jacket_640_JFIF.jpg 	640x360

MakeMKV で読み取りしてみる

MakeMKV で読み取りするとディスクはスピンアップして,ボリュームキーが無いので復号出来ないとメッセージが表示された.ということは現状では VLC でも再生出来ない.が,VLC でもスピンアップくらいはしてほしかった...

おわりに

目的のディスクによっては再生できる可能性はあるものの,結局今回再生したいものは再生出来なかった.コンテンツの保護は大切だと思うんだけど,,,セキュリティと利便性はトレードオフだと思うんだけど,,,再生くらい気軽にさせてほしい...諦めて専用プレイヤーを買う...

コメント

タイトルとURLをコピーしました