問題タブ [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.

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

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に適用しました。それが役に立てば幸い!

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

android - Android MediaCodec - 各フレームの長い処理

最初ははっきりしなかったので編集してください:

Android MediaCodec を使用して、既存のビデオ ファイル (videoBefore.MP4) から各フレームを取得し、フレームを処理し (ぼかしのように)、各フレームを新しいビデオ ファイル (videoAfter.MP4) にエンコードしようとしています。
新しい動画は、最初の動画と同じ長さにする必要があります。

たった 1 つの条件:
すべてのフレームは無制限の時間で処理する必要があります。つまり、10 秒のビデオの処理に 1 分かかる可能性があります。

これまでのところ、リアルタイムで実行できる迅速な処理 (ブルー シフトなど) の例だけを見てきました。
ビデオからフレームを取得し、それを処理するために「時間をかけて」、同じフレームレートまたはフレームタイミングで新しいビデオを保持する方法はありますか?

*オーディオも保存できればもっと良いかもしれませんが、フレームが重要です。

ありがとう!

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

android - MediaCodec.dequeInputBuffer / dequeOutputBuffer での IllegalStateException

PNG ファイルを 1 スライスのビデオ クリップに変換しようとしているので、プロジェクトを開始するだけです。

それを実現するためのコードがあったのは:-

そして、ここに例外ログがあります:-

Emulator Api Level 19 を実行しようとした場合:

ただし、Galaxy Tab 3 (デバイス) で実行すると:

このプロジェクトを開始した参考文献:-

前もって感謝します。

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

java - Mediacodec でデコードし、OpenCV で作業する

私は、OpenCV を使用する android 用のアプリに取り組んでいます。

私は mp4 ビデオ ファイルを持っています。そこから 1920x1080 の 300 フレームを読み取り、それらに対して画像処理操作を行う必要があります。

大規模な検索の後、最後にこの例のみを見つけました。

私の問題は、フレームを読み取ってデバイスのメモリに保存するか、OpenCV マトリックスに変換するだけの簡単なことです。

これは私の試みです(最後に説明してください):

この例では、フレームを読み取り、それらを Surface として表示します。

ビットマップ/マトリックスとして保存したり、デバイスに保存したりするには、何を変更する必要がありますか?

ありがとう

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

android - Nexus 5 での GLSurfaceView フレームレートの問題

カメラ フレームを GLSurfaceView に表示しながら MediaCodec でエンコードするサンプル アプリケーション (完全なソース) があります。

Systrace は、毎秒 30 回の描画呼び出しが行われていることを確認します。

シストレースのスクリーンショット

ただし、スクリーンレコードの記録 ( .mp4YouTube ) は、見かけのフレームレートがかなり低いことを示しています。

簡単に言えば、私のエンコードと表示のループは次のことを行います。

  • MediaCodec Surface 入力 EGL コンテキストを現在の状態にします
  • カメラ フレームを MediaCodec EGL サーフェスに描画します
  • GLSurfaceView EGL コンテキストを現在の状態にします
  • 同じカメラ フレームを GLSurfaceView に描画します

Galaxy Nexus LTE および Nexus 7 (どちらも AOSP 4.4 を使用) では、アプリケーションは期待どおりに動作します。これまでのところ、Nexus 5 だけが、画面に描画されるフレーム数と見かけのフレーム数との間にこの不一致を経験しています...

私が狂っていないことを祈ります。

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

android - MediaCodec と MediaExtractor を使用してビデオをデコードおよびコーディングする

ビデオを一連のビットマップにデコードして、それらを変更できるようにし、それらを圧縮して Android のビデオ ファイルに戻す必要があります。

getFrameAtTimeこれを使用して画像シーケンスに保存することでこれを管理する予定です。次に、シーケンス内の画像を変更して、コードをムービーに戻すことができます。しかし、これには2つの問題があります:

  • まず、私が読んだように、これgetFrameAtTimeはサムネイルを作成するためのものであり、正しいフレームを返すことを保証するものではありません。これにより、ビデオが遅延します。
  • 次に、画像の保存と読み込みに時間がかかります。

デコードを行う適切な方法は MediaExtractor を使用することであると読みましたが、これは問題ありませんが、直接レンダリングする例しかありませんsurfaceViewoutputBufferをビットマップに変換する方法はありますか?

APIレベル16以上で動作させるために必要です。

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

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 のみを返します。私はすでにさまざまなタイムアウト、ビットレート、解像度、その他の構成オプションを試しましたが、役に立ちませんでした. 結果は常に同じです。

次のコードを使用して、エンコーダーを初期化します。

選択したカラー形式は次のとおりです。

そして、私はデータを取得します

ご協力いただきありがとうございます!