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をビルドできる環境を作る。
- 用意する(した)もの
- ubuntuのセットアップ
- Android SDKのインストール
- Android NDKのインストール
- SDK/NDKの環境変数
- VLC for Androidのソースコード取得
- ビルドとエラー対処
- BRAVIAで動作確認(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
[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
/work/android_dev_tools/android-studio/bin/studio.sh &
Android NDKのインストール
NDKをダウンロードして展開する。wget https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip unzip android-ndk-r21e-linux-x86_64.zip
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のソースコード取得
mkdir -p /work/vlc cd /work/vlc git clone https://code.videolan.org/videolan/vlc-android.git -b 3.5.4-beta01
mv vlc-android/ vlc-android-3.5.4-beta01
ビルドとエラー対処
cd vlc-android-3.5.4-beta01 time buildsystem/compile.sh -a armeabi-v7a 2>&1 | tee log.txt
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がインストールされるように書かれてた。
MESON_VERSION=0.55.1 MESON_URL=https://github.com/mesonbuild/meson/releases/download/$(MESON_VERSION)/meson-$(MESON_VERSION).tar.gz
# MESON_VERSION=0.55.1 MESON_VERSION=0.56.2 MESON_URL=https://github.com/mesonbuild/meson/releases/download/$(MESON_VERSION)/meson-$(MESON_VERSION).tar.gz
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: [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.
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 手動モード 現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:
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/*
sudo apt install openjdk-11-jre openjdk-11-jdk
./gradlew clean
再度compile.shを実行する成功した。最後に「BUILD SUCCESSFUL」が出たらOK。
BUILD SUCCESSFUL in 7s 347 actionable tasks: 347 up-to-date
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。わざわざ調べるほどのことでもないんだけど、昔から自前ビルドは緑になるのが気にはなっていた。今回も調べないけど。。。ちゃんと署名したらオレンジになるのかなぁ?
起動するとストア版と変わりないUIが表示される。
次にmediatombやminiDLNA等のDMSかsambaのサーバの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同等に使えるものはなかなか無さそう。
映像や音声ストリームの切り替わりや複数ストリームの選択、デュアルモノ等が問題になるので一般的なプレーヤだと仕方ないのかな。