スマホのスペックによる動画再生できる形式の差を調べてみる Xperia 5 III & moto g52j 5G編

あることを考えていてDSDVを使って電話番号を2つ持ちにしようかと思い、キャリア側で購入したXperia 5 IIIを補助スマホに、DSDVができるちょっと安めのスマホであるmoto g52j 5Gをメインスマホにしようかと思いデータを移行しているときに気がついた現象。「あれ?moto g52j 5G側での動画再生でハードウェアを利用できないものがいくつかあるような気が・・・」というところから始まっています。

 

簡単に比較してみよう

というわけでちょっと比較してみました。ハードウェアを利用できるかどうかはMX Playerを使ってHWで再生できるかどうかで調べています。

  Xperia 5 III moto g52j 5G
XviD 640×480 × ×
DivX 1280×720
H.264 1920×1080
H.264 10bit 1920×1080 × ×
H.264 3840×2160 ×
H.265 1920×1080 ×
H.265 3840×2160 ×

 

つまり、こういうことがいえるわけです。

moto g52j 5Gは解像度が4Kレベルの動画やH.265などの上位のコーデックを用いるとハードウェアを利用して動画再生ができなくなるという現象が起こる。Xperia 5 IIIはある程度高解像度の動画や上位のコーデックでもハードウェアを使って再生できる。

 

普通に使っている限りは問題は出ないが・・・

Youtubeなどの動画も普通に見ている限りはそんな高解像度ではないですので何も問題はないのですが、例えばVRなどは高解像度ですのでスマホで再生するとなると再生支援が追いつかなくなりまともに見ることができなくなる、という現象が発生します。今回別件でVR動画にもチャレンジしていたのですが、VR動画を再生すると妙にかくかくして再生がおかしいな、と思い調べてみた結果がこれでした。

 

VR動画をスマホで見る場合はスペックに注意

あまり表には出てこないスペックだとは思いますがこういう情報も必要になることがあるようですね。しっかりとしたSoCが積まれている端末で再生してください。といってもその辺がわからない人も多いと思いますのでその場合は「その手の情報が書いてある端末」か「単純に高性能がうたわれている端末」を購入するのが無難という結論に至りそうです。はい。

 

DirectShow Extend Filter Library 0.16公開

ある意味大変な間違いをしていたためにlibvpxのコンパイルが通らなかったことがわかったので改めてビルドし直しました…。

 

x86用のプロジェクトを作製した後のmake cleanを忘れるとこうなるのか…

というわけで真相がこれ。x86用の環境とx86-64用の環境はほぼ同一で作るようにしていたのでconfigureをx86用で通してmakeしたものをコピーしてlibvpxのライブラリを作成してそのままconfigureでx86-64用の設定をしてmakeをして…と思っていたのですが、どうもこれがまずかったようです。

x86用の設定が残ったままとなり、x86-64用の各種定義やらアセンブラのコンパイル環境がうまく設定されなかった結果、x86-64用のライブラリの作成に失敗していた、が真相だったようです。ちなみにmakeでその手のファイルも作り直されるのを失念していたのでただの間抜けですね。vcprojをコピーしただけではその辺の設定が正しく通らないので注意しましょう。

 

x86用のプロジェクトとx86-64用のプロジェクトを「ディレクトリ単位で」分けることで解決

ちょっとデータ容量がもったいないですが、ビルドできないよりましかな、という結論です。そのデータ量を惜しむならばハードリンクでもすればいいのですが、さすがにそちらの方が作業の手間なのでこういう結論になりました。こんなことで悩む人は多くないと思いますが、気をつけるべき点ですね。

 

Vectorのライブラリも更新

こっちはこっちで一体何年ぶりなのでしょうかね。毎月通知だけは受け取っていたのですが。しばらくたったら正式公開されると思いますのでそちらからダウンロードしたい人はちょっと待っていてくださいね。

 

DirectShow Extend Filter Library 0.15公開(ただしx86版のみ)

ただし書きが悲しいですよね…。x86版の方は形になりましたのでここまででいったん公開です。

 

放置しすぎたためにGUIDが違うわライブラリがビルドできないわ…

発端は「使ったときにWMVやWebMがうまく再生できない」というメールでした。少しだけ時間の余裕ができたので調べてみようと思いビルド環境を組み上げ…ることがなんと至難なことか。

まあ、わかりやすく言うとさすがに10年ほど前にビルドしたものなので環境が違いすぎること。特に

  • VisualStudioのバージョンを2010から2017への変更
  • WebM系のライブラリをできる限り最新環境へとアップデート

の2点を行ったのですが、特に後者がかなり難しかったというのが大変だった理由で、今回x64版がビルドできなかった理由だったりします。

 

webmdshow(WebMをDirectShow経由で再生するライブラリ)が2015年以降ほぼ更新されていない!

そう、今回の最大の問題点がこれだったけです。つまりVisualStudio2017(やそれよりも新しいVisualStudio)を前提にしていないコードのままになっていた、というのが問題だったわけです。特に

  • DirectShowの基本ライブラリ(BaseClasses)と同じ名前を使っているために名前空間の分離が必要(これは前から)
  • オーディオの読み取り部分でVorbisを読み込むパターンしかなく、Opusを読み込むパターンが用意されていない
  • 付属のlibvpxが古いため最新のlibvpxをビルドする必要がある

の3点が問題になりました。1点目は根性で相変わらずカバーです。2点目については今回Opusに関しては元から変換フィルタだけは用意されていたのでwebmdshow側でOpusが来たときにフォーマットを認識するコードを追加することでこれはなんとか回避しました。ところが3点目についてlibvpxはx86版はビルドできたのですが、x64版はアセンブラがコンパイルできないためにライブラリの生成に失敗する、という現象でストップしてしまいました。ソリューションの作成はLinux側で作ることで回避できるのですが、アセンブラがコンパイルできない問題はさすがに予定外です。何が悪いのか今現在はさっぱりわからないのでこちらは保留状態になっています。

 

Visual Studio 2017に対応していないライブラリ群は除外することに

一部のライブラリが古すぎてコンパイラのコード生成に失敗したりライブラリのリンクに失敗するという問題がありましたので0.15の段階でサポートを外すことにしました。もし使いたい場合は一応0.14版も残しておきますのでそちらを利用してみてください。何のサポートがなくなったはソフトウェアのページで確認してみてください。

 

カーナビでYoutubeを見る方法を探してつけてみようと思った Anycast導入編

ということで、カーナビでYoutubeを見るためにHDMIを使った接続をしてみよう、ただし480pなどの解像度もサポートされているようにしたい、ということで値段も手頃なAnycastを導入してみることにしました。ここからはかなり技術の話になりますので難しい表現が出てくるかもしれません。

 

Anycastの購入

つまりこれですね。

ただし、ある理由で購入には踏み切りづらいものがあります。というのも、

  • そもそも中国製で信頼していいのか悪いのか不明
  • 購入するサイトや発送元によっては互換品や偽物をつかまされる可能性がある
  • 正式な型番が何かが書かれていない場合があり、手元に届いたときに初めて型番がわかることがある

というものです。こればっかりはどうすることもできないかな、と思います。とりあえず上の画像のリンクで購入した場合は「私が購入した場合」はこれになりました。

Anycast M18 Plusd

「Anycast M18 Plus」というものです。安定版がM9 Plusだったのでそれになるのかな~と思ったらこれでした。M9 Plusより新しい世代ですので性能がよいことを期待しましょう。あと、金額も(現在は)2,200円ほどですので怪しげなサイトでもない限りはほしい場合は買ってみてもよいような気はします。自己責任ですが。

 

Anycastとは

ここで、Anycastについて確認しておきましょう。単純にいうと「Wi-FI経由でHDMIの信号を受信する端末」だと思えばよいです。現段階でスマートフォンと画像を送受信する場合は

  • Miracastを使う(Androidの場合)
    • AirPlayを使う(iOS系の場合)
    • GoogleHome経由でChromecastに接続する(Android,iOSともに可能)

といったものがあります。Anycastはこの全てに対応している…型番があります、というところです。型番によっては対応してないものがあったり、これらの接続の待ち受けを手動で切り替えたり、4Kまで対応していたりしていなかったり、とかなりブレがあります。なのでそこまで考えて購入するのであれば型番を指定できるサイトを使うべきかな~というのが実情です。

 

Anycastに接続してみる

使っている端末がAndroid系なので、Miracastの機能を使って接続してみました。セットアップなどは次のようになります。

  1. Anycastに付属のケーブルを接続する
  2. AnycastのHDMI端子をディズプレイなどに接続する
  3. AnycastのUSB端子を電源に接続する
  4. しばらく待つとディスプレイに待機画面が表示される
  5. スマートフォンの端末などでWi-Fiを有効にするとAnycastの端末が見える(待機画面に端末名が表示されている)ので、そのWi-Fiに接続する
  6. パスワードを入力する(初期パスワードから変更した場合でも待機画面に表示されているパスワードを入力すればよい)
  7. Wi-Fiを接続した端末でブラウザを開き、待機画面に表示されているIPを直接入力する
  8. 設定画面が表示されるので必要な設定を行う(特にこの後でカーナビに接続する場合は画面解像度の設定を忘れないこと)
  9. Wi-Fiの接続を切断する
  10. 画面を表示したい端末の設定からMiracastの機能を検索して接続する
  11. 画面に端末の画面が表示される

という流れです。ちなみにMiracastに相当する機能の名前は端末によって異なるらしく、Xperia系では「スクリーンミラーリング」、Zenfone系では「PlayTo」という名前になっているようです。

 

端末によってAnycastで動画再生をしたときの状態がかなり異なる

どちらかというとこの話が今回のメインです。まず、Miracastの機能は端末のパワーをかなり使うらしく、多少古い端末だったり、解像度が高めに設定されていると送受信が間に合わなくなり、音が飛んだり画像が飛んだりしてしまいます。ある程度力がある端末でやりましょう。

そしてAnycastが「スマートフォンなどの端末の画面を表示するもの」、ということから来る悲しい性質があります。その性質とは、次のようなものです。

  • Anycastの出力はアスペクト比が16:9を想定している(480p、720pなど)
  • 端末のアスペクト比が16:9でない場合、Anycastはレターボックスやピラーボックスにより、多少表示領域を削っても元の端末のアスペクト比の表示となるようにする
  • ここに(例えば)16:9の動画を表示しようとすると端末側はレターボックスやピラーボックスにより端末の画面に合うように表示する
  • ところが、Anycast側にはすでに端末の画面を表示するためのボックスが入っているため、動画が画面全体に表示されず、中央に少し小さめに表示されてしまう

おまけにカーナビの画面側のアスペクト比も16:9でない場合はレターボックスとピラーボックスが何段階にも挿入されて動画が中央に小さく表示、という現象が発生してしまうことが発覚しました。

簡単にどうにかできる方法としては「端末自体が16:9のアスペクト比のものを使う」です。こうすれば少なくても端末からAnycastの段階で画面が小さくなることは防げるので多少ましになります。

ちなみにこれが検証段階でわかったので、Youtube用の端末も用意する必要もあることを考えて、(私の中では)現役を引退していたZenfone3が復活する、という事態になったわけです。何じゃそりゃ…

 

Youtubeでの検証はまだ

適当なデータ通信用SIMを契約して入れてあげれば完成なのであとは処理能力との釣り合いがどうなっているか、というところですか…。

 

カーナビでYoutubeを見る方法を探してつけてみようと思った 考察編

というわけで、様々なサイトでやり方が紹介はされていますが、カーナビでYoutubeを見てみよう、という話です。正確にはカーナビでYoutubeやモバイル回線を使わないでスマートフォンに入っている動画をカーナビ上でうまく見られないか?というところから始まっています。ただし、このサイトは技術的な要素も大きく説明していますのでご注意を。

 

簡単な方法から準備に品物がいる例まであるが…

一応前提条件としては

  • Youtubeを見るための端末は用意されている
  • 端末はモバイル回線に接続可能、テザリングも可能、HDMI出力も可能
  • カーナビ側にはHDMI入力やRCA入力、USB入力、Bluetooth接続が可能

という条件はつけておきます。この条件がないと下の方法のいくつかができませんので気をつけてください。

 

音声(音楽)だけならかなり簡単

というか、ほとんどのカーナビは運転中に安全機能として映像を映すことができないような仕掛けになっていますので、後部座席にいる人(主に子どもを想定)に見せることがこの話の前提になってきます。運転中に動画を見ると集中力がそちらにとられて運転がおざなりになり事故を起こす可能性が非常に高くなりますので。

まずは音声(音楽)だけです。音声(音楽)だけならそれほど難しくはありません。その場合はBluetooth接続でBluetooth Audioモードにすればたいていは終わりです。それ以外の入力を使うとピットインしての作業が必要になってくると思います。

 

映像も見たい人向け

やっと本題です。可能性がある方法としては

  • USB接続する(Apple CarPlay、Android Autoなど)
  • HDMI出力をRCAコンバータを通してRCAで入力する
  • 端末のHDMI出力とカーナビ側のHDMI入力をつないでHDMIで信号を送る
  • Wi-FI経由で映像を飛ばしてHDMIに変換して入力する(AppleTV、FireTVStick、Anycastなど)

なんですが、これがまた知識がないとかなり難しいです。

 

USB接続を使った方法はかなり知識が必要

というか、前提条件として「CarPlayやAndroid AutoにYoutubeを見る機能はどこにもない」ということなんです。つまり、この方法はすでに破綻しています。無理にやろうとすると特別なAndroidが入った端末をUSBで接続することでYoutubeを見られるようにすることなのですが、買う端末の種類や使い方がわからない人は怖すぎて無理があると思います。常にテザリングをしないとだめですからね。

 

RCA接続も初期投資が大変

そもそもRCA接続するための端子はカーナビの裏側にあることがほとんどなので、一度裏側にアクセスして線を接続する必要があります。結局一度ピットインして作業する必要がありますし、変換のための機材が必要になってきます。調べた限りだとこれが有効でしょうか。

BeatSonicの「IF36」というもので、HDMI入力をRCA出力に変換するものです。車用品らしく、電源も12Vから直接とれるようになっています。もちろんこれだけではなく電源端子からとるような細工をしたり、RCAケーブルをカーナビに接続したりするので一度カー用品店に相談する必要はあると思います。それが終われば普通に見ることができそうです。

 

HDMIでもちょっとした細工が必要

HDMIの場合はカーナビ側の前提条件を確認する必要があります。ここ数年間で発売されたカーナビにはHDMIの入力に前提条件がある場合が多く、それが「入力の画像解像度として受け入れ可能なものが480pしかない」というパターンです。

で、これの何が問題かというと「Youtubeを見るための端末がある程度高性能(もしくは逆にかなり古い)でない限りはHDMIの出力解像度として480pをサポートしていない」ということが考えられるからです。この場合、HDMI出力にそのままつないでも映像を見ることができません。

実際、私が自分のカーナビと端末(スマートフォン)がこの状態で、スマートフォンの画面が横長になっていると16:9の出力モードを持っていなかったり、持っていても1080pしかない、なんてパターンがかなりあります。ということで、直接接続だけだとうまくいかないパターンがかなりあるということは認識しておいてください。そうなると考えられる方法は、

  • HDMIコンバータを通して解像度を強制的に固定させる
  • 480pを出力できるHDMI出力器にWi-Fi等で接続して映像送信をする

となってしまいます。それぞれ見ていきましょう。

 

HDMIコンバータは…うまくいくのか?

商品的にはこれが可能のように見えるのですが、試していません。

BeatSonicの「IF33A」です。本来はHDMIの信号を2つのディズプレイに送信するためのもので、フロントモニタとリアモニタに送る、という機能がメインです。が、これの副機能として「送信するときの解像度を720pや480pに強制的に固定する」機能があります。この機能を利用してHDMI入力に入れてしまおう、という発想です。

まあ、電源が12Vからとるようなケーブルになっていますのでシガーソケットからとるように細工するには手間がかかりますし、値段もそれ相応なのでやっぱり初期投資が必要です。さらには今のスマートフォンから入力させたら本当に480pにできるのか?がわからないのが痛いです。他の人のレビューを見ている限りはできそうな気はするのですが…

 

無線接続を考える

ということで、最後のWi-Fi経由で接続する方法です。この辺になってくるとほかのサイトに解説を譲った方が早そうですね。とりあえず欠点だけ先に書くと

AppleTV:100V電源端子が必要なのでシガーソケットからの変換などが必要。少し大きい。Android系は不可。

FireTVStick:Wi-FI接続が必要なのでテザリングやWi-Fiルータが必要。ネットからの動画は見られるがスマートフォンに入れてあるコンテンツは直接見られない。

Anycast:種類がありすぎ+説明書がわかりづらいなど初心者には難しい。接続が安定せず切れることがある。iOS系から接続しようとするとWi-Fiルータに接続する必要がある。買うサイトを間違えると変なものをつかまされるかも。

ということで、どれも一癖二癖あるのが実情です。もちろん、このサイトは技術系なのでAnycastに挑んでみようと思います。はずれをひかないように注意して試してみたいと思います。