Androidでハードウェアアクセラレーションによるビデオデコードを使用するにはどうすればいいですか? 質問する

Androidでハードウェアアクセラレーションによるビデオデコードを使用するにはどうすればいいですか? 質問する

研究プロジェクトで独自定義のプロトコルをテストするために、ハードウェア アクセラレーションによる H.264 デコードが必要です。

ウェブで検索してみると、Android でハードウェア アクセラレーションによるビデオ デコードを実行する方法がいくつか見つかりました。

  1. 使用ffmpeglibstagefright (libstagefright の概要) またはOS内のlibstagefrightを直接使用する。ここ
  2. 使用オープンマックス特定のハードウェアプラットフォーム上。サムスンデバイスについてはこちらそしてQualcomm Snapdragonシリーズについてはこちら
  3. 何人かの人が言及したPVプレイヤー

一部の人々"言う"libstagefright が唯一の方法ですが、Qualcomm の人たちは明らかに成功を収めています。

現時点ではどの方法がうまくいくかわかりません今はちょっと混乱しています。すべてがうまく機能するのであれば、ハードウェアに依存しない方法の方が間違いなく望ましいでしょう。

Galaxy Tab 7.7(3.2 & Enxyos) でいくつかのビデオ プレーヤーの H/W アクセラレーションをテストしたところ、VLC、Mobo、Rock、vplayer、rock、mobo は正常に動作しましたが、VLC は動作せず、vplayer にはパフォーマンスを低下させるレンダリング バグがあるようです。

とにかく、私は Rockplayer で「操作」を行い、data\data\com.redirecting\rockplayer にあるすべての .so ライブラリを削除しました。すると、ソフトウェアのデコードはクラッシュしますが、ハードウェアのデコードは問題なく動作します。どうやってこれを実行したのか不思議です。ハードウェアのアクセラレーションはハードウェア プラットフォームに依存しない可能性があるように思えます。

誰かこの問題を解決できますか? または、追加情報やより詳しい詳細が記載された参考資料を提供できますか?

ベストアンサー1

上記の質問に答えるために、Androidに関連するいくつかの概念を紹介しましょう。

OpenMAXAndroidはコーデックインターフェースにOpenMAXを使用しています。そのため、すべてのネイティブコーデック(ハードウェアアクセラレーションの有無にかかわらず)はOpenMAXインターフェースを提供しています。このインターフェースは、コーデックを使用してメディアをデコードするためにStageFright(プレーヤーフレームワーク)によって使用されます。

NDKAndroid では、Java アプリケーションが NDK を使用して基盤となる C/C++ ネイティブ ライブラリと対話できます。そのためには、JNI (Java Native Interface) を使用する必要があります。

さて、あなたの質問に移りますHow to tap native decoder to decode raw video bitstream?

Android 4.0 バージョン以前では、Android は Java レイヤーで基礎となるビデオ デコーダーへのアクセスを提供しませんでした。OMX デコーダーと直接やり取りするには、ネイティブ コードを記述する必要があります。これは可能ですが、OMX の動作方法と、NDK を使用してこの OMX をアプリケーションにマップする方法についての知識が必要になるため、簡単ではありません。

4.1(Jelly Beanバージョン)では、AndroidはJAVA APIを通じてアプリケーションレベルでハードウェアアクセラレーションデコーダへのアクセスを提供するようです。新しいAPIの詳細については、http://developer.android.com/about/versions/android-4.1.html#マルチメディア

おすすめ記事