問題タブ [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 投票する
0 に答える
1411 参照

android - Android 仮想ディスプレイ リリースでディスプレイが削除されない

私はアンドロイドを使用してVirtual DisplayいますProjection Manager 特定の時間に投影を停止する必要があるため、次のアクションが実行されます

これsurfaceDestroyedは、仮想ディスプレイを裏打ちする面に関連しています。

メディア プロジェクションを再度開始するときに、使用可能なディスプレイが繰り返されると、以前に作成された仮想ディスプレイが使用可能なディスプレイの 1 つとしてリストされたままになります。

仮想ディスプレイの作成と削除を適切に処理するには?

ノート :

以下は、メディア プロジェクションと仮想ディスプレイのセットアップのスニペットです。

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

android - Android Media Projection API を使用した信頼性の高いスクリーン キャプチャ

Media Projection API を使用した実装は問題なく動作します。しかし、キャプチャした画像をファイルに書き込もうとすると、フレームが失われることがよくあります。すべての io コードが別々のスレッドで実行されている場合でも。

キャプチャしたフレームに対してオンライン画像分析を行いたかったため、スクリーンレコードや同様のツールを使用できません。

ネイティブ コードから Android Media Projection メソッドを呼び出す方法はありますか? より良いパフォーマンスを得るには?

キャプチャ プロセス中に io 操作を呼び出さないようにしました。私たちは最後まですべてを記憶に留めました。しかし、30fps でフレームが欠落するという問題がまだ残っています。どうすればそれを避けることができますか?

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

android - Android の VirtualDisplay のサイズ変更

Android の MediaProjection API には、いくつかの問題があります (実際にはもっと多くの問題がありますが、これらはより重大なものです)。グラフィックス アーキテクチャを読んでもあまり役に立たないので、コード フローで何かをスキップしたかどうかを理解しようとしています。

次のように仮定します。

  1. 専用の GL レンダリング スレッドがあり、初期化され、GL テクスチャが生成されています。テクスチャのデフォルトのバッファ サイズを WxH に設定しました。

  2. GL テクスチャを使用して SurfaceTexture を作成し、このサーフェス テクスチャの Surface を作成します。

  3. MediaProjection を介してサイズ WxH の仮想ディスプレイを作成し、そのサーフェスを上記のサーフェスに設定します。

問題 1: すべてが完全に機能する (完全なフレームが正しく表示される) か、そうでない (すべてのフレームが黒い、または各フレームの半分しか表示されない、たとえば、すべてのフレームで同じ半分が表示される、または画面の一部が他の部分に繰り返される)。一部、時には歪んでいることさえあります)。

問題 2: いくつかのフルスクリーン GL ゲームで時間が費やされている間、固定時間 (約 4 分) の後、すべての着信フレームがフリーズします (たとえば、「新しい」フレームを受け取りますが、実際には 1 つの同じ画像です)。 . glReadPixels でそれを読むと、結果が確認されます-問題は、実際の表示がそのフレームをはるかに超えていることです。強制的に「回復」させる唯一の方法は、ステータスバーまたはナビゲーションバーを表示することです。これにより、正しいフレームがすぐに送信され始めます。もちろん、さらに4分後、再び起こります...

問題 3: GL テクスチャに対して setDefaultBUfferSize() も呼び出した後、VirtualDisplay で resize() を呼び出すと、90% のケースで問題 #1 (黒/カット フレーム、他の画面領域のアーティファクト) が発生します。 )

同じスレッドで updateTextureImage -> GL texture draw の一連の呼び出しを使用しているため、通常の理解では、ハーフフルの GL バッファーなどから何らかの方法で読み取っているということは決して起こらないはずです...そうですか?

この問題は、VirtualDisplay を MediaCodec の表面に直接レンダリングすることでもテストしました (カスタム GL は関係ありません) - 同じ動作です。 update実際には、MediaCodec は固定サイズの作成済みサーフェスを持っているため、仮想ディスプレイのサイズを変更することしかできず、エンコーダのサーフェス サイズを変更できないため、バグを再現することはできません。したがって、これは実際にはバグではありません (ただし、このようにしても、それに応じて何らかの方法でサーフェスのサイズを変更する VirtualDisplay )。

仮想ディスプレイを閉じるときに何かが漏れている、または仮想ディスプレイの作成間で正しく初期化されていない、一貫性がないために何かが漏れているように感じます。作成したばかりの表面テクスチャを備えた真新しい仮想ディスプレイを使用した真新しい MediaProjection スクリーン キャプチャ許可により、最終的にハーフカット フレームしか得られず、ポーカー フェイスが大きくなる可能性があります。 ..

PS: これはすべて、Android 6.0.1 を搭載した Nexus 6 で発生しています。

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

android - エミュレーターでの Android スクリーン キャプチャーからの空白の MP4 ビデオ

Android Emulator から画面をキャプチャして .mp4 ファイルに記録しようとしています。仮想ディスプレイを作成し、フレームをエンコーダーにルーティングし、ビデオ チャネルを多重化し、外部ストレージに書き込むという標準的なアプローチを採用しました。ただし、出力された .mp4 ファイルは、再生すると空白の画面になります。デバイスで実行すると、同じコードが機能します。

1 つの観察結果は、BufferInfo.sizefromonOutputBufferAvailable()が常に 13 または 2718 の定数値を持ち、MediaCodecエンコーダーの問題を明確に示していることです。エンコーダーを構成するときにいくつかのパラメーターを変更する必要がありますか?

SoftAVCEncoderもう 1 つの観察結果は、エミュレータで実行するときに a が使用されていることを示す Logcat からのものです。

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

android - 出力 Mediaprojection API android をソケット経由で送信する

Androidの画面をSocket経由でPCと共有したいのですが、Androidのバージョンは問いません。

多くの検索の後に見つけたもの: MediaProjection.createVirtualDisplay から ImageReader から Bitmap へ、そして Socket Network 経由で送信します。どう思いますか?

黒いフレームと次のエラーが表示されます。

これ、これ、これを通り抜けました。

ここで、ImageReader を定義します。

イメージリーダーからビットマップへ:

私もこれを試しましたが、うまくいきませんでした:

ソケットを介してビットマップを送信します。ドローアブルからビットマップを読み取ると機能します。

どんなアドバイスでも大歓迎です。インターネット経由で PC と画面を共有する他の方法があれば、それも大歓迎です。

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

android - Android MediaProjection のパフォーマンスの向上

のパフォーマンスを向上させることが可能かどうかお尋ねしたいと思い MediaProjectionます。

faddenの回答後に編集されました。

アプリの疑似構造:

1) AppCompatActivity のフルスクリーン FrameLayout:

2) SurfaceViewによるカメラプレビュー

3) Camera Preview を FrameLayout に追加する

4) 入力面を作成します。

5) 仮想ディスプレイを作成し、仮想ディスプレイを Surface にレンダリングします。

6)MediaMuxerオーディオ/ビデオ マルチプレクサ ストリームに使用します。

たとえば、10 秒間。録音の:

〜20FPSです。

30FPSが欲しいです。(デバイスは 30 FPS で fullHD を記録できるので、それは可能であると思います。)

私は Android studio 2.0 から画面を記録しようと し
まし た 。


Huawei Honor 4C、Android 5.1.1 ~20 FPS でテスト済み。
Vodafone Smart Ultra 6、Android 5.1.1 でテスト済み、ビデオは最大 40 FPS です。

TinyDancerで FPS を測定してみましたが、録画中に 60 FPS を示しました。

どこが弱点ですか?記録中の CPU 使用率は 10% 未満です。

追加の質問: Android 6 の MediaProjection のパフォーマンスは向上しますか?

(注: オーバーレイ ビューでカメラ プレビューを記録します。)