我正在学习关于Grafika的"连续捕捉"活动,它是关于用MediaCodec录制视频。
活动源代码在https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java
程序使用SurfaceTexture对象接收来自相机的数据,并使用这个SurfaceTexture对象创建2个EGLSurface对象,一个EGLSurface对象将数据提供给MediaCodec,另一个将数据提供给SurfaceView用于相机预览。MediaCodec将数据编码为h264数据,MediaMuxer obj将h264数据写入mp4文件。
但是有一个问题,相机支持的预览尺寸是landspace (width> height),如1920*1080、1440*1080、720*480等。通常情况下,我们在录制视频时,手机是竖着拍的,所以我们应该使用API: Camera.setDisplayOrientation(90)将图片旋转为竖着拍,然后录制竖着拍的视频。
但是我想用手机拍一个风景视频,我必须裁剪相机的每一帧。我的方法是剪掉每一帧图片的底部和顶部,保留图片的中间部分,那么左边的图片将是一个风景。
但是我不熟悉opengl,我不知道如何裁剪SurfaceTexture数据。有哪个擅长英语的人能给我一些帮助吗?
查看"texture from camera"活动。请注意,它允许您以各种方式操作图像,特别是"缩放"。"缩放"是通过修改纹理坐标来完成的。
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]
,然后渲染到一个正方形而不是矩形。