-
Notifications
You must be signed in to change notification settings - Fork 778
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
正方形录制 #14
Comments
我觉得你似乎搞错了一样东西,filter中的drawFrame只是渲染了视频画面。但是渲染的画面大小和坐标都是你手动来调整的,也就是说你要做的是调整VertexCoords 和 TextureCoords的坐标,默认情况下,VertexCoords 和 TextureCoords的坐标是0.0-1.0的,也就是根据长宽比来录制的,如果你要进行正方形录制,比如最靠近的4:3的1440 x 1080、1024 x 768等分辨率,合适的1:1分辨率太少了,然后调整录制的TextureCoords坐标,裁剪掉上下超出的部分,裁剪的方式就是重新计算VertexCoords 和 TextureCoords的坐标,filter中的drawFrame方法用到的两个坐标都是可以重新计算的,记住不要放在绘制时计算,会影响预览帧率的,你可以在绘制的空档时间内计算。我觉得你要理解顶点坐标和纹理坐标分别有什么用的,不然以后你要加入动态贴纸的话,你还是不会做的。预览画面的话,有两种方案,一种是在FrameLayout上面覆盖一层遮罩。另一种是在输出画面的DisplayFilter上做裁剪处理,然后再调整显示的位置。至少在用SurfaceView + EGL、GLSurfaceView的情况下,没太好的办法,用TextureView 可以灵活一些,但会有1~3帧的延迟,一般很少会用这个做相机的。目前市面上用得最多的就是SurfaceView + EGL或者直接用GLSurfaceView。 |
感谢解惑,不然还不知道该怎么谷歌... |
估计谷歌也没有相关的内容,你要找OpenGLES的坐标渲染方式,自己写一个,然后理解一下,顶点坐标和纹理坐标分别调大调小之后,会出现什么现象。这是实现正当时裁剪以及动态贴纸中跟随人脸缩放最核心了的地方,剩下的都是业务逻辑的代码了。
发自我的小米手机
在 Tliuer <notifications@github.com>,2018年4月17日 下午12:54写道:
感谢提供的思路,不然还不知道该怎么谷歌...
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub<#14 (comment)>, or mute the thread<https://github.com/notifications/unsubscribe-auth/AK7ZPJik9C9kKEWB_v7bPbHmIOfrg9gLks5tpXWRgaJpZM4TXmAm>.
|
@CainKernel 通过坐标的方式调整预览画面这种只是改变了预览的样子 ,并没有改变录制的时候视频尺寸 , 这个录制尺寸最终还是由 camera 支持的尺寸来决定的 我理解的对吧 |
如果你把预览的尺寸是通过调整坐标得到的话,在录制的时候,还需要调整录制的Filter,因为我用了SharedContext的方式,用到了OpenGLES的多线程渲染了,所以在录制的时候,也要根据你的实力需求做处理,在EncoderManager里面还有一个mRecordFilter的绘制阶段,这个阶段是多线程处理的,录制输出部分跟预览部分显示部分我拆分了,主要是用来防止预览帧率降低的,只需要把输出部份分开预览和录制,不需要再从头绘制一遍了。美颜相机和Camera360等应用都在用类似的多线程录制方案。如果你用GLSurfaceView的话,注意SharedContext释放的问题。
发自我的小米手机
在 erlei <notifications@github.com>,2018年4月17日 下午5:31写道:
@CainKernel<https://github.com/CainKernel> 通过坐标的方式调整预览画面这种只是改变了预览的样子 ,并没有改变录制的时候视频尺寸 , 这个录制尺寸最终还是由 camera 支持的尺寸来决定的 我理解的对吧
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub<#14 (comment)>, or mute the thread<https://github.com/notifications/unsubscribe-auth/AK7ZPHq0JfCkAnHXVkKspoUXtY8P4oFTks5tpbZVgaJpZM4TXmAm>.
|
最后输出,调整坐标是裁掉没必要显示的部分。简单来说就是在0-1顶点坐标内只显示你要的正方形,由于0-1表示了SurfaceView的宽高,所以要调整它的大小,让它0-1变成长宽相等。然后,将TexureCoords坐标上下多余部分不要,所以此时的纹理坐标上下部分就不是0-1了,比如4:3的情况下,上下的坐标就是0.125-0.875<tel:01250875>。意思就是将纹理坐标将左右0-1,上下0.125-0.875<tel:01250875>部分贴到顶点坐标0-1上,这样就能显示出正方形了。
发自我的小米手机
在 erlei <notifications@github.com>,2018年4月17日 下午5:31写道:
@CainKernel<https://github.com/CainKernel> 通过坐标的方式调整预览画面这种只是改变了预览的样子 ,并没有改变录制的时候视频尺寸 , 这个录制尺寸最终还是由 camera 支持的尺寸来决定的 我理解的对吧
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub<#14 (comment)>, or mute the thread<https://github.com/notifications/unsubscribe-auth/AK7ZPHq0JfCkAnHXVkKspoUXtY8P4oFTks5tpbZVgaJpZM4TXmAm>.
|
感谢这波技术支持,昨天了解了顶点坐标和纹理坐标后已经做好了,和大佬下面的思路一样 |
不用客气。其实OpenGLES 用起来并不难,刚开始接触的时候,因为没经验没思路,然后又没人指导,所以无从下手,我当初写这个项目的时候也是为了能给后来者提供一些的思路的。 |
这里有一个非常简洁的录制demo OpenGL + GLSurfaceView + Camera 实现录制。 sdk>18 MediaCodec 通过参数设置实现, 内部原理还没有细看。 修改方法:
这里选取了摄像头支持的最接近的 分辨率设置: 最关键地方 修改如下: 打印如下 这里目前自己还有几点疑问 没有弄清楚: 5.视频会保存到 sdcard/Movies/AVRecSample/ 目录下。输出了正方形的 第4步最关键的修改。 |
你好, 我这里也需要按特定比例预览和裁剪视频, 看了下你上面的解释,我有些疑惑。比如这里我需要1:1裁剪,然后我选了相机支持的尺寸768 * 1024, 然后预览尺寸是1080 * 1080,viewport也是1080*1080 然后在adjustCoordinateSize中, 我直接把纹理坐标调整如下: |
顶点坐标不一定要调整啊,顶点坐标和纹理坐标调整一个就行,通常只调纹理坐标。比例相同,还需要做啥裁剪?比例都一样了,绘制的纹理就没有多余的图像数据,自然不需要做任何裁剪操作啊。
发自我的小米手机
在 charles <notifications@github.com>,2019年3月25日 下午7:14写道:
你好, 我这里也需要按特定比例预览和裁剪视频, 看了下你上面的解释,我有些疑惑。比如这里我需要1:1裁剪,然后我选了相机支持的尺寸768 * 1024, 然后预览尺寸是1080 * 1080,viewport也是1080*1080 然后在adjustCoordinateSize中, 我直接把纹理坐标调整如下:
textureCoord = new float[] {
0f, 0.125f,
1f, 0.125f,
0f, 0.875f,
1f, 0.875f
};
这样预览和最后录制就是1:1的正方形了。
你上面说“也就是说你要做的是调整VertexCoords 和 TextureCoords的坐标”, 这里为什么需要调整顶点坐标?
另外是不是相机图片比例和预览比例及viewport比例相同是不是不用做任何调整?我打印了下3:4和9:16这两种情况下,其实你顶点坐标和纹理坐标都没有变的
—
You are receiving this because you modified the open/close state.
Reply to this email directly, view it on GitHub<#14 (comment)>, or mute the thread<https://github.com/notifications/unsubscribe-auth/AK7ZPLqihZApQSG0RAxfwne1teDoxgMeks5vaK-ogaJpZM4TXmAm>.
|
哦, 是这样啊, 那调整顶点坐标是不是一样的处理, 只是说顶点的范围是[-1, 1]而已, 然后按比例取这个范围的值? |
你好,我最近也遇到了同样的问题,我通过改变纹理坐标,但是有些还是不对,能告诉一下你的实现方式吗 @icepring |
问一下大佬,如何把预览画面切割成正方形,视频保存的时候也保存为正方形
@CainKernel
The text was updated successfully, but these errors were encountered: