Android 录制视频实时添加水印 求点思路 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Esioner

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

  •  
  •   Esioner 2020 年 9 月 8 日 14021 次点击
    这是一个创建于 2056 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 年 9 月 8 日
    读取 camera 数据,然后用 OpenGL,一路渲染到预览,一路渲染到 codec 提供的 surface 上硬编,还算比较简单
    Esioner
        2
    Esioner  
    OP
       2020 年 9 月 8 日
    @sharpy 感谢回复,那这样的话,高分辨率的视频录制,是不是得把 surface 的宽高也指定成这样?这样的话内存会不会撑不住
    sharpy
        3
    sharpy  
       2020 年 9 月 8 日
    @Esioner 现在的机器 1080p 一般都撑得住
    glumess
        4
    glumess  
       2020 年 9 月 8 日   1
    方案一可以行的,具体的话,可以到我公众号 [音视频开发进阶] 里面找一下相关文章
    Esioner
        5
    Esioner  
    OP
       2020 年 9 月 8 日
    @glumess 好的,谢谢大佬,我去看看
    glumess
        6
    glumess  
       2020 年 9 月 8 日
    @Esioner 也可以到我的博客哦 https://glumes.com ,也有分享哦
    LLaMA2
        7
    LLaMA2  
       2020 年 9 月 8 日
    我见过一个特别的技巧。大概如下:
    假定水印位置始终固定,且有一部分变动,且变动的部分为一个时间。
    那么其实变动的地方提前用占位符 0 占位,然后手动生成一个 1080P 的图片,结者转 YUV,然后自己写个小工具生成 0 1 2 3 4 5 6 7 8 9 等,接着比较生成的 YUV 数据,你会发现绝大多数都是系统的,只有一部分不同,不同的部分就是变动的数字了,然后记下来位置,等下你可以在 camera 的 onFramePreview 中直接操作 byte[]数组了。算是奇技淫巧吧
    wnpllrzodiac
        8
    wnpllrzodiac  
       2020 年 9 月 9 日 via Android
    @sharpy 正解。camera1 做过方案,2 的话应该差别也不大。离屏渲染 fbo 两次渲染,一次预览,一次编码输出
    wnpllrzodiac
        9
    wnpllrzodiac  
       2020 年 9 月 9 日 via Android
    @ye4tar 这个一般是摄像头打时间戳用的,海康之类的就是,根据当前像素叠加黑白色(需要反白提高对比度)的时间信息。
    zzugyl
        10
    zzugyl  
       2020 年 9 月 9 日
    我是用 @ye4tar 类似的方法,较少运算量。
    有点缺陷没搞好,就是色彩空间转换过程中会有损失,数字周边稍微有点色差。
    Esioner
        11
    Esioner  
    OP
       2020 年 9 月 17 日
    @wnpllrzodiac 大佬,这边两次离屏 fbo 渲染是什么意思啊。。我这边实现了用录制下来,结果发现貌似 mediamuxer 录制的是 surface,我把 surface 宽高写小点,但是 camera2 录制的尺寸,和 gl 渲染的尺寸都是写的 4000*3000 结果发现视频导出来尺寸是正确,但是画质贼低,一点都不清晰,是什么情况啊,能求大佬指点指点吗?我这边需要的是录制一个视频 4000*3000,我希望能在屏幕上以 400*300 的宽高比展示,但是录制的画质是 4000*3000 的
    wnpllrzodiac
        12
    wnpllrzodiac  
       2020 年 9 月 17 日 via Android
    @Esioner 3k*4k 的实时编码你确认你的手机遭得住?
    Esioner
        13
    Esioner  
    OP
       2020 年 9 月 18 日
    @wnpllrzodiac 我把 view 设置为宽高 4000*3000 的目前能正常录制,我只是举个例子,我希望的是录制能以 1080*1920,但是预览宽高为 540*960 的
    wnpllrzodiac
        14
    wnpllrzodiac  
       2020 年 9 月 21 日 via Android
    @Esioner 预览多大没啥区别吧,surface 可以缩放的。ogles 视口设置和显存大小有关。占多少显示器面积和编码的不一样吧。编码的是多少就是多少。没有缩放。android 现在支持渲染到编码器直接编码输出这样效率高一点。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2976 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 12:57 PVG 20:57 LAX 05:57 JFK 08:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86