9

たくさんの検索と数日間の実験の後、私は簡単な解決策を見つけられませんでした。

ユーザーが画面上のペットと対話するアプリを開発しています。彼にそれをビデオとして保存させたいと思います。

アプリ自体の画面をキャプチャする「簡単な」方法はありますか?

回避策を見つけました(毎秒いくつかのビットマップを保存してからエンコーダーに渡す)が、重すぎるようです。15fpsのフレームレートでも満足します

それは可能だと思われます。つまり、これを行う同様のアプリがあります。これは「トーキングトム」と呼ばれます。

4

1 に答える 1

2

それは本当にあなたがあなたの「ペットビュー」を実装する方法に依存します。キャンバスに描いていますか?OpenGl ES?通常のAndroidビュー階層?

とにかく、コメントの1つが言ったような魔法の「recordScreenToVideo()」はありません。

必要がある:

  • 「フレーム」を表すビットマップを取得します。これは、ビューの実装方法によって異なります。自分で描画する場合(CanvasまたはOpenGL)、生のピクセルバッファをフレームとして保存します。通常のビュー階層を使用する場合は、AndroidのonDrawをサブクラス化し、キャンバスに表示される「フレーム」を保存します。システムがonDrawを呼び出す頻度は、画面の実際の「フレームレート」以上になります。必要に応じて、後でフレームを複製して15fpsのビデオを提供します。

  • フレームをエンコードします。あなたはすでにそれを行うためのメカニズムを持っているようです、あなたはそれをより効率的にする必要があります。

エンコーディングを最適化する方法:

  • ビットマップ(フレーム)をキャッシュし、後でエンコードします。これは、予想されるビデオが比較的短い場合にのみ機能します。そうでない場合は、ストレージが不足します。
  • アプリが実際に生成するフレームレートでのみ記録し(描画方法によって異なります)、エンコーダーパラメーターを使用して15 fpsのビデオを生成します(実際には1秒あたり15フレームを提供しません)。
  • 現在のデバイスに合わせて品質設定を調整します。アプリの起動時に非表示のCPUサイクルテストを実行し、いくつかのしきい値を定義することで実行できます。
  • 画面の最も関連性の高い部分のみをエンコードします。
  • 繰り返しになりますが、実際には実装方法によって異なります。「履歴データ」を保存し、それをリアルタイムで実行せずにフレームに変換できる場合は、それが最適です。たとえば、「移動」、「笑顔」、「色の変更」など、ビジネスロジックが何であれ、それについては詳しく説明していません。「ムービーの生成」機能は、この履歴データをフレームシーケンスとして(画面に描画せずに)アニメーション化してからエンコードします。

お役に立てば幸い

于 2013-01-19T18:28:30.060 に答える