android yuv加水印_Android Camera录制视频添加水印
通常用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录制视频添加水印相关推荐
- android yuv加水印_Android Camera添加预览水印
前言 在SurfaceView初步以及Camera初步中我介绍了如何使用SurfaceView以及如何使用SurfaceView来预览Camera画面,接下来我就来介绍下如何给Camera添加水印效果 ...
- android yuv加水印_Android-Camera添加水印(最简单)
思路: 我的实时视频流需要加水印,我的解决思路是:将水印图片转换成YUV格式,在Camera中onPreviewFrame中将获取到的视频流做一个叠加 1:水印转YUV //从drawble中获取水印 ...
- android yuv加水印_在Android采集视频过程中增加水印功能实现
CSDN旧文搬迁! 在Android采集视频过程中增加水印,并且水印包含一个变化的时间戳,这里考虑方案实现的时候,就想到了ffmpeg,ffmpeg包含很多filter能实现水印添加的功能. 基本实现 ...
- 视频加水印,怎么给视频加水印?
视频加水印,怎么给视频加水印?现在是全民自媒体的时代,很多人在各种视频平台都都自己的主页,会将自己拍摄制作的原创视频分享到上面,让大家一起欣赏.这时候如果你发布的视频上没有添加水印,那么视频可能会被别 ...
- Camera 录制视频 掉帧、退帧
录制出来的视频帧率有问题 30帧录制出来的不够,出现丢帧. 退帧的问题 1. 录制出来的掉帧 .预览不容易看出 (预览看不出来,因为预览绘制实际是 来什么我绘制什么,但是编码器不一样) 1.1 视频模 ...
- Android自定义view之仿微信录制视频按钮
本文章只写了个类似微信的录制视频的按钮,效果图如下: 一.主要的功能: 1.长按显示进度条,单击事件,录制完成回调 2.最大时间和最小时间控制 3.进度条宽度,颜色设置 二.实现 ...
- ffmpeg分割视频,制作gif图,加水印、去水印,视频拼接
一.分割视频 进入ffmpeg的目录: (1)执行从0分钟开始,剪切5分钟: ./ffmpeg -ss 00:00:00 -i /111/Movies/a2009.mp4 -t 00:05:00 a2 ...
- android 拍照 录视频教程,手机如何录制视频,详细录制教程分享给大家
很多人不知道手机上自带的屏幕录制功能怎么用,其实很简单,今天小编就来分享一下,到底手机上自带的屏幕录制功能怎么用,以iPhone和安卓这两种类型的手机为例,有需要的可以试试. 1.iphone录屏 很 ...
- android 照片加水印,Android 实现图片加水印或logo
我们常常会遇到为图像加水印或logo的需求,一般可以通过三方库或者软件实现,但其实加水印非常简单,仅用一个函数即可实现. 实现思路,逐一计算水印和原图重叠部分的像素点的RGBA分量: float pe ...
最新文章
- OLAP和OLTP的区别(基础知识)
- 【大牛疯狂教学】cdhkafka打开的文件描述符临界阈值
- 复现经典:《统计学习方法》​第 11 章 条件随机场
- JQuery中的ID选择器
- 【转】同步的HttpClient使用详解
- Android架构师之路-oop
- 那些让人惊叹的命令执行效果
- RestTemplate 发送文件
- 惠普局域网共享打印机设置_打印机共享怎么设置 惠普打印机共享设置步骤介绍【详解】...
- 九种流行木马的发现和清除
- WEB测试工具---死链接检测工具xenu
- C++实现简单五子棋游戏
- 银行卡号编码规则及其应用
- 利用cookie实现搜索记录
- scipy中使用linalg.inv函数计算矩阵的逆矩阵
- linux命令小记(grep、awk、sed)
- 在线音频巨头的新角逐与新平衡
- Web前端和后端之区分
- 算法每日一题——第六天——干草堆(差分)
- java操作文件之文件重命名
热门文章
- 为何一个主机ip可以ping通,nmap扫描结果却说主机不在线
- [计算机毕业设计]模糊聚类算法
- ubuntu18.04下lvm2磁盘合并
- Matlab画柱状图(二维)
- ToB 服务的交付能力如何优化 75%?
- 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class
- Linux /etc/fstab文件详解
- Excel一个单元格中输入度分秒转换成小数(如256.3246(读256度32分46秒))
- C++打卡19-【排序模板】归并排序
- 【python读取excel文件保存为矩阵形式】