Matrix.rotateM 导致视频中的 Camera2 OpenGL 随机故障

Camera2 OpenGL random glitches in video caused by Matrix.rotateM

我使用了 Grafika 应用程序并将其修改为使用 Camera2 API 而不是旧的 API。我需要使用 OpenGL 解决方案,因为我需要在视频顶部绘制水印,而 Grafika 真的很有用。不幸的是,我的输出视频以错误的方向随机录制 "flickers" 帧。我正在寻求解决闪烁问题,或者至少了解它发生的原因。

本来我成功录了视频,有声音,上面画了水印,但是视频方向错了,我要的是竖屏视频。为了实现这一点,我使用 MediaMuxer.serOrientationHint() 将输出文件配置为纵向,并对变换矩阵应用旋转以确保 OpenGL 帧以纵向绘制,见下图:

private void handleFrameAvailable(float[] transform, long timestampNanos) {

    mVideoEncoder.drainVideoEncoder(false);

    Matrix.rotateM(transform, 0, 270, 0, 0, 1); //Added these to rotate video frames
    Matrix.translateM(transform, 0, -1, 0, 0); //Added these to rotate video frames

    mFullScreen.drawFrame(mTextureId, transform);

    //...drawing of watermark happens here...//

    if (VERBOSE) { Log.e(TAG,"HandleVideo: "+timestampNanos); }
    mInputWindowSurface.setPresentationTime(timestampNanos);
    mInputWindowSurface.swapBuffers();
}

请参见下面的常规框架和故障框架。在一个5秒的视频中,大约有20-30个不连续的帧可能是这样的。

如果您不将变换重置为单位矩阵,那么您将在每一帧上累积变换。 尝试:

Matrix.setIndentityM(transform, m);

在应用平移和旋转之前。

此外,可能是方向:

if (AppSetting.getValue(activity, Config.ORIENTATION, "").equalsIgnoreCase("Portrait")) {
    Matrix.rotateM(mTmpMatrix, 0, 270, 0, 0, 1);
    Matrix.translateM(mTmpMatrix, 0, -1, 0, 0);
}