1

私は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 の高品質ビデオでその仕事を行うことができます。表示部分を無効にしようとしましたが、違いはありません

4

0 に答える 0