2013-12-09 16 views
5

ビデオをビットマップのシーケンスにデコードして、それらを修正してアンドロイドのビデオファイルに戻す必要があります。MediaCodecとMediaExtractorを使ってビデオをデコードしてコード化する

getFrameAtTimeを使用してこれを管理し、画像シーケンスに保存する予定です。その後、シーケンス内の画像を変更し、ムービーに戻すことができます。しかし、私はこれに2つの問題があります:

  • 最初に、私が読む通り、getFrameAtTimeはサムネイルを作成するためのものであり、正しいフレームを返すことを保証するものではありません。これにより、ビデオが遅くなります。
  • 第2に、画像を保存して読み戻すのに時間がかかります。

デコードを行う正しい方法はMediaExtractorを使用することですが、これは問題ありませんが、surfaceViewに直接レンダリングする例があります。 outputBufferをビットマップに変換する方法はありますか?

私はそれが16以上のAPIレベルで動作するようにする必要があります。

答えて

8

有用な例のコレクションは、bigflakeサイトで見つけることができます。特に

ExtractMpegFramesTestはGLESシェーダのフレームを変更する、H.264ストリームをBitmapへのMP4ファイルをデコードする方法を示し、そしてDecodeEditEncodeTest復号と再符号化します。もし生H.264エレメンタリストリームが出て変換することができ

例の多くは、(カラーフォーマット多くの問題を回避する)MediaCodecからSurface入力としてAPI 18に導入された機能を使用し、MediaMuxerMediaCodecの.mp4ファイルへの変換)。一部のデバイスでは、ByteBufferのYUVデータにビデオを抽出し、変更して再エンコードすることができますが、その他のデバイスはAPI 16バージョンMediaCodecによって拒否される独自のYUVカラーフォーマットに抽出されます。

API 18(Android 4.3 "Jellybean" MR2)以降をコーディングすることをおすすめします。

+0

問題は、私はすでにこのサイトを見たということですが、残念ながら私はたとえ16とLVL APIのためにそれを行う必要がありますExtractMpegFramesTest.javaにはAPI 16が必要ですが、ビルドしようとすると少なくとも17 ...必要です。オプションではありません。 –

+0

あなたは険しい戦いをしています。それは一般的に動作する必要がありますか、これは特定のデバイス向けに構築されただけなのでしょうか? (私はExtractMpegFramesTestをチェックします - それは17+から何も必要とは思わなかった) – fadden

+0

これは一般的で、api lvl 16 +にする必要がある問題です...私はgetFrameAtTimeソリューションを保存しないでこのように数回スピードアップしても、まだフレームが2回抽出されるという問題があり、ビデオが遅くなり、どのようにオーディオを追加することができないのでしょうか?ビデオをビットマップに分割し、オーディオ付きの新しいビデオファイルを作成する提案はありますが、16 + –

1

方法onFrameAvailable()は決して呼ばれないという人がいます。さて、リスナーは、メインスレッドとは別のスレッドになければなりません。 (これはSurfaceTexture.IOnFrameAvailableListenerを実装するクラスリスナーです):リスナーはこれを行う設定によく

mSurfaceTexture.SetOnFrameAvailableListener(this); 
関連する問題