
まず、例やすべての仕組みに関するストーリーからではなく、開発者がMedia Packでビデオをキャプチャする際によく尋ねる質問への回答から始めます。および「Android 4.4がADB経由でビデオをキャプチャする機能を持っている場合、Media Packを使用する理由は?」
開発者とユーザー向けの理由
1.これは、 Toy Story:Story Theaterなどのアプリケーションの基礎を形成できる使用モデルです。 ユーザーは画面上のオブジェクトを使用してアクションを実行し、アプリケーションはビデオをキャプチャしてファイルに書き込み、ソーシャルネットワークで表示、保存、共有できるようにします。
2.ユーザーにとっての新しい機会は、良いゲームの瞬間を記録して保存することです。これは、ソーシャルネットワークで共有できるレベルを達成する方法です。 開発者にとって、これはアプリケーションを普及させる方法の1つです。
ADBを介したビデオのキャプチャ
この方法との主な違いは、モバイルデバイスをホストに接続する必要がないことです。キャプチャはデバイス上で直接行われ、デバイスを「 ルート化 」する必要はありません。標準のメカニズムが使用されます。 出力はMP4ビデオであり、表示またはネットワークへのダウンロードの準備ができています。
2番目の違いは、ビデオだけでなく、内蔵マイクからオーディオもキャプチャできることです。これにより、アプリケーションからサウンドをキャプチャすることができ、さらに画面で何が起こっているかをコメントすることができます。
Media Packを使用してOpenGLアプリケーションでビデオをキャプチャする
最初のステップは、INDE Media Packをダウンロードしてインストールすることです。その方法については、 この記事で詳しく説明しました。
内部には、アプリケーションに含める必要がある2つのライブラリがあります-android- <version number> .jarおよびdomain- <version number> .jar

すべてのビデオキャプチャ作業は、 GLCaptureクラスによって行われます。 操作の原理は簡単です。独自のサーフェス( Surface )があり、そのコンテンツはフレームにエンコードされ、ビデオに書き込まれます。 アプリケーションは最初に現在のフレームを画面に描画し、次にコンテキストをGLCaptureサーフェスに切り替えてシーンを再度描画します。コンテキストを復元すると、サーフェスの現在のコンテンツがエンコードされ、結果のビデオに書き込まれます。
GLCaptureを使用する前に、以下を準備する必要があります。
- ビデオオプションを設定する
- オーディオ(音を書く必要がある場合)
- ビデオの保存場所を指定します(ファイルパス)
- 表面を構成する
// GLCapture capturer; … // capturer = new GLCapture(new AndroidMediaObjectFactory());
ビデオオプションを構成する
// // String videoMimeType = “video/avc”; // int videoFrameWidth = 640; // int videoFrameHeight = 480; // int videoBitRate = 5000; // int videoFrameRate = 30; // int videoIFrameInterval = 1; VideoFormatAndroid videoFormat = new VideoFormatAndroid(videoMimeType, videoFrameWidth, videoFrameHeight); videoFormat.setVideoBitRateInKBytes(videoBitRate); videoFormat.setVideoFrameRate(videoFrameRate); videoFormat.setVideoIFrameInterval(videoIFrameInterval); // apturer.setTargetVideoFormat(videoFormat);
オーディオ設定
音を書く必要がない場合は、この手順をスキップできます。
// // Audio String audioMimeType = “audio/mp4a-latm”; // int audioSampleRate = 44100; // int audioChannelCount = 1; AudioFormatAndroid audioFormat = new AudioFormatAndroid(audioMimeType , audioSampleRate, audioChannelCount); // apturer.setTargetAudioFormat(audioFormat);
結果のビデオへのパス
String dstPath = “…”; capture.setTargetFile(dstPath);
表面の初期化
最初に使用する前に、表面を初期化する必要があります。これは、
capture.setSurfaceSize(videoFrameWidth, videoFrameHeight)
1つの条件-アクティブなOpenGLコンテキストを持つ関数から呼び出しを行う必要があります。 どこかで
onSurfaceChanged(GL10 gl, int width, int height) onDrawFrame(GL10 gl)
パラメータを設定し、サーフェスを構成したら、ビデオのフレームの保存を開始できます。
最も単純なケースでは、シーンを2回描画することができます-最初に画面に、次に表面に。
方法1:ダブルレンダリング
// render(); // capturer.beginCaptureFrame(); // GLCapture render(); // capturer.endCaptureFrame();
場合によっては、このアプローチはパフォーマンスに影響を与える可能性があります。たとえば、多数のオブジェクト、テクスチャ、ポストフレーム処理を含むシーンの場合です。 二重レンダリングを回避するには、 フレームバッファーを使用できます。
方法2:フレームバッファー
この場合、アルゴリズムは次のとおりです。
- フレームバッファーとそれにバインドされたテクスチャを作成します。
- テクスチャにシーンを描く
- 画面にフルスクリーンテクスチャを描画します
- コンテキストを切り替えて、 GLCaptureの表面にテクスチャを描画します
開発者がこのメソッドを実装する時間を節約するために、フレームバッファを操作するために必要なすべてのコンポーネントをライブラリに含めました。
// - FrameBuffer frameBuffer; // FullFrameTexture texture; // - OpenGL , public void onSurfaceChanged(GL10 gl, int width, int height) { frameBuffer = new FrameBuffer(EglUtil.getInstance()); frameBuffer.setResolution(new Resolution(width, height)); texture = new FullFrameTexture(); }
ご覧のように-作成および初期化する最小限のコード。 必要に応じて、私たちの実装を独自のものに置き換えることができ、制限はありません。
// public void onDrawFrame(GL10 gl) { // frameBuffer.bind(); // renderScene(); // frameBuffer.unbind(); // texture.draw(frameBuffer.getTextureId()); // capture.beginCaptureFrame(); // texture.draw(frameBuffer.getTextureId()); // capture.endCaptureFrame(); }
サンプルを簡略化するために、ビューポートを計算および設定するコードの一部を除外しました。これは、結果のビデオの画面サイズと解像度が一致しない場合にビデオキャプチャを正しく表示するための前提条件です。
Intel INDE Media PackのクラスGameRendererに付属のサンプルアプリケーションで、 サンプルの完全版を見つけることができます。

この例では、ダブルレンダリングとフレームバッファの両方を使用してキャプチャする機能を示し、1秒あたりのフレーム数を表示することで各メソッドのパフォーマンスを評価することもできます。
4月11〜12日、モスクワで、 Digital Octoberは毎年恒例のDroidcon会議を開催します。この会議では、IntelはIAベースのモバイルデバイスのサンプルをスタンドで発表します。 さらに、 インテルINDEのトピックに関するレポート(11日金曜日)とワークショップ(12日土曜日)を開催します。 このイベントに参加する予定がある場合、私たちのそばに立ち寄ることを忘れないでください、それは面白いでしょう!