活动源代码位于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文件.
但是存在一个问题,相机支持的预览尺寸是空间(宽度>高度),例如1920 * 1080,1440 * 1080,720 * 480等.通常,我们在录制视频时以纵向方式拍摄手机,因此我们应该使用API:Camera.setDisplayOrientation(90)将图片旋转为肖像,然后录制肖像视频.
但我想用手中的手机肖像录制风景视频,我必须从相机中裁剪每一帧.我的方法是切断每帧图片的底部和顶部并保留图片的中间部分,然后左图片将是一个景观图片.
但我不熟悉opengl,我不知道如何裁剪SurfaceTexture数据.任何擅长opengl的人都能给我一些帮助吗?
解决方法
ScaledDrawable2D班这样做; rectScale()调用改变了“缩放”,而不是缩放矩形本身.纹理坐标的范围从0.0到1.0(含),getTexCoordArray()方法修改它们以跨越纹理的子集.
要剪切帧,您需要按比例修改纹理坐标.例如,如果输入视频是纵向720×1280,并且您想要720×720,则可以更改此坐标:
[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]
然后在正方形而不是矩形上渲染它.