私はGrafikaの例を試しています。ContinuousCapture
動画をファイル システムに記録し、同時に画面に描画する例に興味があります。私が抱えている問題は、ファイル システムへのビデオの録画が非常に遅いように見えることです。コマ落ちが多く、1 秒あたりのフレーム数はわずか 7 ~ 10 fps です。
メインdrawFrame()
メソッドの中で、
private void drawFrame() {
//Log.d(TAG, "drawFrame");
if (mEglCore == null) {
Log.d(TAG, "Skipping drawFrame after shutdown");
return;
}
// Latch the next frame from the camera.
mDisplaySurface.makeCurrent();
mCameraTexture.updateTexImage();
mCameraTexture.getTransformMatrix(mTmpMatrix);
// Fill the SurfaceView with it.
SurfaceView sv = (SurfaceView) findViewById(R.id.continuousCapture_surfaceView);
int viewWidth = sv.getWidth();
int viewHeight = sv.getHeight();
GLES20.glViewport(0, 0, viewWidth, viewHeight);
mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
drawExtra(mFrameNum, viewWidth, viewHeight);
mDisplaySurface.swapBuffers();
// Send it to the video encoder.
if (!mFileSaveInProgress) {
mEncoderSurface.makeCurrent();
GLES20.glViewport(0, 0, VIDEO_WIDTH, VIDEO_HEIGHT);
Log.d(TAG, "start drawing video");
mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
Log.d(TAG, "finish drawing video");
drawExtra(mFrameNum, VIDEO_WIDTH, VIDEO_HEIGHT);
mCircEncoder.frameAvailableSoon();
mEncoderSurface.setPresentationTime(mCameraTexture.getTimestamp());
mEncoderSurface.swapBuffers();
}
mFrameNum++;
}
主なパフォーマンスのボトルネックは
Log.d(TAG, "start drawing video");
mFullFrameBlit.drawFrame(mTextureId, mTmpMatrix);
Log.d(TAG, "finish drawing video");
2 つのログ間の時間は 130 ミリ秒です。Android MediaRecorder は、30 fps の高品質ビデオでその仕事を行うことができます。表示部分を無効にしようとしましたが、違いはありません