ホスティング アクティビティがバックグラウンドに入ったとき、または画面がオフ/オンになったときに停止しないようにしたいビデオ エンコーディング アプリケーションに取り組んでいます。
私のエンコーダーのアーキテクチャは、優れた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に適用しました。それが役に立てば幸い!