web-dev-qa-db-ja.com

Androidでハードウェアアクセラレーションビデオデコードを使用する方法

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

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

  1. ffmpeglibstagefright( libstagefrightの概要 )を使用するか、 here のようにOSで直接libstagefrightを使用します。
  2. 特定のハードウェアプラットフォームでOpenMaxを使用します。 samsungデバイスについて および Qualcomm Snapdragonシリーズについて
  3. PVplayer

一部の人々 "say" libstagefrightが唯一の方法であり、クアルコムの人たちは明らかに成功を収めています。

現在、どの方法が機能するのかわかりません。私は今少し混乱しています。すべてが機能するのであれば、ハードウェアに依存しない方法を好むでしょう。

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

とにかく、Rockplayerで「操作」を行い、data\data\com.redirecting\rockplayerのすべての.soライブラリを削除しました。ハードウェアデコードが正常に機能しているときにソフトウェアデコードがクラッシュしました。彼らはどうやってそれをしたのだろうか。ハードウェアアクセラレーションはハードウェアプラットフォームに依存しない可能性があるようです。

誰かがこの問題を解決できますか?または、追加情報またはより詳細な情報を参考にしてください。

31
Glenn Yu

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

OpenMAX AndroidはコーデックインターフェースにOpenMAXを使用します。したがって、すべてのネイティブコーデック(ハードウェアアクセラレーションまたはその他)はOpenMAXインターフェースを提供します。コーデック

NDK Android allow 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を介して、アプリケーションレベルでハードウェアアクセラレータデコーダへのアクセスを提供しているようです。 http://developer.Android.com/about/versions/Android-4.1.html#Multimedia

22
Oak Bytes

MediaExtractor および MediaCodec (これらはNDKでも利用可能です-AMediaExtractorおよびAMediaCodec-ここで.mp4を再生するためのサンプルを参照してください native-codec =)

1
GregoryK

ExoPlayergithub )を使用します。

プラットフォームのMediaPlayerに代わるGoogleが支援するオープンソースプロジェクトです。パイプラインの各コンポーネントは、サンプルソース(カスタムプロトコルからH.26​​4フレームを抽出する方法)からレンダリング(Surface、SurfaceTextureなど)まで拡張可能です。

ニース 使用方法を示すデモアプリ が含まれています。

1
Peter Tran