どんぶらアニマル さんぽ道

CBR250RR(MC22)とNSR80(HCO6)とAPE50(AC16)を中心とした備忘録。

リビングのテレビでTSを見たくてVLC for Androidをビルド

VLC for Android

BRAVIA(KJ-49X9500H)でDLNA経由のMPEG2-TSを再生したくて、先人の情報を元にminiDLNAのリソースの設定をいろいろと変更してみたけど再生できず。正解がわからないので、再生できるDMSとのパケットを見てBRAVIAの期待を知ろうと思ってDIGA、nasneを試すもどっちも再生できず。nasneも再生できないってどゆこと?と思いつつ非暗号も試してみるがダメ。DTCPIP以前の話しでこのプレーヤは使い物にならないというのが結論。

で、Android TVなのでAndroidアプリで再生することにして、いろんなアプリを試した。試したコンテンツのESはMPEG2とH.264でコンテナは全てMPEG2-TS。

いろんなアプリを試した結果、VLC(3.5.3)は複数サービス、複数の音声ストリームが入ったMPEG2-TSもそこそこ再生できた。コンテンツの途中で音声がステレオ2ストリームから音声多重に切り替わるようなコンテンツは切り替わりで音が出なくなることがあるが、その時は手動で音声切り替えをやり直すと出るようになる。どうもPMTが変わると追従できないことがあるみたい。

そんなVLCもネットワーク越しのMPEG2-TSに関してはトリックプレーができないこともあって、素のままでは実用的ではないので手を入れていく。そのためにまずは素のVLCをビルドできる環境を作る。

用意する(した)もの

・VMware workstation 16(なくてもいいが長期にわたって環境を維持するにはvmかdockerが手軽)
・ubuntu 20.04のインストール用isoファイル

基本的には公式の手順に従う。が、一部公式通りではうまくいかなかった。

AndroidCompile
videolan/vlc-android

ubuntuのセットアップ

必要なパッケージをインストールする。
sudo apt-get install automake ant autopoint cmake build-essential libtool-bin \
    patch pkg-config protobuf-compiler ragel subversion unzip git \
    openjdk-8-jre openjdk-8-jdk flex python wget

sudo apt install -y gettext
 
 
gettextは公式には書かれてなかったけどビルドで下記のエラーになったので追加した。
 
[17/71] Compiling C++ object src/libharfbuzz.a.p/hb-fallback-shape.cc.oconfigure.ac:130: error: possibly undefined macro: AM_ICONV
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
autoreconf: /usr/bin/autoconf failed with exit status: 1
make: *** [../src/cddb/rules.mak:34: .cddb] エラー 1
 
 

Android SDKのインストール

Android studioをダウンロードして展開する。
mkdir -p /work/android_dev_tools
cd /work/android_dev_tools

wget https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2022.2.1.9/android-studio-2022.2.1.9-linux.tar.gz

tar xvfz android-studio-2022.2.1.9-linux.tar.gz
 
Android studioを起動してSDKをインストールする。
/work/android_dev_tools/android-studio/bin/studio.sh &
 
インストールディレクトリを指定したいのとインストールされるものを確認したいのでカスタムセットアップで進める。
Android studioカスタムセットアップ1
 
JDKはデフォルトの場所で。
Android studioカスタムセットアップ2
 
好みで明るい方で。
Android studioカスタムセットアップ3
 
コンポーネントのチェックはデフォルトのままで。SDKロケーションはユーザ毎に入れるとストレージを圧迫するので/work/android_dev_tools/Sdkに変更した。
Android studioカスタムセットアップ4
 
2つともライセンスに同意して。
Android studioカスタムセットアップ5
 
インストールが始まる。終わったらAndroid studioを終了する。
Android studioカスタムセットアップ6

Android NDKのインストール

NDKをダウンロードして展開する。

SDK/NDKの環境変数

インストールしたディレクトリに合わせて環境変数を設定する。~/.bashrcにも追加。
export ANDROID_SDK=/work/android_dev_tools/Sdk
export ANDROID_NDK=/work/android_dev_tools/android-ndk-r21e
export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools

VLC for Androidのソースコード取得

VLCはPC用とandroid用は別のgitに分かれてる。今回はAndroid用のgitから取得する。
VLCのバージョンは何かいいことがあるんじゃないかと期待して新しめの3.5.4-beta01にしたが3.5.3でもよいと思う。
 
mkdir -p /work/vlc
cd /work/vlc
git clone https://code.videolan.org/videolan/vlc-android.git -b 3.5.4-beta01
 
いろんなバージョンを同時進行で試すかもしれないのでgitで取得したディレクトリ名を変更。
 
mv vlc-android/ vlc-android-3.5.4-beta01

ビルドとエラー対処

ビルドにあたって、BRAVIAで動くapkができるオプションでかなり悩んだ。結果的にターゲットはarmeabi-v7aで、release(-r)は無しでインストール出来て動いた。うちのBRAVIAではv8はダメだった。releaseはインストールでINSTALL_PARSE_FAILED_NO_CERTIFICATESとなってインストールできなかったので署名の問題だと思うが今やらなくてもいいので深追いしてない。
で、ビルドを開始する。
 
cd vlc-android-3.5.4-beta01
time buildsystem/compile.sh -a armeabi-v7a 2>&1 | tee log.txt
 
compile.shが終了し、shellに見えている範囲でエラーは無かったので成功していると思ってapkを探したが見つからない。
保存してあったlog.txtを見てなぜapkが出来てないのか調べてみるとエラーが出てた。
makeの依存関係がまとまってないみたいで、最初の方に起こったエラーは、並列実行されているプロセがあると埋もれてしまい最後のログでエラーがあるか否かを判断することはできないみたい。
 
  CC       lib/fseterr.o
lib/fseterr.c: In function 'fseterr':
lib/fseterr.c:77:3: error: #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
   77 |  #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
      |   ^~~~~
make[3]: *** [Makefile:3461: lib/fseterr.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[3]: Leaving directory '/work/vlc/vlc-android-3.5.4-beta01/vlc/extras/tools/bison'
make[2]: *** [Makefile:4522: all-recursive] Error 1
make[2]: Leaving directory '/work/vlc/vlc-android-3.5.4-beta01/vlc/extras/tools/bison'
make[1]: *** [Makefile:2625: all] エラー 2
make[1]: ディレクトリ '/work/vlc/vlc-android-3.5.4-beta01/vlc/extras/tools/bison' から出ます
make: *** [/work/vlc/vlc-android-3.5.4-beta01/vlc/extras/tools/tools.mak:358: .buildbison] エラー 2
 
この対処法は外人さんが教えてくれた。
vlc for android 编译过程
 
教えの通り、
vlc/extras/tools/bison/lib/fseterr.c
の関数fseterr()の中身をすべて削除して空っぽな関数にする。該当箇所の変更後は下記のようにした。
void
fseterr (FILE *fp)
{
}

再度compile.shを実行するとまたエラー。
meson.build:1:0: ERROR: Meson version is 0.55.1 but project requires >=0.56
 
ソースを調べてみると
vlc/extras/tools/packages.mak
に0.55.1がインストールされるように書かれてた。
 
下記のように0.55.1をコメントアウトして0.56.2を追加。
 
ダウンロードしたファイルのハッシュチェックをしているので、0.56.2のハッシュを
vlc/extras/tools/SHA512SUMS
に追加する。0.55.1の下に0.56.2のハッシュ値とファイル名の行を追加。
172b4de8c7474d709f172431b89bf2b2b1c2c38bc842039cccf6be075a45bd3509a1dab8512bc5b2ee025d65d8050d2f717dd15c1f9be17fca3b2e7da0d3e889 meson-0.55.1.tar.gz
3b6cc5cae31d756b251ecde3483d3710bceff50cfd03ef6cf6f939d9e599998e61fcb03a2ee09d6a6f9bfa2198f43e7f20447359de3bff1055febcf03e82e514 meson-0.56.2.tar.gz

0.55.1が存在すると0.56.2をダウンロードしないので、削除する。
rm -rf vlc/extras/tools/meson vlc/extras/tools/meson-0.55.1.tar.gz
 
再度compile.shを実行するとまたエラー。
 
compile:
    [javac] /work/vlc/vlc-android-3.5.4-beta01/vlc/contrib/contrib-android-aarch64-linux-android/bluray/src/libbluray/bdj/build.xml:26: warning: 'includeantruntime' was not set, defaulting to bui\
ld.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 33 source files to /work/vlc/vlc-android-3.5.4-beta01/vlc/contrib/contrib-android-aarch64-linux-android/bluray/src/libbluray/bdj/build
    [javac] 警告:[options] ブートストラップ・クラスパスが-source 5と一緒に設定されていません
    [javac] エラー: ソース・オプション5は現在サポートされていません。6以降を使用してください。
    [javac] エラー: ターゲット・オプション1.5は現在サポートされていません。1.6以降を使用してください。

BUILD FAILED
/work/vlc/vlc-android-3.5.4-beta01/vlc/contrib/contrib-android-aarch64-linux-android/bluray/src/libbluray/bdj/build.xml:26: Compile failed; see the compiler error output for details.
 
 
対処法はどこで見つけたか忘れてしまったけど、教えの通りjavaのjre、jdkを入れ直す。
公式では8をインストールするようになっているが11でないとダメそうなことはわかっていたので11を入れてるんだけど。。。
 
kirin@ubuntu-20:/work/vlc/vlc-android-3.5.4-beta01$ sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 2 個の選択肢があります。

  選択肢    パス                                          優先度  状態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      自動モード
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      手動モード
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      手動モード

現在の選択 [*] を保持するには &ltEnter&gt、さもなければ選択肢の番号のキーを押してください: 
 
 
いろんなパターンを試した結果、いったん削除して入れ直すとうまくいくのでまずは削除する。1行目の改行位置がとてもわかりにくいので改行箇所にから行を入れてある。
sudo apt-cache search java | awk '{print($1)}' | grep -E -e '^(ia32-)?(sun|oracle)-java' -e '^openjdk-' -e '^icedtea' -e '^(default|gcj)-j(re|dk)' -e '^gcj-(.*)-j(re|dk)' -e 'java-common' | xargs sudo apt-get -y remove
sudo apt-get -y autoremove
sudo dpkg -l | grep ^rc | awk '{print($2)}' | xargs sudo apt-get -y purge
bash -c 'ls -d /home/*/.java' | xargs sudo rm -rf
rm -rf /usr/lib/jvm/*

あらためて11をインストールする。
sudo apt install openjdk-11-jre openjdk-11-jdk
 
このままビルドを継続するとjavaのバージョンの不整合が起こるのでクリーンナップする。
./gradlew clean

再度compile.shを実行する成功した。最後に「BUILD SUCCESSFUL」が出たらOK。
BUILD SUCCESSFUL in 7s
347 actionable tasks: 347 up-to-date
 
apkは
vlc-android/build/outputs/apk
にできてるはずなんだけど、そんなディレクトリは無い。
で、探してみると全然違うディレクトリにある。
kirin@ubuntu-20:/work/vlc/vlc-android-3.5.4-beta01$ find . -name "*.apk" | xargs ls -la
-rw-rw-r-- 1 kirin kirin 40490790 12月 30 06:37 ./application/app/build/outputs/apk/dev/VLC-Android-3.5.4-Beta-1-armv7.apk

 

BRAVIAで動作確認(VLCでトリックプレーを可能にする設定とか)

いつものESファイルエクスプローラでインストールしようと思ったけど、ストアから無くなってる。調べてみると不正なアプリだとgoogleに判断されて削除された模様。仕方ないのでファイルコマンダーをインストール。

手順的にはスマホにインストールするのと変わりない。

・設定のビルドナンバーを7回タップして開発者モードを有効化
・USBメモリにapkを入れてBRAVIAに挿す
・ファイルコマンダーでUSBメモリのapkを選択してインストール

インストールされた。オレンジのアイコンはストアからインストールしたVLCで、緑のアイコンがビルドしたVLC。わざわざ調べるほどのことでもないんだけど、昔から自前ビルドは緑になるのが気にはなっていた。今回も調べないけど。。。ちゃんと署名したらオレンジになるのかなぁ?

BRAVIAのVLCをインストール

起動するとストア版と変わりないUIが表示される。
BRAVIAのVLCをインストール2
 
TSでシークできるようにするには「設定」→「ビデオ」→「高速シーク」の「常に使用」を有効にする。
VLCでTSのトリックプレー有効化
 
DLNAサーバの登録は「ブラウジング」→「ローカルネットワーク」で一覧にでてきたサーバからupnpになっているものを選択する。もちろんVLC、というかオープンソースでDTCP-IPなんて対応できないので普通のテレビの録画コンテンツはコンテンツリストは取れても再生はできない。

次にmediatombやminiDLNA等のDMSかsambaのサーバのTSコンテンツを再生。

VLCでTSを再生

スクリーンショットで再生/一時停止ボタンの左右にあるスキップボタンは、右下の「…」ボタンで出てくるメニューの制御設定→シークボタンを有効にすると表示される。が、ネットワーク経由のTSでは機能しない。durationの表示も0:00になってる。

ひとまずストア版と同じ動きをすることが確認できた。ストア版同様に以下の課題がある。

・シークバーでのシークがdurationの5%単位になっている
・TSではスキップボタンが効かない

前者は30分程度のコンテンツであれば許容できるけど、2時間のコンテンツだと5%は6分になるのでちょっと不便。

後者はできれば15秒単位で動くようにしたい。

TSでトリックプレーができないのはMP4やPSのような蓄積型メディアとは違ってTSの性質上、ストリームに含まれたヘッダなどにdurationの情報が無いからで、ヘッダがないならヘッダ以外から取得すれば解決できる。DLNAならresourceに書いてあるのに使わないのは他に問題があるからなのかな?

durationを使わない簡易的な方法として、5%シークが出来ているシークバーを操って任意の時間にシークさせることもできそう。シークバーのminが0、maxが1000になっているようなので2時間のコンテンツだとシークバーの1ステップが120分/1000=(120x60秒)/1000=7200秒/1000=7.2秒となりちょっと荒い。15秒スキップは厳しい感じ。

これまではIV-P100のファームを改造してレジューム再生ができるようにしたり、15秒スキップ、5分スキップ機能等を追加して便利に使ってたんだけどリビングの個体は壊れて、仕事部屋のも起動しないことが頻繁に起こり始めたので完成度は低くてもとりあえず視聴できるものを早く用意したいところ。久々にいろんなプレーヤを試したけどネットワーク経由のTS再生に関してはIV-P100同等に使えるものはなかなか無さそう。

映像や音声ストリームの切り替わりや複数ストリームの選択、デュアルモノ等が問題になるので一般的なプレーヤだと仕方ないのかな。

スキップ対応に続く

気が向いたら感想をお願いします。(ログイン不要、ボタンを押すだけです)