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