通常用Camera 采集视频 得到预览数据,使用mediaCodec获取视频数据,用mediaMuxer进行音视频的混流,

如果想要添加水印很简单:

1、拿到相机预览的帧数据

2、将帧数据转为Bitmap

3、在Bitmap上添加水印(文字或者图片)

4、将图片转为帧数据

然后继续混流,效果如下:

拿相机预览的数据很简单:

关键在第二步,帧数据转为bitmap常规是这样做的  但是这种做法很耗时会导致视频卡顿:

YuvImage image = new YuvImage(dst, ImageFormat.NV21, CameraSettings.SRC_IMAGE_WIDTH,CameraSettings.SRC_IMAGE_HEIGHT, null)

ByteArrayOutputStream stream = new ByteArrayOutputStream();

image.compressToJpeg(new Rect(0, 0, CameraSettings.SRC_IMAGE_WIDTH,CameraSettings.SRC_IMAGE_HEIGHT), 100, stream);

Bitmap bitmapAll = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());

比较好的做法是使用 RenderScript的内联函数 可以更加高效的将帧数据转为bitmap:

public class MyClass {

private RenderScript rs;

private ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic;

private Type.Builder yuvType, rgbaType;

private Allocation in, out;

public MyClass(Context context) {

rs = RenderScript.create(context);

yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));

}

public Bitmap nv21ToBitmap(byte[] nv21, int width, int height){

if (yuvType == null){

yuvType = new Type.Builder(rs, Element.U8(rs)).setX(nv21.length);

in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);

rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(width).setY(height);

out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);

}

in.copyFrom(nv21);

yuvToRgbIntrinsic.setInput(in);

yuvToRgbIntrinsic.forEach(out);

Bitmap bmpout = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

out.copyTo(bmpout);

return bmpout;

}

}

所以第二步、第三步可以这样使用:

/**

* 将拿到的预览帧数据转为bitmap添加水印 再讲bitmap转为帧数据

* @param dst 预览的帧数据

* @return

*/

private byte[] dealByte(byte[] dst) {

// YuvImage image = new YuvImage(dst, ImageFormat.NV21, CameraSettings.SRC_IMAGE_WIDTH,CameraSettings.SRC_IMAGE_HEIGHT, null)

// ByteArrayOutputStream stream = new ByteArrayOutputStream();

// image.compressToJpeg(new Rect(0, 0, CameraSettings.SRC_IMAGE_WIDTH,CameraSettings.SRC_IMAGE_HEIGHT), 100, stream);

// Bitmap bitmapAll = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());

Bitmap bitmapAll = myClass.nv21ToBitmap(dst, CameraSettings.SRC_IMAGE_WIDTH,

CameraSettings.SRC_IMAGE_HEIGHT);

Bitmap bitmapAllNew=bitmapAll.copy(Bitmap.Config.ARGB_8888,true);

Canvas canvas = new Canvas(bitmapAllNew);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setColor(Color.WHITE);

paint.setTextSize(80);

canvas.drawText("毕哥制作", CameraSettings.SRC_IMAGE_WIDTH/2, 100, paint);

byte[] newBytes = bitmapToNv21(bitmapAllNew,CameraSettings.SRC_IMAGE_WIDTH, CameraSettings.SRC_IMAGE_HEIGHT);

if(newBytes!=null){

return newBytes;

}else{

return null;

}

}

bitmap转为帧数据

public static byte[] bitmapToNv21(Bitmap src, int width, int height) {

if (src != null && src.getWidth() >= width && src.getHeight() >= height) {

int[] argb = new int[width * height];

src.getPixels(argb, 0, width, 0, 0, width, height);

return argbToNv21(argb, width, height);

} else {

return null;

}

}

最后再将帧数据 通过mediaCodec编码,再用mediaMuxer进行音视频混流即可

android yuv加水印_Android Camera录制视频添加水印相关推荐

  1. android yuv加水印_Android Camera添加预览水印

    前言 在SurfaceView初步以及Camera初步中我介绍了如何使用SurfaceView以及如何使用SurfaceView来预览Camera画面,接下来我就来介绍下如何给Camera添加水印效果 ...

  2. android yuv加水印_Android-Camera添加水印(最简单)

    思路: 我的实时视频流需要加水印,我的解决思路是:将水印图片转换成YUV格式,在Camera中onPreviewFrame中将获取到的视频流做一个叠加 1:水印转YUV //从drawble中获取水印 ...

  3. android yuv加水印_在Android采集视频过程中增加水印功能实现

    CSDN旧文搬迁! 在Android采集视频过程中增加水印,并且水印包含一个变化的时间戳,这里考虑方案实现的时候,就想到了ffmpeg,ffmpeg包含很多filter能实现水印添加的功能. 基本实现 ...

  4. 视频加水印,怎么给视频加水印?

    视频加水印,怎么给视频加水印?现在是全民自媒体的时代,很多人在各种视频平台都都自己的主页,会将自己拍摄制作的原创视频分享到上面,让大家一起欣赏.这时候如果你发布的视频上没有添加水印,那么视频可能会被别 ...

  5. Camera 录制视频 掉帧、退帧

    录制出来的视频帧率有问题 30帧录制出来的不够,出现丢帧. 退帧的问题 1. 录制出来的掉帧 .预览不容易看出 (预览看不出来,因为预览绘制实际是 来什么我绘制什么,但是编码器不一样) 1.1 视频模 ...

  6. Android自定义view之仿微信录制视频按钮

    本文章只写了个类似微信的录制视频的按钮,效果图如下:            一.主要的功能: 1.长按显示进度条,单击事件,录制完成回调 2.最大时间和最小时间控制 3.进度条宽度,颜色设置 二.实现 ...

  7. ffmpeg分割视频,制作gif图,加水印、去水印,视频拼接

    一.分割视频 进入ffmpeg的目录: (1)执行从0分钟开始,剪切5分钟: ./ffmpeg -ss 00:00:00 -i /111/Movies/a2009.mp4 -t 00:05:00 a2 ...

  8. android 拍照 录视频教程,手机如何录制视频,详细录制教程分享给大家

    很多人不知道手机上自带的屏幕录制功能怎么用,其实很简单,今天小编就来分享一下,到底手机上自带的屏幕录制功能怎么用,以iPhone和安卓这两种类型的手机为例,有需要的可以试试. 1.iphone录屏 很 ...

  9. android 照片加水印,Android 实现图片加水印或logo

    我们常常会遇到为图像加水印或logo的需求,一般可以通过三方库或者软件实现,但其实加水印非常简单,仅用一个函数即可实现. 实现思路,逐一计算水印和原图重叠部分的像素点的RGBA分量: float pe ...

最新文章

  1. OLAP和OLTP的区别(基础知识)
  2. 【大牛疯狂教学】cdhkafka打开的文件描述符临界阈值
  3. 复现经典:《统计学习方法》​第 11 章 条件随机场
  4. JQuery中的ID选择器
  5. 【转】同步的HttpClient使用详解
  6. Android架构师之路-oop
  7. 那些让人惊叹的命令执行效果
  8. RestTemplate 发送文件
  9. 惠普局域网共享打印机设置_打印机共享怎么设置 惠普打印机共享设置步骤介绍【详解】...
  10. 九种流行木马的发现和清除
  11. WEB测试工具---死链接检测工具xenu
  12. C++实现简单五子棋游戏
  13. 银行卡号编码规则及其应用
  14. 利用cookie实现搜索记录
  15. scipy中使用linalg.inv函数计算矩阵的逆矩阵
  16. linux命令小记(grep、awk、sed)
  17. 在线音频巨头的新角逐与新平衡
  18. Web前端和后端之区分
  19. 算法每日一题——第六天——干草堆(差分)
  20. java操作文件之文件重命名

热门文章

  1. 为何一个主机ip可以ping通,nmap扫描结果却说主机不在线
  2. [计算机毕业设计]模糊聚类算法
  3. ubuntu18.04下lvm2磁盘合并
  4. Matlab画柱状图(二维)
  5. ToB 服务的交付能力如何优化 75%?
  6. 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class
  7. Linux /etc/fstab文件详解
  8. Excel一个单元格中输入度分秒转换成小数(如256.3246(读256度32分46秒))
  9. C++打卡19-【排序模板】归并排序
  10. 【python读取excel文件保存为矩阵形式】