RT,最近有个需求,需要录制视频,能实时添加水印,网上找了一圈基本上都是基于 camera 的,没找到 camera2 的,英语渣渣,到 stackoverflow 也没找到相关的,所以就想请教一下大家,有没有啥思路可以指点指点
目前已有的思路
以上方案是我在网上找到一些 demo 里看到的并没有真正实现过,所以不一定可行,求大佬们指点迷津
ps: 我需要的是帧水印内容是可以实时动态修改的,例如时间戳等
1
sharpy 2020-09-08 11:58:38 +08:00
读取 camera 数据,然后用 OpenGL,一路渲染到预览,一路渲染到 codec 提供的 surface 上硬编,还算比较简单
|
2
Esioner OP @sharpy 感谢回复,那这样的话,高分辨率的视频录制,是不是得把 surface 的宽高也指定成这样?这样的话内存会不会撑不住
|
4
glumess 2020-09-08 14:27:09 +08:00 1
方案一可以行的,具体的话,可以到我公众号 [音视频开发进阶] 里面找一下相关文章
|
6
glumess 2020-09-08 15:33:47 +08:00
@Esioner 也可以到我的博客哦 https://glumes.com ,也有分享哦
|
7
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[]数组了。算是奇技淫巧吧 |
8
wnpllrzodiac 2020-09-09 07:43:56 +08:00 via Android
@sharpy 正解。camera1 做过方案,2 的话应该差别也不大。离屏渲染 fbo 两次渲染,一次预览,一次编码输出
|
9
wnpllrzodiac 2020-09-09 07:45:48 +08:00 via Android
@ye4tar 这个一般是摄像头打时间戳用的,海康之类的就是,根据当前像素叠加黑白色(需要反白提高对比度)的时间信息。
|
11
Esioner OP @wnpllrzodiac 大佬,这边两次离屏 fbo 渲染是什么意思啊。。我这边实现了用录制下来,结果发现貌似 mediamuxer 录制的是 surface,我把 surface 宽高写小点,但是 camera2 录制的尺寸,和 gl 渲染的尺寸都是写的 4000*3000 结果发现视频导出来尺寸是正确,但是画质贼低,一点都不清晰,是什么情况啊,能求大佬指点指点吗?我这边需要的是录制一个视频 4000*3000,我希望能在屏幕上以 400*300 的宽高比展示,但是录制的画质是 4000*3000 的
|
12
wnpllrzodiac 2020-09-17 17:50:51 +08:00 via Android
@Esioner 3k*4k 的实时编码你确认你的手机遭得住?
|
13
Esioner OP @wnpllrzodiac 我把 view 设置为宽高 4000*3000 的目前能正常录制,我只是举个例子,我希望的是录制能以 1080*1920,但是预览宽高为 540*960 的
|
14
wnpllrzodiac 2020-09-21 19:18:36 +08:00 via Android
@Esioner 预览多大没啥区别吧,surface 可以缩放的。ogles 视口设置和显存大小有关。占多少显示器面积和编码的不一样吧。编码的是多少就是多少。没有缩放。android 现在支持渲染到编码器直接编码输出这样效率高一点。
|