导读 :现在,B 站曾经成为了国内最大的视频弹幕网站,其余视频平台、漫画、阅 读等内容平台也都减少了弹幕性能。弹幕曾经成为一种重要的内容互动的伎俩,因而研发一套接入灵便、玩法丰盛的弹幕组件就显得十分重要。
全文 3979 字,预计浏览工夫 9 分钟。
引言:
现在 B 站曾经成为了国内最大的视频弹幕网站,其余视频平台、漫画、浏览等内容平台也都减少了弹幕性能。弹幕曾经成为一种重要的内容互动的伎俩。
厂外在短视频,长视频,直播等媒体类产品线较多,面临着同样的弹幕问题,诸如弹幕量大影响视频体验,弹幕互动(点赞),角色弹幕,黑白弹幕等诸多业务需要。
目前市面上开源的弹幕实现次要是基于 DanmakuFlame, 该库代码曾经进行保护, 并且反对的性能比拟繁多,接入保护艰难,扩大艰难。基于以上起因因而研发一套接入灵便、玩法丰盛的弹幕组件就显得十分重要。BDDMBarrage 即是基于满足以上需要开发的弹幕 sdk,该 sdk 反对自定义弹幕款式,反对弹幕数据源注入,弹幕穿人等性能。
该文会宗旨讲述弹幕穿人的解决方案,为不便了解,咱们会从宏观的弹幕架构登程,深刻到人像拆散技术,算法,服务端部署,弹幕遮罩治理,遮罩缓存以及开发中遇到的辣手问题包含解决该问题的技术策略,还有端侧的性能优化的诸多方面展开讨论,最初会分享一些对将来技术畅享和布局。
先体验一下最终的实现效果图:
一、弹幕架构图
- 弹幕数据管理模块 :其次要性能是为弹幕渲染模块提供数据。首先,会在弹幕缓存模块内查找是否有该工夫点的弹幕数据,如果有数据,则间接提供给弹幕渲染模块;如果没有数据,则触发弹幕数据的网络申请,取得弹幕数据后再提供给弹幕渲染模块。因为弹幕对时效性要求比拟高,所以该模块设计了一个预取策略,这样保障弹幕渲染模块在获取数据的时候,尽可能地命中缓存模块,缩小因为网络申请而产生的时间延迟。
- 弹幕渲染模块 :其中弹幕工夫引擎能够不便地对立调控弹幕整体速度,比方倍速、慢速、暂停等;弹幕调度模块提供一套紧密的轨道算法:能够依据弹幕本身的长度设定正当的速度,并且可能保障同一轨道的任何两条弹幕不会碰撞。针对弹幕的款式以及弹幕本身交互,提供一套自定义计划。接入方能够依照本人的 APP 状态去任意设计弹幕的 UI,也可能挖掘出新的玩法从而晋升整个 APP 的互动气氛,比方番乐 APP 设计了根据剧情的角色弹幕,经营弹幕,也能够减少 VIP 弹幕等。
- 弹幕穿人模块 :该模块是利用 AI 的图像宰割技术产生一系列的蒙版文件,而后依据视频播放器对视频的裁剪形式,对蒙版进行解决生成适合的遮罩,最初依照视频的时间轴把相应的遮罩渲染到弹幕 View 上。具体计划会在前面介绍。
二、弹幕穿人
在几个产品线接入弹幕组件当前,发现大家都不谋而合把弹幕轨道数设置为 3,具体起因是放心弹幕过多而影响用户的视频生产体验。这样尽管保障了视频观看的体验,然而大大弱化了弹幕营造的气氛,为此咱们弹幕组件的 rd 们开始暗戳戳地筹备一个黑科技——弹幕穿人技术,心愿以此能解决问题。上面一段视频给大家看下咱们以后的停顿。
弹幕穿人架构图:
整个流程自下而上,分成算法侧、服务端、客户端三层:
首先,算法侧按每秒 32 帧的频率进行视频抽帧,对每一帧进行人脸识别,配合人脸跟踪和平滑解决,生成每一帧的人脸元数据;其次,服务端将多个帧的人脸元数据进行类似度滤重,而后依据每 3 分钟一个元数据包。在客户端 sdk 侧会依据播放进度预拉取服务侧的对应时间段的压缩包,播放到相应帧将弹幕试图与人脸元数据做一个混合渲染。
上面着重介绍下每个模块或子模块实现的工作
1、算法侧
1)视频抽帧模块:将视频流按每秒 32 帧(可配置)的频率抽帧。抽帧频率越高,遮罩越平滑,遮罩显示画质会更细腻,但前面人脸识别算法耗时也随之减少,手机的性能损耗也会随之增大,如内存耗电等。
2)模型训练模块:提供多张多角度剧中呈现的人物图像,给模型训练模块来训练,生成对应人脸库,再配合已训练实现的明星库,这两个库能够大大提高人脸检测的准确度;
3)人脸检测:辨认每一帧图像中的人脸,并给出人脸轮廓数据;
4)人脸类似度:为缩小网络数据传输压力,会对类似度大于 95% 的两帧,抛弃一帧,或者数帧。
2、服务端
1)视频抽帧元数据管理:治理算法侧提供的帧数据,以视频维度,视频内时间段维度将大量的视频元数据进行分包,建设映射索引,提供到 SDK 的能够是某个时间段内视频的元数据组
2)合并:算法侧吐出的都是每一帧的元数据,但客户端关怀的是一张人脸的变动过程,服务端会把元数据合并,去重组成人脸组数据;
3)弹幕服务:提供根底的弹幕数据
3、客户端 sdk
1)渲染模块:渲染模块 有两套计划:
▌其一是间接通过 Canvas 的混合模式绘制 setXfermode 模式绘制。该模式会对 canvas 上的两个图层进行选择性叠加,这样在头像局部的图层上,咱们抉择只绘制遮罩层,而不绘制弹幕层即可实现遮罩成果;
▌其二应用 OpenGL,依据传入的遮罩图,在 Fragment Shader 处,输入对应的绘制色彩即可。最后应用的计划是 OpenGL 的绘制,通过源码浏览发现两种实现计划在底层实现上是统一的,Canvas 也是 Surface 提供进去的可绘制 api,抉择第一种既能够,不便简洁;
2)人脸数据缓存 :缓存整个视频的索引表,依据索引表定位到具体的遮罩包,依据以后的播放进度在遮罩包内便宜取处对应的遮罩;
3)弹幕根底管制 API,以及配置 API。
三、服务部署
1: 环境: 环境依赖:FFmpeg、Python2.7、OpenCV、numpy
- 人脸检测服务 2qps
- 人像宰割服务 10qps
2: 离线数据存储构造
离线处理过程中的文件寄存目录及文件后缀:
目录名:{vid}\_{media\_id} 依据视频 vid 及 media\_id 生成对应文件夹,蕴含如下子文件:
- frame(抽帧文件 .jpg)
- humanseg(人像宰割解决后的 base64 图片信息 .json)
- contour\_png(图像处理过程中生成的轮廓图 .png)
- contour\_svg(转存为 svg 格局的图片 .svg)
- zip(最终打包文件 .zip)
- mapping(索引文件 .json)
- log(脚本日志)
3: 抽帧脚本:
抽帧应用的百度外部人像脚本:
四、SDK 内置人脸模型碰到的问题
厂内也尝试了应用端内置人脸模型的计划。碰到如下问题:
1、视频的播放每 16s 一帧,会产生大量的帧数据,模型辨认速度在性能上碰到了瓶颈,会存在丢帧的状况,导致遮罩成果不够细腻。尤其头像边缘解决较为重大。
2、端侧辨认时手机 cup 耗费增大,即耗电量会增大,同时可能也影响到播放器卡顿率,整个内存压力也很大。
五、辣手的问题
1:蒙版文件太大
一个 2 分钟视频依照每秒 32 帧进行抽针、图像宰割的话,将会失去 3840 张蒙版文件,目前从图像宰割算子获取的蒙版文件是一张二值图(PNG 格局),大概在 100 多 K,那么一个 2 分钟视频生成的蒙版文件总计 375M。依照这样的规格去设计,弹幕蒙版文件有可能比视频自身还大,占用更多的带宽,这样必定是不能落地的。另外,因为弹幕蒙版文件过大,下载也须要破费比拟长的工夫,势必会造成视频曾经播放了很长一段时间,但弹幕蒙版还处于下载中,用户体验也会十分蹩脚。
针对这个问题,咱们次要从两方面动手:第一、把二值图转为 svg 文件,因为 svg 文件就是一个纯正的 XML,并且可压缩性十分强。只须要把二值图中人形轮廓记录到 svg 文件外面即可(也就是一些点的汇合)。另外还能够灵便调整记录人形轮廓的粒度,从而进一步调整 svg 文件的大小。最终咱们把一张二值图大小从 100 多 K 压缩为几百字节。第二、蒙版文件汇合采纳分段压缩存储,这样能够达到边播变下载的成果。而且,在第一段下载实现当前就能够渲染,晋升用户体验;另外,视频播到哪里,弹幕蒙版文件下载到哪里,这样也节俭了带宽。
Svg 压缩包格局:
▎zip 文件命名规定:
{vid}\_{interval} \_{index}.zip
示例:4752528107223374247\_10\_0.zip
▎svg 文件命名规定:
{index}.svg 示例:0000001.svg
▎ 索引文件构造:index.json
2: 手机端内存耗费过大
不同手机内存是有限度的,尤其一些低端机对内存的耗费更是顾此失彼,而视频类 app 相对来说更耗内存,所以弹幕 sdk 的耗内存水平,间接决定了其可用水平。
因为每个遮罩文件大概在 100~200kb, 咱们的遮罩是 1 分钟会产生 32 帧,即便通过合并解决也还是很大。依照这个计算 1 分钟的内存占用:
Memory Total = 32 * 100kb = 3.125MB
在 ios 侧还算能够,在 Android 侧每一分钟产生 3mb 的内存占用即便进行内存回收也会产生很差的性能体验,平庸的内存回收会很耗性能,导致 app 卡顿显著。
解决思路:
依据视频时长调配固定的本地内存,该本地内存循环利用,这样缩小了内存的频繁回收,限度了内存的无止尽应用。
六、将来瞻望
人脸数据的产生过程是很耗老本的,单服务跑一个脚本 5 分钟视频,大概须要 2 小时,然而产生的数据是简单的,不仅能够产产生人脸二值图,还能够产生人体的其余数据,如人的静止轨迹等,下一步咱们筹备把带有人脸数据和人体数据的脚本,人像静止轨迹做为根本脚本,基于这些根本脚本,能够做很多翻新的案例,比人弹幕互动,弹幕追随的玩法,也能够对视频中不同人物的头像进行变脸等等。
举荐浏览:
|iOS 签名校验那些事儿
|信息流举荐零碎智能交付解决方案摸索
|图谱相干技术在风控反作弊中的利用和摸索
———- END ———-
百度 Geek 说
百度官网技术公众号上线啦!
技术干货 · 行业资讯 · 线上沙龙 · 行业大会
招聘信息 · 内推信息 · 技术书籍 · 百度周边
欢送各位同学关注