我根据连续捕获活动编写了一个演示。我想将视频的第一帧保存为jpeg文件,因此我使用了已经由Grafika编写的saveFrame()函数。该函数的源代码如下: https://github.com/google/grafika/blob/master/src/com/android/grafika/gles/EglSurfaceBase.java
但我发现制作的jpeg图片是颠倒的。这不是我想要的。
在保存帧之前有没有办法旋转画面?
旋转位图不是一个优雅的解决方案,因为我们可能会遇到其他一些情况,例如视频聊天。视频的每一帧都被发送到远程对等体,然后远程人员将看到一个颠倒的视频。所以我们应该在编码之前旋转每一帧。
答案 0 :(得分:1)
您不想旋转框架,您想翻转框架。
这种情况的存在是因为Bitmap认为(0,0)位于左上角,但GLES认为(0,0)位于左下角。 with(changes, message(sprintf("Coords (%i, %i, %i): %i to %i\n",
x, y, time, old, new)))
开始从顶部填充缓冲区,Bitmap认为缓冲区位于底部,因此最终会出现颠倒的图像。
您有两种选择:
glReadPixels()
函数采用drawFrame()
参数,并修改从SurfaceTexture获取的矩阵(如果已设置)。invert
复制整行可能比使用Java代码复制单个字节更好。)答案 1 :(得分:1)
我的实现如下,非常快,不到10毫秒。
private void reverseBuf(ByteBuffer buf, int width, int height)
{
long ts = System.currentTimeMillis();
int i = 0;
byte[] tmp = new byte[width * 4];
while (i++ < height / 2)
{
buf.get(tmp);
System.arraycopy(buf.array(), buf.limit() - buf.position(), buf.array(), buf.position() - width * 4, width * 4);
System.arraycopy(tmp, 0, buf.array(), buf.limit() - buf.position(), width * 4);
}
buf.rewind();
Log.d(TAG, "reverseBuf took " + (System.currentTimeMillis() - ts) + "ms");
}