問題タブ [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.
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 から設定されるビデオの長さ、エンコードなどを知っていれば、これを予測する方法を知っている人はいますか?
例
誰かがこれの例を知っていますか? アイデアが完全に独創的だとは思いませんが、それらの多くは世の中に見られず、そうであればクローズド ソースです。例は大いに役立ちます。
前もって感謝します
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。
android - createScreenCaptureIntent が結果を返さない
新しい Android Lollipop MediaProjection API を処理しようとしています。
(少なくとも私の在庫のSamsung Galaxy S4 jfltexxでは)画面をキャプチャする許可を取得する意図を開始すると(ProjectionManager.createScreenCaptureIntent()
)、「今後onActivityResult
確認しない」をオンにしない限り、結果が得られないことがわかりました前の試み...
結果の処理:
許可ダイアログはうまく表示されていますが、アクティビティが非表示になり、onActivityResult
.
何がうまくいかないのですか?
android - USB経由でWebブラウザにミラーリングするAndroid MediaProjection画面
Android 画面をデスクトップ Web ブラウザにミラーリングしたい。サンプル アプリのおかげで、MediaProjection を使用して画面をキャプチャできます。
しかし、次の部分は難しいものです - キャプチャしたデータをデスクトップに送信します! ADBポートフォワーディングでデスクトッププログラムへのHTTP接続を確立するテクニックは知っていますが、FPSは非常に低いと思います。
このキャプチャされた画面データをデスクトップにストリーミングするにはどうすればよいですか? 速度を確保するには、Android 側でどのような接続が必要で、どのコーデックが必要ですか?
ありがとう
android - VirtualDisplay のサイズ変更時にサーフェスのサイズを変更する
少し前に私はこの質問をしましたが、回答がありました。
Surface
答えが示唆するように仲介者を実装しましたが、別の問題に遭遇しました。アプリケーション中のある時点で、VirtualDisplay
解像度を変更できます。Surface
そのため、.の解像度の変化に合わせて仲介のサイズも更新したいと思いVirtualDisplay
ます。setDefaultBufferSize
これが基にSurface's
なるへの単純な呼び出しであることを望んでいましSurfaceTexture
たが、うまくいかないようです。
私は仲介者を解放し、Surface
新しいSurfaceTexture
ものを作成することを試してみましたが、出力サーフェスをVirtualDisplay
null に設定し、可能であれば回避したい他の同期手順を実行する必要があります。
Surface
作成後に/のサイズを動的に更新する方法はありSurfaceTexture
ますか?
アップデート:
私はVirtualDisplay.setSurface(null)
一緒に呼び出してから、仲介者がテクスチャのサイズを変更するVirtualDisplay.resize(newSize.width, newSize.height)
ためのコールバックを処理するスレッドにメッセージを送信してから、そのセット呼び出しが終了するまでメインスレッドにセカンダリスレッドをポーリングさせてから呼び出してみましたSurfaceTexture
setDefaultBufferSize
VirtualDisplay.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 空間への変換が何らかの形で壊れていることは問題ではないことを示しています。私は問題があることに傾いていますeglSwapBuffers
Surface
MediaCodec
MediaCodec
Surface
VirtualDisplay
Surface
VirtualDisplay