USB摄像头录像增加动态时间水印记录

Posted 红尘六欲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了USB摄像头录像增加动态时间水印记录相关的知识,希望对你有一定的参考价值。

USB摄像头录像增加动态时间水印记录

修改基于开源项目saki4510t/UVCCamera中的usbCameraTest8

MTK android10上测试正常

使用方法
运行后,点击左下角按钮,授权后点击中间那个透明小相机按钮开始录像,再点一次透明小相机停止录像,录像文件保存在/sdcard/Movies/USBCameraTest/目录下

隐藏预览

1.修改usbCameraTest8/src/main/res/layout/activity_main.xml

<com.serenegiant.widget.UVCCameraTextureView
  android:id="@+id/camera_view"
  android:layout_width="1dp"
  android:layout_height="1dp"
  android:layout_centerInParent="true" />

2.为了确保隐藏在设置个透明,修改usbCameraCommon/src/main/java/com/serenegiant/widget/UVCCameraTextureView.java

public UVCCameraTextureView(final Context context, final AttributeSet attrs) 
  this(context, attrs, 0);
  if(!isPreview)
    this.setAlpha(0);


public UVCCameraTextureView(final Context context, final AttributeSet attrs, final int defStyle) 
  super(context, attrs, defStyle);
  setSurfaceTextureListener(this);
  if(!isPreview)
    this.setAlpha(0);

修改onDrawFrame不进行预览

public final void onDrawFrame() 
				//if(DEBUG)Log.d(TAG,"onDrawFrame");
				mEglSurface.makeCurrent();
				if(useNew) 
					GLES30.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
					GLES30.glEnable(GLES20.GL_BLEND); //打开混合功能
					GLES30.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); //指定混合模式
					GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
				
				// update texture(came from camera)
				mPreviewSurface.updateTexImage();
				// get texture matrix
				mPreviewSurface.getTransformMatrix(mStMatrix);
				if(useNew)
					GLES30.glViewport(0, 0, mViewWidth, mViewHeight); //设置视口为整个surface大小
				// notify video encoder if it exist
				if (mEncoder != null) 
					// notify to capturing thread that the camera frame is available.
					if (mEncoder instanceof MediaVideoEncoder)
						((MediaVideoEncoder)mEncoder).frameAvailableSoon(mStMatrix);
					else
						mEncoder.frameAvailableSoon();
				
				if(isPreview) 
					if (useNew) 
						mFrameRect.drawFrame(mTexId, mStMatrix); // 画图
						//mFrameRect.drawFrame(mTexId, mStMatrix,mSignTexId); // 画图
						//GLES30.glViewport(0, 0, 240, 363); // x, y, width, height. 设置绘制的视口位置/大小
						//Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/123.jpg");
						//int waterId = TextureHelper.loadBitmapTexture(bitmap);
						//mWaterSign.drawFrame(waterId);
						//bitmap.recycle();
					 else 
						// draw to preview screen
						mDrawer.draw(mTexId, mStMatrix, 0);
						//mDrawer.draw(waterId, mStMatrix, 0);
						//mDrawer.draw(mSignTexId, mStMatrix, 0);
					
				
				mEglSurface.swap();

录像增加动态时间水印

新增加的文件usbCameraCommon/src/main/java/com/serenegiant/encoder/MyRenderHandler.java,这个文件和RenderHandler是一样的,只是增加了动态时间水印部分
主要修改handleDraw函数

public void handleDraw(final int tex_id, final float[] tex_matrix) 
//    		if (DEBUG) Log.i(TAG_THREAD, "draw");
  if (tex_id >= 0 && mTargetSurface != null) 
    mTargetSurface.makeCurrent();
    if(useNew) 
    GLES30.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
    GLES30.glEnable(GLES30.GL_BLEND); //打开混合功能
    GLES30.glBlendFunc(GLES30.GL_ONE, GLES30.GL_ONE_MINUS_SRC_ALPHA); //指定混合模式
    GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    mFrameRect.drawFrame(tex_id, tex_matrix); // 画图

    Bitmap bitmap = getBitmap();
    int text_y = mHeight - (bitmap.getHeight() / 2) - TEXT_X;
    GLES30.glViewport(TEXT_X, text_y, bitmap.getWidth(), bitmap.getHeight()); // x, y, width, height. 设置绘制的视口位置/大小
    //GLES30.glViewport(0, 0, 180, 180); // x, y, width, height. 设置绘制的视口位置/大小
    //int waterId = TextureHelper.loadBitmapTexture(bitmap);
    waterSignHelper.loadBitmap(bitmap);
    mWaterSign.drawFrame(waterTexture);
    bitmap.recycle();
   else 
      mDrawer.draw(tex_id, tex_matrix, 0);
  
    mTargetSurface.swap();
  

刚开始使用的int waterId = TextureHelper.loadBitmapTexture(bitmap);这个会全内存占用量不断升高,录不了几分钟就得崩溃,后面新增加了waterSignHelper,发现显示能是正常的.

录像视频旋转修改usbCameraCommon/src/main/java/com/serenegiant/gles/FrameRect.java中FULL_RECTANGLE_COORDS变量,已经定义好了四个旋转方向

    private static final float FULL_RECTANGLE_COORDS_0[] = 
            -1.0f, -1.0f,   // 0 bottom left
            1.0f, -1.0f,   // 1 bottom right
            -1.0f,  1.0f,   // 2 top left
            1.0f,  1.0f,   // 3 top right
    ;

    private static final float FULL_RECTANGLE_COORDS_1[] = 
            -1.0f, 1.0f,   // 0 bottom left
            -1.0f, -1.0f,   // 1 bottom right
            1.0f,  1.0f,   // 2 top left
            1.0f,  -1.0f,   // 3 top right
    ;

    private static final float FULL_RECTANGLE_COORDS_2[] = 
            1.0f, 1.0f,   // 0 bottom left
            -1.0f, 1.0f,   // 1 bottom right
            1.0f,  -1.0f,   // 2 top left
            -1.0f,  -1.0f,   // 3 top right
    ;

    private static final float FULL_RECTANGLE_COORDS_3[] = 
            1.0f, -1.0f,   // 0 bottom left
            1.0f, 1.0f,   // 1 bottom right
            -1.0f,  -1.0f,   // 2 top left
            -1.0f,  1.0f,   // 3 top right
    ;

private static final float[] FULL_RECTANGLE_COORDS = FULL_RECTANGLE_COORDS_0;

参考了最下面那个链接,基本是没看懂,抱着试一试的态度最后改好了,完全没理解.哈哈.

源码地址

具体流程与原理参考下面这个链接

参考

OpenGL.ES在Android上的简单实践

以上是关于USB摄像头录像增加动态时间水印记录的主要内容,如果未能解决你的问题,请参考以下文章

USB摄像头录像增加动态时间水印记录

怎么才能用c#实现usb摄像头录像啊,😂急用

ROS usb_cam 编译问题

大华录像机无访问权限设置方法

屏幕录像的由来 历史或者说 汇总

Unity实现摄像头录像功能