在使用 MediaCodec 为 Grafika "Continuous Capture" Activity 编码之前裁剪视频

Crop video before encoding with MediaCodec for Grafika's "Continuous Capture" Activity

我正在学习Grafika的"Continuous Capture"Activity,它是关于用MediaCodec录制视频的。

activity 源代码位于 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等。通常我们在录制视频的时候会把phone设置为竖屏,所以我们应该使用API:Camera.setDisplayOrientation(90)把图片旋转成竖屏,然后是竖屏视频会被记录下来。

但是我想用手上的 phone 肖像录制风景视频,我必须从相机中裁剪每一帧。我的方法是把每一帧图片的底部和顶部都剪掉,保留图片的中间,这样左边的图就是风景了。

但是我对opengl不熟悉,不知道如何裁剪SurfaceTexture数据。哪位擅长opengl的可以帮帮我吗?

看看 "texture from camera" activity。请注意,它允许您以各种方式操纵图像,特别是 "zoom"。 "zoom"是通过修改贴图坐标来完成的

ScaledDrawable2D class 这样做; setScale() 调用更改了 "zoom",而不是缩放矩形本身。纹理坐标范围从 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]

然后将其呈现在正方形而不是矩形上。