3

ユーザーがビデオを視聴し、必要に応じてフルスクリーンで開き、デフォルトのビューに戻ることができるビデオアプリに取り組んでいます。私は ExoPlayer を使用していましたが、最近の説明のためにデフォルトの MediaPlayer に切り替えました。

プレーヤーのサーフェスを「その場で」変更する必要があります。アクティビティ間でビデオを表示するために同じプレーヤーを使用する必要があり、画像を表示するのに遅延はありません。Exoplayer を使用して、デコーダーは次のキーフレームが空の Surface にピクセルを描画するのを待ちます。

したがって、同じサーフェスを使用する必要があるため、毎回新しいサーフェスをプッシュする必要はなく、サーフェスをビューの親にアタッチするだけです。Surface は同じままでかまいませんが、SurfaceView をデタッチして別のアクティビティから取得し、再アタッチすると、内側の Surface が破棄されます。

では、異なるアクティビティ間で同じ Surface を維持する方法はありますか? サービス付き?

質問が理解するのが少し奇妙であることは知っています。指定された部分がリクエストであるとコメントで説明します。

4

1 に答える 1

4

通常、SurfaceView または TextureView に関連付けられている Surface は、Activity が停止すると破棄されます。この動作を回避することができます。

1 つのアプローチが TextureView に組み込まれており、アーキテクチャ ドキュメントで説明されており、 Grafikaの「ダブル デコード」アクティビティで示されています。アクティビティの目的は、画面の回転によってアクティビティが再開される間、まったく一時停止せずに、ビデオのペアを再生し続けることです。コードに従うと、SurfaceTexture を存続させるために からの戻り値がどのように使用されるか、およびTextureView#setSurfaceTexture()が SurfaceTexture を新しいビューにどのようにアタッチするかを確認できます。これにはちょっとしたコツがあります -- で発生する必要があり、 で発生する必要はありません-- しかし、それはかなり簡単です。onSurfaceTextureDestroyed()setSurfaceTexture()onCreate()onSurfaceTextureAvailable()

この例では、ビデオの再生に MediaCodec 出力を使用していますが、出力に Surface を使用するものでも同じように機能します。単に SurfaceTexture から Surface を作成するだけです。

OpenGL ES に深く入り込むことを気にしない場合は、ビューやアクティビティから独立して独自の SurfaceTexture を作成し、それを現在の SurfaceView に自分でレンダリングすることができます。Grafika の「カメラからのテクスチャ」アクティビティは、カメラからのライブ ビデオでこれを行います (ただし、アクティビティの再起動後も維持しようとはしません)。

于 2015-02-26T16:58:44.747 に答える