10

ホスティング アクティビティがバックグラウンドに入ったとき、または画面がオフ/オンになったときに停止しないようにしたいビデオ エンコーディング アプリケーションに取り組んでいます。

私のエンコーダーのアーキテクチャは、優れたCameraToMpegTestの例から派生したもので、カメラ フレームを GLSurfaceView に表示する機能が追加されています (以下の Github リンクを参照)。現在、2 つの状態のソリューションでバックグラウンド レコーディングを実行しています。

  • GLSurfaceView.Rendererホスティング アクティビティがフォアグラウンドにある場合、 への呼び出しごとに 1 つのビデオ フレームをエンコードしonDrawFrameます。これにより、レンダラー スレッドのキューに入れられた他のイベントをブロックしないように、GLSurfaceView の EGL 状態にバーストでアクセスできます。

  • ホスティング アクティビティがバックグラウンドに入ると、onDrawFrameエンコーディングを停止し、ループ内の別のバックグラウンド スレッドでフレームをエンコードします。このモードは、CameraToMpegTest の例と同じです。

ただし、画面の電源がオフになると、GLSurfaceView の EGLContext が失われ、新しい呼び出しがonSurfaceCreated発生します。この場合、MediaCodec の入力サーフェスに接続された EGL ウィンドウ サーフェスを再作成する必要があります。残念ながら、この 2 回目の呼び出しでは次のものがeglCreateWindowSurface生成されます。

E/libEGL(18839): EGLNativeWindowType 0x7a931098 already connected to another API

呼び出す前に、Android Surface に接続されているすべての EGL リソースを解放します。

MediaCodec の入力 Surface に接続されている EGLSurface を交換する方法はありますか?

テスト アプリケーションの完全なソースはGithubにあります。主な活動

更新ここで学んだ教訓を、MediaCodec および MediaMuxer クラスに基づいてAndroid 用のビデオ SDKに適用しました。それが役に立てば幸い!

4

1 に答える 1