Android 录制视频实时添加水印 求点思路

2020-09-08 10:44:37 +08:00
 Esioner

RT,最近有个需求,需要录制视频,能实时添加水印,网上找了一圈基本上都是基于 camera 的,没找到 camera2 的,英语渣渣,到 stackoverflow 也没找到相关的,所以就想请教一下大家,有没有啥思路可以指点指点

目前已有的思路

  1. 使用 glsurface 进行预览,然后使用 opengles 来进行水印实时添加,用 mediacodec(mediamuxer 、mediacodec) 的相关工具来手动进行编码封装
  2. 使用 camera2 和 imagerender 来把实时帧 (yuv) 通过 jni 来传递给 ffmpeg 来进行对 frame 添加水印再进行封包

以上方案是我在网上找到一些 demo 里看到的并没有真正实现过,所以不一定可行,求大佬们指点迷津

ps: 我需要的是帧水印内容是可以实时动态修改的,例如时间戳等


先行谢过

9941 次点击
所在节点    Android
14 条回复
sharpy
2020-09-08 11:58:38 +08:00
读取 camera 数据,然后用 OpenGL,一路渲染到预览,一路渲染到 codec 提供的 surface 上硬编,还算比较简单
Esioner
2020-09-08 12:38:34 +08:00
@sharpy 感谢回复,那这样的话,高分辨率的视频录制,是不是得把 surface 的宽高也指定成这样?这样的话内存会不会撑不住
sharpy
2020-09-08 13:53:01 +08:00
@Esioner 现在的机器 1080p 一般都撑得住
glumess
2020-09-08 14:27:09 +08:00
方案一可以行的,具体的话,可以到我公众号 [音视频开发进阶] 里面找一下相关文章
Esioner
2020-09-08 15:23:17 +08:00
@glumess 好的,谢谢大佬,我去看看
glumess
2020-09-08 15:33:47 +08:00
@Esioner 也可以到我的博客哦 https://glumes.com ,也有分享哦
LLaMA2
2020-09-08 18:04:19 +08:00
我见过一个特别的技巧。大概如下:
假定水印位置始终固定,且有一部分变动,且变动的部分为一个时间。
那么其实变动的地方提前用占位符 0 占位,然后手动生成一个 1080P 的图片,结者转 YUV,然后自己写个小工具生成 0 1 2 3 4 5 6 7 8 9 等,接着比较生成的 YUV 数据,你会发现绝大多数都是系统的,只有一部分不同,不同的部分就是变动的数字了,然后记下来位置,等下你可以在 camera 的 onFramePreview 中直接操作 byte[]数组了。算是奇技淫巧吧
wnpllrzodiac
2020-09-09 07:43:56 +08:00
@sharpy 正解。camera1 做过方案,2 的话应该差别也不大。离屏渲染 fbo 两次渲染,一次预览,一次编码输出
wnpllrzodiac
2020-09-09 07:45:48 +08:00
@ye4tar 这个一般是摄像头打时间戳用的,海康之类的就是,根据当前像素叠加黑白色(需要反白提高对比度)的时间信息。
zzugyl
2020-09-09 09:14:16 +08:00
我是用 @ye4tar 类似的方法,较少运算量。
有点缺陷没搞好,就是色彩空间转换过程中会有损失,数字周边稍微有点色差。
Esioner
2020-09-17 11:33:58 +08:00
@wnpllrzodiac 大佬,这边两次离屏 fbo 渲染是什么意思啊。。我这边实现了用录制下来,结果发现貌似 mediamuxer 录制的是 surface,我把 surface 宽高写小点,但是 camera2 录制的尺寸,和 gl 渲染的尺寸都是写的 4000*3000 结果发现视频导出来尺寸是正确,但是画质贼低,一点都不清晰,是什么情况啊,能求大佬指点指点吗?我这边需要的是录制一个视频 4000*3000,我希望能在屏幕上以 400*300 的宽高比展示,但是录制的画质是 4000*3000 的
wnpllrzodiac
2020-09-17 17:50:51 +08:00
@Esioner 3k*4k 的实时编码你确认你的手机遭得住?
Esioner
2020-09-18 11:03:29 +08:00
@wnpllrzodiac 我把 view 设置为宽高 4000*3000 的目前能正常录制,我只是举个例子,我希望的是录制能以 1080*1920,但是预览宽高为 540*960 的
wnpllrzodiac
2020-09-21 19:18:36 +08:00
@Esioner 预览多大没啥区别吧,surface 可以缩放的。ogles 视口设置和显存大小有关。占多少显示器面积和编码的不一样吧。编码的是多少就是多少。没有缩放。android 现在支持渲染到编码器直接编码输出这样效率高一点。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/705105

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX