由Matrix.rotateM引起的视频中的Android Camera2 OpenGL随机故障

问题描述 投票:0回答:1

我使用了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个非连续帧可能像这样。

good framebad frame

android opengl opengl-es-2.0 android-camera2 grafika
1个回答
1
投票

如果不将变换重置为单位矩阵,则将在每个帧上累积变换。试试:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.