android – 使用MediaCodec编码之前为Grafika的“连续捕获”活动裁剪视频

我正在学习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文件.

但是存在一个问题,相机支持的预览尺寸是空间(宽度>高度),例如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]

然后在正方形而不是矩形上渲染它.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...