博客中添加操作过程的录屏

为了对操作过程有个详细的展示,最简单的操作就是对我们的操作过程进行录屏,但是常规录制的视频可能会很大并且很多帧是没有用的,这里使用LICEcap对录屏做成GIF格式的动态图。可以直接上传到CSDN中,当然CSDN也是支持直接上传视频的。

LICEcap

根据官网介绍LICEcap是一个轻量级的高性能录屏工具,可以调节录频窗口大小对桌面某一部分进行录屏然后将录屏保存为**.GIF或者.LCF格式的动态图片,其中.LCF保存格式是该工具特有的保存格式,相对比于GIF格式具有给更高的压缩率,并且每帧图片更清晰。该格式使用REAEPR**(LICcap团队自己开发的软件)打开并可以转成其它视频格式文件。

环境

  • 支持Windows(Windows XP/Vista/7/8/8.1/10/11)
  • 支持OSX(macOS 10.7-12.x Intel 64-bit or M1)

特点

  • 选择录屏窗口大小
  • 支持.GIF图片格式,自有格式为.LCF
  • 支持录屏过程中对其中一帧添加文字
  • 支持记录鼠标按键
    详细情况以及下载参考官网Cockos
    源码地址https://github.com/justinfrankel/licecap

安装与使用

  1. 安装
    下载完成后是**.exe**可执行文件,直接双击一键安装,我将安装地址修改到D盘。安装完成后桌面会有一个对应的快捷方式。
  2. 使用
  • 选中快捷方式直接双击打开,鼠标放到边框按住左键拖动来调整窗口大小,调整到合适位置后,点击右下角的Record按钮,进入设置选项中,1对应的是保存的名字;2保存的类型,GIF或者LCF格式,其中LCF是该软件自有的保存格式;3其中title frame添加标题,elspsed time添加倒计时显示,mouse button press选择记录鼠标按键,右侧Control+Alt+P选择开启则同时按下Ctrl+Alt+P暂停录制。
    在这里插入图片描述
  • 添加文字:开始录制后,点击右下角的暂停键Pause,左侧出现Insert按钮,点击进入添加文字
    在这里插入图片描述
    在这里插入图片描述
    在窗口中写入要插入的文字,点击Insert后再点击Close关闭插入窗口,点击Unpause继续录制
    在这里插入图片描述

其他Gif动态录频软件

GifCam

GifCam是另一款录屏Gif动图的软件,其特点是可以将录屏窗口置于其他所有软件窗口之上
官网地址https://blog.bahraniapps.com/gifcam/

ScreenToGif

ScreenToGif该软件带有编辑器,后期处理功能强大
官网地址https://www.screentogif.com/
源码地址https://github.com/NickeManarin/ScreenToGif/

Captura

Captura除了支持任意窗口大小录制以及鼠标外,还支持键盘按键、声音;可用于截屏和录屏。
官网地址https://mathewsachin.github.io/Captura/
源码地址https://github.com/MathewSachin/Captura

recordit

recordit支持Windows和Mac,功能比较简洁,仅支持录频制成GIF动图。
官网地址https://recordit.co/

参考

知乎-分享5款免费好用的Gif录屏神器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 Android 录屏添加水印的一种方法是使用 MediaProjection API 和 Canvas 绘图。以下是实现的步骤: 1. 获取 MediaProjection 对象,在 Android 5.0 及以上版本,需要用户授权获取 MediaProjection 对象,可以使用 startActivityForResult() 方法获取。 2. 创建 VirtualDisplay 对象,将 MediaProjection 对象传入,设置录制的屏幕宽高和 dpi。 3. 创建 Surface 对象,将 VirtualDisplay 对象的 surface 传入。 4. 在 Surface 上绘制屏幕内容,可以使用 Canvas 绘图实现。 5. 绘制水印,可以使用 Bitmap、Paint、Canvas 等方法实现。 6. 将绘制好的帧数据传入 MediaCodec 编码成视频数据。 7. 最后将视频数据保存到文件或者上传到服务器。 以下是示例代码: ```java // 获取 MediaProjection 对象 private void startScreenCapture() { MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION); } // 获取 MediaProjection 授权结果 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == REQUEST_MEDIA_PROJECTION) { if (resultCode == RESULT_OK) { // 创建 VirtualDisplay 对象 mediaProjection = ((MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE)).getMediaProjection(resultCode, data); virtualDisplay = mediaProjection.createVirtualDisplay("ScreenCapture", screenWidth, screenHeight, screenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null); } } } // 在 Surface 上绘制屏幕内容和水印 private void drawOnSurface(Canvas canvas) { // 绘制屏幕内容 canvas.drawBitmap(screenBitmap, 0, 0, null); // 绘制水印 Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(24); paint.setAntiAlias(true); canvas.drawText("Watermark", 10, 30, paint); } // 将帧数据传入 MediaCodec 编码成视频数据 private void encodeFrame() { try { mediaCodec = MediaCodec.createEncoderByType("video/avc"); MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", screenWidth, screenHeight); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate); mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, framerate); mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); surface = mediaCodec.createInputSurface(); mediaCodec.start(); ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers(); ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers(); MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); boolean isEOS = false; while (!isEOS) { int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1); if (inputBufferIndex >= 0) { long presentationTimeUs = System.nanoTime() / 1000; Bitmap bitmap = getBitmapFromSurface(); if (bitmap != null) { Canvas canvas = surface.lockCanvas(null); drawOnSurface(canvas); surface.unlockCanvasAndPost(canvas); } ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; inputBuffer.clear(); inputBuffer.put(screenBuffer); if (isEOS) { mediaCodec.queueInputBuffer(inputBufferIndex, 0, 0, presentationTimeUs, MediaCodec.BUFFER_FLAG_END_OF_STREAM); } else { mediaCodec.queueInputBuffer(inputBufferIndex, 0, screenBuffer.length, presentationTimeUs, 0); } int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0); while (outputBufferIndex >= 0) { ByteBuffer outputBuffer = outputBuffers[outputBufferIndex]; byte[] outData = new byte[bufferInfo.size]; outputBuffer.get(outData); if (bufferInfo.flags == MediaCodec.BUFFER_FLAG_CODEC_CONFIG) { configByte = new byte[bufferInfo.size]; configByte = outData; } else if (bufferInfo.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME) { byte[] keyframe = new byte[bufferInfo.size + configByte.length]; System.arraycopy(configByte, 0, keyframe, 0, configByte.length); System.arraycopy(outData, 0, keyframe, configByte.length, outData.length); outData = keyframe; } if (outData != null) { // 保存视频数据 } mediaCodec.releaseOutputBuffer(outputBufferIndex, false); outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0); } } } } catch (Exception e) { e.printStackTrace(); } } // 从 Surface 获取 Bitmap private Bitmap getBitmapFromSurface() { Bitmap bitmap = null; try { bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); surface.lockCanvas(null).drawBitmap(bitmap, 0, 0, null); surface.unlockCanvasAndPost(canvas); } catch (Exception e) { e.printStackTrace(); } return bitmap; } ``` 需要注意的是,由于 Android 录屏功能和实现方式在不同的版本有所不同,因此上述代码仅供参考,实际应用可能需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值