Esioner
V2EX  ›  Android

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

  •  
  •   Esioner · Sep 8, 2020 · 14111 views
    This topic created in 2082 days ago, the information mentioned may be changed or developed.

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

    目前已有的思路

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

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

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


    先行谢过

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