問題タブ [android-mediaprojection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
947 参照

android - MediaProjection の最後の X 分間をバッファリングする最も効率的な方法は何ですか?

効率的な解決策を考えるのに少し苦労しています。私が予見しているいくつかの問題があります。最初のものは...

OOM 防止

過去 30 秒または 5 分が必要な場合は実行可能ですが、過去 30 分または 1 時間、あるいはすべてが必要な場合はどうすればよいでしょうか? バイトバッファを保持するということは、それを RAM に格納することを意味します。100 メガバイトを超えるデータを格納することは、仮想メモリの自殺のように聞こえます。

では、以前に記録されたメディアの Y 時間 (たとえば 30 秒) を tmp ファイルでディスクに保存するとどうなるでしょうか。それは潜在的に機能する可能性があり、mp4パーサーのようなライブラリを使用して、終了時にすべてを連結できます。でも...

30 分の価値がある場合、30 秒のクリップが約 60 個あります。これは、SD カードを焼き尽くすのに最適な方法のように思えます。それが問題ではないとしても、100 以上のファイルを 1 つに連結するのに必要な時間は想像できません。

私が調査してきたことから、ローカルソケットを使用して次のようなことをすることを考えていました...

MediaRecorder -> setOutputFile(LocalSocket.getFD())

次に、ローカルソケットで...

LocalSocket -> FileOutputStream -> write(data, position, bufsiz) -> flush()

バックグラウンド スレッドが位置とバッファの書き込みと追跡を処理する場所。

これは純粋に疑似コードであり、これをテストするにはまだ十分ではありません。これで正しい方向に進んでいますか? 私が考えていることから、これは上書きされるファイルを1つだけ保持します。Y 秒に 1 回しか書き込まれないため、IO オーバーヘッドが最小限に抑えられ、消費する RAM の量も最小限に抑えられます。

ビデオの長さからバッファ サイズ

要求されたビデオ サイズからバッファのサイズを取得するにはどうすればよいですか。長い動画は小さいのに短い動画は巨大な動画がいくつかあるので、不思議です。したがって、これを正確に判断する方法がわかりません。Media Recorder から設定されるビデオの長さ、エンコードなどを知っていれば、これを予測する方法を知っている人はいますか?

誰かがこれの例を知っていますか? アイデアが完全に独創的だとは思いませんが、それらの多くは世の中に見られず、そうであればクローズド ソースです。例は大いに役立ちます。

前もって感謝します

0 投票する
3 に答える
2842 参照

android - android mediaprojection スクリーンショットに黒いフレームが含まれています

次のように、MediaProjection を使用して画面を記録する作業を行っています。

問題は、キャプチャされた画像に下の画像のような黒いフレームが含まれることです。

ここに画像の説明を入力

編集

上記の問題は、ビットマップ操作で解決できます。

ただし、デバイスの記録を実装するMediaProjectionためSurfaceViewに適用できるソリューションを探しています。ImageReader

0 投票する
2 に答える
2716 参照

android - Android から MediaProjection API を使用して、Android デバイスで出力されるシステム オーディオを録音する方法は?

Android から MediaProjection API を使用して、Android デバイスで出力されるシステム サウンドを録音する方法を教えてください。録音したいシステムサウンドは、一部のユーザーアプリ、スピーカー、またはヘッドセット、Android デバイスから出力されます。

注意:

「Android から MediaProjection API を使用して画面を記録またはキャプチャしたくはありませんが、システム サウンドを記録したいのです。」!

「Android から Media Projection API を使用する方法を説明する Java のコード行もお願いします。」

MediaProjection API の Web ページは次のとおりです: http://developer.android.com/intl/pt-br/reference/android/media/projection/MediaProjection.html (ポルトガル語 - ブラジル語)。また、英語ではhttp://developer.android.com/reference/android/media/projection/MediaProjection.htmlです。

助けてくれてありがとう。

よろしくお願いします、
dsfbi_13052013。

0 投票する
1 に答える
1463 参照

android - createScreenCaptureIntent が結果を返さない

新しい Android Lollipop MediaProjection API を処理しようとしています。

(少なくとも私の在庫のSamsung Galaxy S4 jfltexxでは)画面をキャプチャする許可を取得する意図を開始すると(ProjectionManager.createScreenCaptureIntent())、「今後onActivityResult確認しない」をオンにしない限り、結果が得られないことがわかりました前の試み...

結果の処理:

許可ダイアログはうまく表示されていますが、アクティビティが非表示になり、onActivityResult.

何がうまくいかないのですか?

0 投票する
0 に答える
1092 参照

android - USB経由でWebブラウザにミラーリングするAndroid MediaProjection画面

Android 画面をデスクトップ Web ブラウザにミラーリングしたい。サンプル アプリのおかげで、MediaProjection を使用して画面をキャプチャできます。

しかし、次の部分は難しいものです - キャプチャしたデータをデスクトップに送信します! ADBポートフォワーディングでデスクトッププログラムへのHTTP接続を確立するテクニックは知っていますが、FPSは非常に低いと思います。

このキャプチャされた画面データをデスクトップにストリーミングするにはどうすればよいですか? 速度を確保するには、Android 側でどのような接続が必要で、どのコーデックが必要ですか?

ありがとう

0 投票する
2 に答える
1147 参照

android - 歪んだスクリーンショットを生成する MediaProjection

なんとかスクリーンショットを取得できましたが、結果は次のようになります。

作成されたスクリーンショット

オリジナル:

オリジナル

これは、いくつかのソースから取得した私のコードです。

0 投票する
0 に答える
1185 参照

android - VirtualDisplay のサイズ変更時にサーフェスのサイズを変更する

少し前に私はこの質問をしましたが、回答がありました。

Surface答えが示唆するように仲介者を実装しましたが、別の問題に遭遇しました。アプリケーション中のある時点で、VirtualDisplay解像度を変更できます。Surfaceそのため、.の解像度の変化に合わせて仲介のサイズも更新したいと思いVirtualDisplayます。setDefaultBufferSizeこれが基にSurface'sなるへの単純な呼び出しであることを望んでいましSurfaceTextureたが、うまくいかないようです。

私は仲介者を解放し、Surface新しいSurfaceTextureものを作成することを試してみましたが、出力サーフェスをVirtualDisplaynull に設定し、可能であれば回避したい他の同期手順を実行する必要があります。

Surface作成後に/のサイズを動的に更新する方法はありSurfaceTextureますか?

アップデート:

私はVirtualDisplay.setSurface(null)一緒に呼び出してから、仲介者がテクスチャのサイズを変更するVirtualDisplay.resize(newSize.width, newSize.height)ためのコールバックを処理するスレッドにメッセージを送信してから、そのセット呼び出しが終了するまでメインスレッドにセカンダリスレッドをポーリングさせてから呼び出してみましたSurfaceTexturesetDefaultBufferSizeVirtualDisplay.setSurface(surfaceFromSecondaryThread)

これは時々機能します。それ以外の場合、テクスチャはすべて緑色で、その上に灰色のバーがあります (これは私の glClearColor でもあります。ここで見られるように関連しているかどうかはわかりません)。時々、現在の画面イメージが重複して表示されたり、VirtualDisplay. ということで、タイミングの問題のようですが、どのタイミングを待てばいいのかわかりません。状態のドキュメントsetDefaultBufferSize:

For OpenGL ES, the EGLSurface should be destroyed (via eglDestroySurface), made not-current (via eglMakeCurrent), and then recreated (via eglCreateWindowSurface) to ensure that the new default size has taken effect.

問題は、コードが SurfaceTexture/Surface から EGLSurface を作成しないため、それを破棄する方法がないことです。プロデューサー ( VirtualDisplay) がそうしていると思いますが、EGLSurface に到達するための公開 API はありません。

[更新 2] したがって、問題 (バー付きの緑色の画面、破損、おそらく私のglClearColor緑色が原因) が表示された場合、に書き込むglReadPixels前にを実行すると、緑色のピクセルが読み取られます。これは、からに書き込まれた情報が破損している (および破損したままである)、またはOpenGL テクスチャから移動するときに YUV 空間から RGBA 空間への変換が何らかの形で壊れていることは問題ではないことを示しています。私は問題があることに傾いていますeglSwapBuffersSurfaceMediaCodecMediaCodecSurfaceVirtualDisplaySurfaceVirtualDisplay