V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Esioner
V2EX  ›  Android

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

  •  
  •   Esioner · 2020-09-08 10:44:37 +08:00 · 10117 次点击
    这是一个创建于 1548 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    目前已有的思路

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

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

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


    先行谢过

    14 条回复    2020-09-21 19:18:36 +08:00
    sharpy
        1
    sharpy  
       2020-09-08 11:58:38 +08:00
    读取 camera 数据,然后用 OpenGL,一路渲染到预览,一路渲染到 codec 提供的 surface 上硬编,还算比较简单
    Esioner
        2
    Esioner  
    OP
       2020-09-08 12:38:34 +08:00
    @sharpy 感谢回复,那这样的话,高分辨率的视频录制,是不是得把 surface 的宽高也指定成这样?这样的话内存会不会撑不住
    sharpy
        3
    sharpy  
       2020-09-08 13:53:01 +08:00
    @Esioner 现在的机器 1080p 一般都撑得住
    glumess
        4
    glumess  
       2020-09-08 14:27:09 +08:00   ❤️ 1
    方案一可以行的,具体的话,可以到我公众号 [音视频开发进阶] 里面找一下相关文章
    Esioner
        5
    Esioner  
    OP
       2020-09-08 15:23:17 +08:00
    @glumess 好的,谢谢大佬,我去看看
    glumess
        6
    glumess  
       2020-09-08 15:33:47 +08:00
    @Esioner 也可以到我的博客哦 https://glumes.com ,也有分享哦
    LLaMA2
        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[]数组了。算是奇技淫巧吧
    wnpllrzodiac
        8
    wnpllrzodiac  
       2020-09-09 07:43:56 +08:00 via Android
    @sharpy 正解。camera1 做过方案,2 的话应该差别也不大。离屏渲染 fbo 两次渲染,一次预览,一次编码输出
    wnpllrzodiac
        9
    wnpllrzodiac  
       2020-09-09 07:45:48 +08:00 via Android
    @ye4tar 这个一般是摄像头打时间戳用的,海康之类的就是,根据当前像素叠加黑白色(需要反白提高对比度)的时间信息。
    zzugyl
        10
    zzugyl  
       2020-09-09 09:14:16 +08:00
    我是用 @ye4tar 类似的方法,较少运算量。
    有点缺陷没搞好,就是色彩空间转换过程中会有损失,数字周边稍微有点色差。
    Esioner
        11
    Esioner  
    OP
       2020-09-17 11:33:58 +08:00
    @wnpllrzodiac 大佬,这边两次离屏 fbo 渲染是什么意思啊。。我这边实现了用录制下来,结果发现貌似 mediamuxer 录制的是 surface,我把 surface 宽高写小点,但是 camera2 录制的尺寸,和 gl 渲染的尺寸都是写的 4000*3000 结果发现视频导出来尺寸是正确,但是画质贼低,一点都不清晰,是什么情况啊,能求大佬指点指点吗?我这边需要的是录制一个视频 4000*3000,我希望能在屏幕上以 400*300 的宽高比展示,但是录制的画质是 4000*3000 的
    wnpllrzodiac
        12
    wnpllrzodiac  
       2020-09-17 17:50:51 +08:00 via Android
    @Esioner 3k*4k 的实时编码你确认你的手机遭得住?
    Esioner
        13
    Esioner  
    OP
       2020-09-18 11:03:29 +08:00
    @wnpllrzodiac 我把 view 设置为宽高 4000*3000 的目前能正常录制,我只是举个例子,我希望的是录制能以 1080*1920,但是预览宽高为 540*960 的
    wnpllrzodiac
        14
    wnpllrzodiac  
       2020-09-21 19:18:36 +08:00 via Android
    @Esioner 预览多大没啥区别吧,surface 可以缩放的。ogles 视口设置和显存大小有关。占多少显示器面积和编码的不一样吧。编码的是多少就是多少。没有缩放。android 现在支持渲染到编码器直接编码输出这样效率高一点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5882 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:39 · PVG 10:39 · LAX 18:39 · JFK 21:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.