我正在了解 Grafika 的“连续捕获”活动,它是关于使用 MediaCodec 录制视频。
活动源代码位于https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinouslyCaptureActivity.java 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(宽度>高度)如1920*1080、1440*1080、720*480等。通常我们录制视频时,手机都是竖屏拍摄的,所以我们应该使用API:Camera.setDisplayOrientation(90)将图片旋转为竖屏,然后录制竖屏视频。
但我想用手机肖像录制一个横向视频,我必须裁剪相机中的每一帧。我的方法是把每一帧图片的底部和顶部剪掉,保留图片的中间,那么左边的图片就是风景图片。
但我对opengl不熟悉,我不知道如何裁剪SurfaceTexture数据。有擅长opengl的人可以给我一些帮助吗?
看一下“来自相机的纹理”活动。请注意,它允许您以各种方式操作图像,特别是“缩放”。 “缩放”是通过修改纹理坐标来完成的。
The 缩放Drawable2D https://github.com/google/grafika/blob/master/src/com/android/grafika/ScaledDrawable2d.java类执行此操作;这setScale()
调用更改“缩放”,而不是缩放矩形本身。纹理坐标的范围从 0.0 到 1.0(含),并且getTexCoordArray()
方法修改它们以跨越纹理的子集。
要剪辑帧,您需要按比例修改纹理坐标。例如,如果输入视频为纵向 720x1280,而您想要 720x720,则可以更改坐标:
[0.0, 0.0] [1.0, 0.0]
[0.0, 1.0] [1.0, 1.0]
to this:
[0.0, 280/1280.0] [1.0, 280/1280.0]
[0.0, 1000/1280.0] [1.0, 1000/1280.0]
然后将其渲染在正方形而不是矩形上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)