Android Opengl录像时添加时间水印
时间: 2023-10-09 10:06:55 浏览: 60
要在 Android OpenGL 录像中添加时间水印,可以按照以下步骤进行:
1. 创建一个带有时间文本的 Bitmap,可以使用 Canvas 在 Bitmap 上绘制时间文本。
2. 将 Bitmap 转换为纹理,使用 OpenGL 的纹理功能绑定 Bitmap 的像素数据到一个纹理对象上。
3. 在录像前,使用 OpenGL 的渲染功能将时间水印纹理绘制在场景中。
4. 开始录像,将渲染后的场景帧保存下来。
5. 在下一帧渲染前,将时间水印纹理重新绘制,更新时间文本。
6. 重复步骤 4 和 5 直到录像结束。
需要注意的是,在添加时间水印时,需要对纹理坐标进行适当的设置,以确保时间水印正确地绘制在画面上。同时,还需要考虑时间水印的位置和样式,以使其不影响录像内容的可视性。
相关问题
Android Opengl录像时添加时间水印的代码
以下是一个简单的示例代码,用于在Android Opengl录像时添加动态时间水印:
```java
private void initGL() {
// 创建OpenGL ES context
mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1);
int[] configAttribs = {
EGL14.EGL_SURFACE_TYPE, EGL14.EGL_PBUFFER_BIT,
EGL14.EGL_BLUE_SIZE, 8,
EGL14.EGL_GREEN_SIZE, 8,
EGL14.EGL_RED_SIZE, 8,
EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
EGL14.EGL_NONE
};
EGLConfig[] configs = new EGLConfig[1];
int[] numConfigs = new int[1];
EGL14.eglChooseConfig(mEGLDisplay, configAttribs, 0, configs, 0, configs.length, numConfigs, 0);
int[] pbufferAttribs = {
EGL14.EGL_WIDTH, 640,
EGL14.EGL_HEIGHT, 480,
EGL14.EGL_NONE,
};
mEGLSurface = EGL14.eglCreatePbufferSurface(mEGLDisplay, configs[0], pbufferAttribs, 0);
int[] contextAttribs = {
EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
EGL14.EGL_NONE
};
mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT, contextAttribs, 0);
EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext, 0);
}
private void drawFrame() {
// 绘制图像到离屏渲染缓冲区
// ...
// 绘制时间水印
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glUseProgram(mTimeWatermarkProgram);
int timeUniform = GLES20.glGetUniformLocation(mTimeWatermarkProgram, "u_Time");
GLES20.glUniform1f(timeUniform, System.currentTimeMillis() / 1000f);
int fontUniform = GLES20.glGetUniformLocation(mTimeWatermarkProgram, "u_Font");
GLES20.glUniform1i(fontUniform, mFontTextureUnit);
int colorUniform = GLES20.glGetUniformLocation(mTimeWatermarkProgram, "u_Color");
GLES20.glUniform4fv(colorUniform, 1, mColor, 0);
// 绘制文字或者位图
// ...
// 将渲染好的图像数据保存为视频文件
// ...
}
```
这段代码假设已经有了OpenGL ES 2.0的context,以及渲染图像的代码。在`initGL()`方法中创建离屏渲染缓冲区,以及编译、链接时间水印的GLSL程序。在`drawFrame()`方法中,先渲染图像到离屏渲染缓冲区,然后绘制时间水印,最后将渲染好的图像数据保存为视频文件。需要注意的是,在绘制时间水印之前需要调用`glClear()`方法清空当前帧的内容。同时,需要在GLSL程序中添加时间、字体、颜色等uniform变量,并在Java代码中设置相应的值。
具体的实现细节还需要根据实际需求进行调整,例如绘制文字或者位图的具体实现方式,以及保存视频文件的代码实现方式。
Android Opengl录像时添加时间水印 有android代码吗
是的,以下是在 Android OpenGL 录像中添加时间水印的示例代码:
```java
// 创建一个带有时间文本的 Bitmap
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(32);
canvas.drawText(getCurrentTime(), x, y, paint);
// 将 Bitmap 转换为纹理
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
// 渲染场景
while (recording) {
// 渲染场景
renderScene();
// 在场景中绘制时间水印
GLES20.glUseProgram(watermarkProgram);
GLES20.glUniformMatrix4fv(watermarkMatrixHandle, 1, false, matrix, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
GLES20.glUniform1i(watermarkTextureHandle, 0);
GLES20.glEnableVertexAttribArray(watermarkPositionHandle);
GLES20.glVertexAttribPointer(watermarkPositionHandle, 2, GLES20.GL_FLOAT, false, 0, watermarkVertices);
GLES20.glEnableVertexAttribArray(watermarkTexCoordHandle);
GLES20.glVertexAttribPointer(watermarkTexCoordHandle, 2, GLES20.GL_FLOAT, false, 0, watermarkTexCoords);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
GLES20.glDisableVertexAttribArray(watermarkPositionHandle);
GLES20.glDisableVertexAttribArray(watermarkTexCoordHandle);
// 保存帧
saveFrame();
}
// 释放资源
bitmap.recycle();
GLES20.glDeleteTextures(1, textures, 0);
```
其中,`getCurrentTime()` 方法用于获取当前时间文本;`renderScene()` 方法用于渲染场景;`watermarkProgram` 是添加时间水印的 OpenGL 着色器程序;`watermarkMatrixHandle` 是着色器程序中表示变换矩阵的 Uniform 句柄;`watermarkTextureHandle` 是着色器程序中表示纹理采样器的 Uniform 句柄;`watermarkPositionHandle` 和 `watermarkTexCoordHandle` 是着色器程序中表示顶点位置和纹理坐标的 Attribute 句柄;`watermarkVertices` 和 `watermarkTexCoords` 分别是时间水印的顶点位置和纹理坐标数组;`saveFrame()` 方法用于将当前帧保存为视频帧。