闲鱼内容视频化展示方案(超全面)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 随着短视频的流行,如何推动内容视频化,闲鱼给出了新的解决方案。

1. 背景

移动互联网是随着移动通信技术的迭代和发展的,每一次迭代都会给人们生活带来巨大的改变。
1G网络,让人们用上了手机;
2G网络,让人们能够通过手机上网;
3G网络,促使移动互联网飞速发展;
4G网络,直播和短视频出现爆发式增长。


短视频的出现不仅是内容展示形式的变化,创作者通过剪辑和特效使内容更丰富、生动,给受众提供了更优质的用户体验。


闲鱼是C2C场景,普通用户发布视频宝贝比例不高。如何内容视频化,提升浏览体验,闲鱼给出了解决方案。

2. 闲鱼不是短视频

将图片合成短视频,是我们最先想到的方案。思考后,发现其中存在一些问题:

  • 引导用户视频合成,会影响发布成功率

弱引导,起不到作用,达不到预期。强引导,会打断发布链路,影响发布成功率。
闲鱼之所以能够成为行业的No.1,是因为闲鱼有一个庞大的商品池,新发商品数量是闲鱼生态的基石。闲鱼一直提倡轻发布,小白用户可以在闲鱼上轻松发布商品。我们的目标是:把简单留给用户,把复杂交给自己。

  • 云端异步生成视频

用户商品发布成功后,在云端生成视频,然后给用户推一个Push消息,询问用户是否应用该视频。问题是,用户可能收不到Push消息,可能不采用生成的视频,白白浪费了服务资源。

  • 存量商品问题

因为无法解决存量商品问题,是我不采用合成视频的主要原因。闲鱼的新发商品对比整个商品池,占比毕竟很小。只处理新发商品,无法解决大量商品的问题。


图片合成视频有如上诸多问题。我们给出的方案是“基于动效模板的图片动态展示方案”。

3. Chaplin项目

电影是从无声电影开始的,无声电影以 Charlie Chaplin(查理·卓别林)最为代表。他不但推动了电影历史的发展,更代表了一个时代。希望通过Chaplin项目推动闲鱼整体内容视频化的发展。


Chaplin项目,启发源于视频编辑器。在视频编辑阶段,可以通过各种特效使内容更丰富、生动。我们将素材与特效进行分离,最终将整个编辑过程抽象成模板。展示时,再将不同的素材与模板进行合并,实现视频播放的效果。

演示

GIF

视频:

http://wantu-xm4-xianyu-video-hz.oss-cn-hangzhou.aliyuncs.com/aus/xianyu_post/1188921868/3_1626333212.571707

设计

Chaplin项目业务落地方案:

  • 模板创作

模板编辑器主要参考通用视频编辑器,为设计师提供一个可视化的创作工具。特效库是可扩展的,酷炫特效主要是开发同学通过编写OpenGL Shader实现的。因为OpenGL是标准库,所以可以实现编辑器和客户端的一致性。


资源管理平台主要依托于集团的纵横平台(素材管理中心),实现音乐库、特效库、模板库的管理。其中,模板支持特征打标和播放控制。因为模板是要下发到客户端的,所以必须有完整的线上发布流程,线上要与预发隔离。

  • 客户端

模板获取是增量同步的,需要实现本地模板库管理,以及Shader和素材资源管理。


模板推荐引擎基于业务场景,通过对商品和内容的理解,以及对图片主体和色域的分析,实现对用户的个性化推荐。并且通过疲劳度和曝光量配置,实现模板打散展示。


动态展示(播放),首现需要将素材与模板进行合成,合成后的播放源是基于时间线的非线性播放序列。播放过程是按时间线实时合成和渲染的。视觉的合成,双端都是基于OpenGL。iOS的音频合成是基于AVMutableAudioMix(AVFoundation);Android没有音频合成过程,是混音播放。

循环模板

在业务落地的过程中,播放素材的个数是不确定的,所以设计了循环模板。

循环模板的收益还是比较明显的:
(1)大大减少了模板文件个数,一样的视觉不需要设计多个模板;
(2)大大降低了模板文件大小,使模板文件下载更快。

设计之初,有2套循环模板方案:
(1)素材与模板合成时处理;
(2)让播放器支持循环配置。
考虑到子模块独立、纯粹性,降低模块耦合度,所以抽象了素材与模板的合成模块。

循环模板的设计是为了解决业务中的不确定性,所以设计上不但要考虑协议的扩展性,还需要对不确定性进行抽象:

  • 播放协议

    • 以图片开始;
    • 以图片结尾;
    • 两个图片之间必须有转场节点,转场时间可以为零。
  • 循环模板的头尾设计

    • 必须以图片节点开始;
    • 可以是图片结尾;
    • 可以是转场结尾。
  • 循环部分与非循环部分的定义

    • 所有节点支持once(只执行一次),第二次执行将跳过该节点;
    • 跳过节点后,如果出现相邻同类型节点,将再次跳过节点。


播放线程

整个播放过程还是比较复杂的,事件和数据会在不同线程之间传递。本来也不想搞这么多线程,可是如果不异步处理就会出现堵塞和卡顿问题。


  • 播放控制操作队列

播放器是强依赖状态机的,锁操作会有卡顿(Stop操作会释放线程等其它资源),所以选择了异步操作队列。

  • GL渲染线程

因为是多轨播放,所以需要实时渲染合成,合成后再上屏。

  • 资源加载线程

资源加载是I/O操作,会比较耗时(特别是字体和大的图片)。图片是先通过资源加载线程加载到内存的,然后在GL渲染线程把图片转成纹理,再渲染。

  • UI刷新线程

当前设置的刷新率是30FPS,也就是所有加载合成操作要在30ms内完成,否则会出现卡顿的现象。

多轨播放

多轨播放(也叫非线性播放),需要将多轨的内容实时合成并渲染上屏。
PS:加载资源或者合成慢了就会出现播放卡顿,所以做了资源预加载,纹理预处理等操作。

模板协议

OpenGL 顶点坐标范围是[-1.0,1.0],纹理坐标范围是[0.0,1.0]。为了开发方便做了坐标统一,协议中所有坐标范围均是[0.0,1.0],会在底层做转换。

所有特效均是云端实现。遵循shader节点协议,包括:vertexURL、fragmentURL、uniforms。其中
举例:

  • 素材(图片)
{
    "name":"放大",
    "type":"image",
    "duration":2.0,
    "shader":{
        "vertexURL":"https://xianyu-chaplin-bucket.oss-cn-beijing.aliyuncs.com/ShaderV2/ImageEffect_Move2_V2/ImageEffect_Move2_V2.vert",
        "fragmentURL":"https://xianyu-chaplin-bucket.oss-cn-beijing.aliyuncs.com/ShaderV2/ImageEffect_Move2_V2/ImageEffect_Move2_V2.frag",
        "uniforms":{
            "u_FirstScaleBegin":1.00,
            "u_FirstScaleRange":0.04,
            "u_FirstMoveBeginX":0.00,
            "u_FirstMoveRangeX":0.00,
            "u_FirstMoveBeginY":0.00,
            "u_FirstMoveRangeY":0.00
        }
    }
}


  • 转场
{
    "name":"溶解",
    "type":"transition",
    "duration":0.5,
    "shader":{
        "vertexURL":"https://xianyu-chaplin-bucket.oss-cn-beijing.aliyuncs.com/ShaderV2/TransitionEffect_Mix2_V2/TransitionEffect_Mix2_V2.vert",
        "fragmentURL":"https://xianyu-chaplin-bucket.oss-cn-beijing.aliyuncs.com/ShaderV2/TransitionEffect_Mix2_V2/TransitionEffect_Mix2_V2.frag",
        "uniforms":{
            "u_FirstScaleBegin":1.04,
            "u_FirstScaleRange":0.01,
            "u_SecondScaleBegin":1.00,
            "u_SecondScaleRange":0.01,
            "u_FirstMoveBeginX":0.00,
            "u_FirstMoveRangeX":0.00,
            "u_FirstMoveBeginY":0.00,
            "u_FirstMoveRangeY":0.00,
            "u_SecondMoveBeginX":0.00,
            "u_SecondMoveRangeX":0.00,
            "u_SecondMoveBeginY":0.00,
            "u_SecondMoveRangeY":0.00
        }
    }
}


  • 贴纸
"tracks":[
        {
                "type":"ShaderTrack",
            "list":[
                {
                    "type":"PopImage",
                    "position":0,
                    "duration":3600,
                    "data":{
                        
                    },
                    "shader":{
                        "vertexURL":"https://xianyu-chaplin-bucket.oss-cn-beijing.aliyuncs.com/ShaderV3/PopImage/PopImageV3.vert",
                        "fragmentURL":"https://xianyu-chaplin-bucket.oss-cn-beijing.aliyuncs.com/ShaderV3/PopImage/PopImageV3.frag",
                        "vertexCoordinatesName":"a_Position",
                        "vertexCoordinatesValue":{
                            "x":0,
                            "y":0,
                            "width":1,
                            "height":1,
                            "rect":{
                                "top":"8dp",
                                "right":"8dp",
                                "width":"60dp",
                                "height":"24dp"
                            }
                        },
                        "images":[
                            {
                                "textureCoordinatesName":"a_FirstTexCoord",
                                "textureCoordinatesValue":{
                                    "x":0,
                                    "y":0,
                                    "width":1,
                                    "height":1
                                },
                                "textureName":"u_FirstTexture",
                                "imageURL":"https://gw.alicdn.com/tfs/TB1QOt3nIVl614jSZKPXXaGjpXa-120-48.png"
                            }
                        ],
                        "uniforms":{
                            "u_MoveX":0,
                            "u_MoveY":0,
                            "u_VertexScaleBegin":1,
                            "u_VertexScaleRange":0
                        }
                    }
                }
                
            ]
        }
        ]


总结与展望

随着短视频的流行,如何推动内容视频化,闲鱼给出了新的解决方案。本文也说明了为什么不采用图片合成视频的原因。具体介绍了如何通过动效模板实现图片内容的播放展示,打破了图片合成视频的局限性。

虽然方案已经上线运行,但还有些想法没有实现。

  • 智能创建模板

单一的模板会让用户产生疲劳,所以模板生产要有持续性。当前模板生产依赖设计师创作、开发写特效,成本较高。业界也有一些智能创作方案,后面会考虑如何结合。

  • 智能识别与特效的结合

实时识别主体区域,并针对主体区域做特效处理。比如当前有一个逐渐放大的转场特效,理想应该是以主体区域为中心放大,而不是图片中心点放大。当前素材是顺序播放的,可以加入智能排序。

  • 场景扩展

当前方案还主要应用在展示场景,后面会考虑应用到UGC生产场景。
















相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
JavaScript 数据挖掘 Java
91 网站点击流数据分析案例(数据展示)
91 网站点击流数据分析案例(数据展示)
152 0
|
7月前
|
Web App开发 弹性计算 DataWorks
DataWork数据处理问题之开发页面展示不出来如何解决
DataWork数据处理是指使用DataWorks平台进行数据开发、数据处理和数据治理的活动;本合集将涵盖DataWork数据处理的工作流程、工具使用和问题排查,帮助用户提高数据处理的效率和质量。
|
19天前
|
前端开发 JavaScript 数据安全/隐私保护
优雅实现管理后台403页面:技术细节与实践案例
在管理后台开发中,403页面是一个不可忽视的组成部分。它不仅关系到用户体验,还涉及到系统的安全性。本文将分享如何在管理后台中优雅地实现403页面,以及几个具体的实践案例。
24 2
|
6月前
|
UED
带您一步步构建一个具有复杂布局的电商详情页,涵盖页面结构规划、样式设计以及交互效果的实现
【6月更文挑战第14天】构建复杂布局的电商详情页涉及页面结构规划、样式设计和交互效果实现。首先,规划页面结构,包括顶部导航栏、商品图片展示区、商品信息区、用户评价区和相关商品推荐区。接着,进行样式设计,注重色彩搭配、字体选择、布局与间距以及图片处理。例如,使用固定顶部导航栏,轮播图展示商品图片,分块展示商品信息和评价,以及设计相关商品推荐区。最后,实现交互效果,如图片放大、添加到购物车按钮、滚动监听和评论互动,提升用户体验。实际开发时需根据需求和规范进行调整,保证跨设备兼容性。
113 1
|
7月前
|
安全
哈希竞猜游戏系统开发玩法详情/功能步骤/需求设计/流程方案/源码程序
Developing a hash guessing game system can provide a fun gaming experience. The following are possible gameplay and rules for your reference:
|
前端开发 区块链
合成游戏看广告视频盒子系统开发方案逻辑/详细案例/功能设计/需求步骤/规则项目/源码说明
在Solidity中,与外部合约交互可以通过调用函数来完成。这些函数可以是在Solidity合约中定义的函数,也可以是在外部合约中定义的函数。调用外部合约函数需要知道合约的地址和函数的签名。
|
存储 区块链
即时聊天/即时通讯app系统开发详情方案/玩法规则/案例设计/源码说明
区块链的核心——分布式和存储不依赖于中心化的硬件或管理机构,在区块链中的所有节点的权限和义务都是对等的,Therefore,each result can also participate in the recording and maintenance of data.It differs from traditional data structures that rely on the"center"and can achieve point-to-point data transmission and real-time data recording,with higher effici
如何用ChatGPT做内容营销方案和选题计划,同时生产和优化内容?
该场景对应的关键词库(31个): 内容营销、目标、主题、类型、选题计划、素材、推广策略、优化方案、渠道、目标受众、竞争对手、行业背景、转化率、品牌知名度、客户参与度、销售、发布频率、选题阶段、生产阶段、推广阶段、预算分配、人群特征、话题标签、视觉元素、电子邮件、SEO、数字广告、线下广告、在线聊天、社交媒体、赞助
568 0
|
存储 小程序 JavaScript
借助云开发实现小程序朋友圈的发布与展示
借助云开发实现小程序朋友圈的发布与展示
121 0
|
小程序 前端开发 Java
代小程序实现业务开发,99%还原公众号后台对服务类目管理的功能
关于微信开放平台上的代小程序实现业务,之前就写了相关模块的代码,包括快速注册小程序、代码上传、提交审核、发布小程序等主要功能。
126 0
代小程序实现业务开发,99%还原公众号后台对服务类目管理的功能