0

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

最初,我设法成功地录制了有声视频,并在顶部绘制了水印,但是由于我需要纵向视频,因此视频的方向错误。为了实现这一点,我曾经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 个不连续的帧可能是这样的。

好框架 坏帧

4

1 回答 1

2

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

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);
}
于 2019-11-20T12:02:09.363 回答