問題タブ [android-mediacodec]
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 - Surface 入力を使用した MediaCodec: バックグラウンドでの記録
ホスティング アクティビティがバックグラウンドに入ったとき、または画面がオフ/オンになったときに停止しないようにしたいビデオ エンコーディング アプリケーションに取り組んでいます。
私のエンコーダーのアーキテクチャは、優れたCameraToMpegTestの例から派生したもので、カメラ フレームを GLSurfaceView に表示する機能が追加されています (以下の Github リンクを参照)。現在、2 つの状態のソリューションでバックグラウンド レコーディングを実行しています。
GLSurfaceView.Renderer
ホスティング アクティビティがフォアグラウンドにある場合、 への呼び出しごとに 1 つのビデオ フレームをエンコードしonDrawFrame
ます。これにより、レンダラー スレッドのキューに入れられた他のイベントをブロックしないように、GLSurfaceView の EGL 状態にバーストでアクセスできます。ホスティング アクティビティがバックグラウンドに入ると、
onDrawFrame
エンコーディングを停止し、ループ内の別のバックグラウンド スレッドでフレームをエンコードします。このモードは、CameraToMpegTest の例と同じです。
ただし、画面の電源がオフになると、GLSurfaceView の EGLContext が失われ、新しい呼び出しがonSurfaceCreated
発生します。この場合、MediaCodec の入力サーフェスに接続された EGL ウィンドウ サーフェスを再作成する必要があります。残念ながら、この 2 回目の呼び出しでは次のものがeglCreateWindowSurface
生成されます。
呼び出す前に、Android Surface に接続されているすべての EGL リソースを解放します。
MediaCodec の入力 Surface に接続されている EGLSurface を交換する方法はありますか?
テスト アプリケーションの完全なソースはGithubにあります。主な活動。
更新ここで学んだ教訓を、MediaCodec および MediaMuxer クラスに基づいてAndroid 用のビデオ SDKに適用しました。それが役に立てば幸い!
android - Android MediaCodec - 各フレームの長い処理
最初ははっきりしなかったので編集してください:
Android MediaCodec を使用して、既存のビデオ ファイル (videoBefore.MP4) から各フレームを取得し、フレームを処理し (ぼかしのように)、各フレームを新しいビデオ ファイル (videoAfter.MP4) にエンコードしようとしています。
新しい動画は、最初の動画と同じ長さにする必要があります。
たった 1 つの条件:
すべてのフレームは無制限の時間で処理する必要があります。つまり、10 秒のビデオの処理に 1 分かかる可能性があります。
これまでのところ、リアルタイムで実行できる迅速な処理 (ブルー シフトなど) の例だけを見てきました。
ビデオからフレームを取得し、それを処理するために「時間をかけて」、同じフレームレートまたはフレームタイミングで新しいビデオを保持する方法はありますか?
*オーディオも保存できればもっと良いかもしれませんが、フレームが重要です。
ありがとう!
android - MediaCodec.dequeInputBuffer / dequeOutputBuffer での IllegalStateException
PNG ファイルを 1 スライスのビデオ クリップに変換しようとしているので、プロジェクトを開始するだけです。
それを実現するためのコードがあったのは:-
そして、ここに例外ログがあります:-
Emulator Api Level 19 を実行しようとした場合:
ただし、Galaxy Tab 3 (デバイス) で実行すると:
このプロジェクトを開始した参考文献:-
前もって感謝します。
java - Mediacodec でデコードし、OpenCV で作業する
私は、OpenCV を使用する android 用のアプリに取り組んでいます。
私は mp4 ビデオ ファイルを持っています。そこから 1920x1080 の 300 フレームを読み取り、それらに対して画像処理操作を行う必要があります。
大規模な検索の後、最後にこの例のみを見つけました。
私の問題は、フレームを読み取ってデバイスのメモリに保存するか、OpenCV マトリックスに変換するだけの簡単なことです。
これは私の試みです(最後に説明してください):
この例では、フレームを読み取り、それらを Surface として表示します。
ビットマップ/マトリックスとして保存したり、デバイスに保存したりするには、何を変更する必要がありますか?
ありがとう
android - Nexus 5 での GLSurfaceView フレームレートの問題
カメラ フレームを GLSurfaceView に表示しながら MediaCodec でエンコードするサンプル アプリケーション (完全なソース) があります。
Systrace は、毎秒 30 回の描画呼び出しが行われていることを確認します。
ただし、スクリーンレコードの記録 ( .mp4、YouTube ) は、見かけのフレームレートがかなり低いことを示しています。
簡単に言えば、私のエンコードと表示のループは次のことを行います。
- MediaCodec Surface 入力 EGL コンテキストを現在の状態にします
- カメラ フレームを MediaCodec EGL サーフェスに描画します
- GLSurfaceView EGL コンテキストを現在の状態にします
- 同じカメラ フレームを GLSurfaceView に描画します
Galaxy Nexus LTE および Nexus 7 (どちらも AOSP 4.4 を使用) では、アプリケーションは期待どおりに動作します。これまでのところ、Nexus 5 だけが、画面に描画されるフレーム数と見かけのフレーム数との間にこの不一致を経験しています...
私が狂っていないことを祈ります。
android - MediaCodec と MediaExtractor を使用してビデオをデコードおよびコーディングする
ビデオを一連のビットマップにデコードして、それらを変更できるようにし、それらを圧縮して Android のビデオ ファイルに戻す必要があります。
getFrameAtTime
これを使用して画像シーケンスに保存することでこれを管理する予定です。次に、シーケンス内の画像を変更して、コードをムービーに戻すことができます。しかし、これには2つの問題があります:
- まず、私が読んだように、これ
getFrameAtTime
はサムネイルを作成するためのものであり、正しいフレームを返すことを保証するものではありません。これにより、ビデオが遅延します。 - 次に、画像の保存と読み込みに時間がかかります。
デコードを行う適切な方法は MediaExtractor を使用することであると読みましたが、これは問題ありませんが、直接レンダリングする例しかありませんsurfaceView
。outputBuffer
をビットマップに変換する方法はありますか?
APIレベル16以上で動作させるために必要です。
java - MediaCodec H264 エンコーダーが Snapdragon 800 デバイスで動作しない
Android の MediaCodec API を使用して H264 Stream Encoder を作成しました。さまざまなプロセッサを搭載した約 10 種類のデバイスでテストしたところ、Snapdragon 800 を搭載したデバイス (Google Nexus 5 と Sony Xperia Z1) を除いて、すべてのデバイスで動作しました。これらのデバイスでは、SPS と PPS と最初のキーフレームを取得しますが、その後、mEncoder.dequeueOutputBuffer(mBufferInfo, 0) は MediaCodec.INFO_TRY_AGAIN_LATER のみを返します。私はすでにさまざまなタイムアウト、ビットレート、解像度、その他の構成オプションを試しましたが、役に立ちませんでした. 結果は常に同じです。
次のコードを使用して、エンコーダーを初期化します。
選択したカラー形式は次のとおりです。
そして、私はデータを取得します
ご協力いただきありがとうございます!