HWデコーダなんだが
今は、Android版AGMPlayerの更新開発フェーズで、今回は、一般形式の動画/音声ファイルを再生可能にしようとしている。現在、音声ファイルの再生は合格点なのだが、動画ファイルの再生は性能問題がある状況だ。
昨日書いた様に、mp4形式の動画ファイルの再生を行う場合、かなり古めのAndroidタブレットである所のNexus9では、フルHD動画の再生時には、Android OSが提供してくれるデコーダーによるデコード時間だけで、30FPS再生で許容できる33mSecをはるかに超える。
なので、Nexus9については滑らかな再生は不可能な状況なのだが、今年購入したNEC製の10インチタブレットでは、デコーダーでの処理時間は30mSecを切っているので、作者製の外部ルーチンで細工する事で、見かけ上、フルHD動画の再生も行える状況だ。
このため、最悪、この状況でも公開可能か、と、思ったのだが、昨日書いていた様に、作者の手持ちAndroid機器としては、Android11で動作しているAQUOS sense 3もあって、これで確認すると、Nexus9と大差ない感じになった。
つまり、352x240のVideo-CDクラスの解像度の動画なら普通に再生できるし、640x360の360p動画や、854x480の480p動画については、何とか再生できるのだが、1280x720の720p動画くらいになってくると、滑らかな再生は不可能になっている。
具体的には、映像はカクカクなのだが、更に、映像の再生時点を超える音声の再生は禁止しているので、音声再生についても、途切れ途切れになってしまっている。
と、言う事で、上記の状況は、作者がソフトデコーダーを使ってしまっているのかなあ、と、いう事で、ネットで調べてみた所、使用されているデコーダーはAPI関数を使って確認可能だったので、確認してみたところ、普通に、ハードウェアデコーダーが使用されている事が確認できた。
しかし、AGMPlayerで再生するとカクカクになる動画についても、Android機器に内蔵されている動画プレイヤーでは、スムーズに再生される。
なので、Android機器に内蔵されている動画プレイヤーは、Android OSが提供しているデコーダーとは異なるデコーダーを使っている可能性も考えられるのだが、デコーダーの使い方が違う! という可能性もある。
つまり、MediaCodecのデコーダーは、デコード結果をバイトバッファに出力する事が出来るので、作者的には、そんな使い方をしているのだが、もう一つの使い方として、Surfaceを指定し、そのSurfaceに直接画像を描画させる使い方もある! という事になっている訳だ。
普通に考えると、ビデオ用のハードウェアは、そのビデオ出力画面に、デコード結果を出力する事は出来ても、Javaのバイトバッファに、デコード結果を出力する機能は持ち合わせていない、かもしれない訳だ。
なので、作者の様に、デコード結果をバイトバッファに出力させようとすると、実質的には、ハードウェアデコーダーでもソフトウェアデコーダーと大差ないCPU処理が発生し、処理時間がかかる様になる! のかもしれない。
と、言う事なので、作者的には、ソフトウェア的には扱いづらいSurfaceを使った描画も試してみようか、と、思っているのだが、ネットを検索していても、サンプルコードなんかは出てこないので、少し苦労するかもしれない今日この頃だ。
ちなみに、Nexus9で使用されていたデコーダーは、「OMX.Nvidia.h264.decode」で、H.264用デコーダーとしては、もう一つ「OMX.google.h264.decoder」というのが使える様だった。
ネットの情報によると、OMX.google.h264.decoderはソフトデコーダーで、OMX.Nvidia.h264.decodeはハードデコーダーなので、OMX.google.h264.decoderを使えば、処理時間はより一層かかる様になる! かと思ったら、大差ない感じだった。
と、言う事なので、Nexus9では、OMX.Nvidia.h264.decodeを使っても、Surfaceに描画させない限り、性能的にはソフトデコーダーレベルになるのかなあ、と、思った訳だ。
NEC製のタブレットの場合、上記がどんな感じになるのかは、まだ試していないのだが、そういえば、AndroidStudioから起動しているAndroidエミュレータについても、まだ、確認していなかった。
と、言う事で、まだ、性能問題については、バタバタしている状況なのだが、やれる事は少ないので、明日には、どう決着をつけるかは決めている筈だ。

