9

我正在学习 Grafika 的“连续捕获”活动,它是关于使用 MediaCodec 录制视频的。

活动源代码位于https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java

该程序使用一个 SurfaceTexture obj 从相机接收数据,并使用这个 SurfaceTexture obj 创建 2 个 EGLSurface obj,一个 EGLSurface obj 将数据提供给 MediaCodec,另一个将数据提供给 SurfaceView 用于相机预览。MediaCodec 将数据编码为 h264 数据,MediaMuxer obj 将 h264 数据写入 mp4 文件。

但是有一个问题,相机支持的预览尺寸是landspace(宽>高)如1920*1080、1440*1080、720*480等。通常我们在录制视频时手机是纵向的,所以我们应该使用API​​:Camera.setDisplayOrientation(90) 将图片旋转为纵向,然后录制纵向视频。

但是我想用手中的手机人像录制横向视频,我必须从相机中裁剪每一帧。我的方法是把每一帧画面的底部和顶部都剪掉,保留画面的中间,那么左边的画面就是横向的了。

但是我对opengl不熟悉,我不知道如何裁剪SurfaceTexture数据。有擅长opengl的人能给我一些帮助吗?

4

1 回答 1

15

看看“来自相机的纹理”活动。请注意,它允许您以各种方式操纵图像,尤其是“缩放”。“缩放”是通过修改纹理坐标来完成的。

ScaledDrawable2D类执行此操作setScale()调用更改“缩放”,而不是缩放矩形本身。纹理坐标范围从 0.0 到 1.0(含),该getTexCoordArray()方法将它们修改为跨越纹理的子集。

要剪辑帧,您需要按比例修改纹理坐标。例如,如果输入视频是纵向 720x1280,而您想要 720x720,则可以从以下位置更改坐标:

[0.0, 0.0]  [1.0, 0.0]
[0.0, 1.0]  [1.0, 1.0]

对此:

[0.0, 280/1280.0]  [1.0, 280/1280.0]
[0.0, 1000/1280.0] [1.0, 1000/1280.0]

然后将其渲染在正方形而不是矩形上。

于 2015-06-02T16:40:01.517 回答