我使用了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个非连续帧可能像这样。
如果不将变换重置为单位矩阵,则将在每个帧上累积变换。试试:
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);
}