使用camera2 API在视频输出文件中添加文本标签

时间:2017-03-03 20:24:14

标签: android renderscript android-camera2 textureview

我的目标是在录制带Camera2 API的视频(例如日期/时间,用户ID等)后获得的视频输出文件中添加一些文字信息。我已经使用camera API检查了一些有关如何执行此操作的参考资料,但我没有找到有关如何使用Camera2 API实现此目的的任何信息。任何人都可以帮助我吗?

This is what I found for camera API

4 个答案:

答案 0 :(得分:2)

您提供的有关如何使用Camera API实现解决方案的链接也适用于Camera2 API。您应该生成一个GLSurfaceView,其中包含您想要与GLSurfaceView.Renderer一起实现的信息,以OpenGL处理您相机的每一帧。

配置好表面后,您应该从Surface生成新的SurfaceTexture

Surface videoSurface = new Surface(surfaceGLTexture);

之后,您可以createCaptureSessionSurfaceCameraCaptureSession.StateCallback()一起使用CameraDevice.TEMPLATE_RECORD中的CaptureRequest.Builder生成视频预览。

答案 1 :(得分:2)

看看grafica。具体看TextureMovieEncoder.java。将private void drawBox(int posn)中的代码替换为此问题的最佳答案中的代码: Draw text in OpenGL ES 复制在此作为参考:

// Create an empty, mutable bitmap
Bitmap bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_4444);
// get a canvas to paint over the bitmap
Canvas canvas = new Canvas(bitmap);
bitmap.eraseColor(0);

// get a background image from resources
// note the image format must match the bitmap format
Drawable background = context.getResources().getDrawable(R.drawable.background);
background.setBounds(0, 0, 256, 256);
background.draw(canvas); // draw the background to our bitmap

// Draw the text
Paint textPaint = new Paint();
textPaint.setTextSize(32);
textPaint.setAntiAlias(true);
textPaint.setARGB(0xff, 0x00, 0x00, 0x00);
// draw the text centered
canvas.drawText("Hello World", 16,112, textPaint);

//Generate one texture pointer...
gl.glGenTextures(1, textures, 0);
//...and bind it to our array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

//Create Nearest Filtered Texture
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

//Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

//Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

//Clean up
bitmap.recycle();

答案 2 :(得分:0)

同样的方法很有用 - 相机2 API需要Surface绘制,但你可以从SurfaceTexture创建一个:

Surface s = new Surface(mSurfaceTexture);

然后你可以将这个Surface传递给camera2 CameraDevice.createCaptureSession()调用;有关要修改的基本录制应用,请参阅Camera2Video

从GL渲染中,您必须将数据发送到视频编码器。

答案 3 :(得分:0)

FFMPEG提供了太多你可以做你想做的事情。请试试这个工具。可能它会帮助你。我建议你。请检查此链接:

https://stackoverflow.com/a/38299320/3992798