欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由腾讯视频云终端团队发表于云+社区专栏

常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ、手机QQ、QQ物联 等产品项目,目前在腾讯视频云团队负责音视频终端解决方案的优化和落地工作,帮助客户在可控的研发成本投入之下,获得业内一流的音视频解决方案,目前我们的产品线包括:互动直播、点播、短视频、实时视频通话,图像处理,AI 等等。

前言

在 AlphaGo 名声大噪之前,围棋是一项少有人问津的娱乐项目,不信你可以在记忆里细数一下,当时身边有多少个朋友会下围棋(AlphaGo 出名后一时兴起下两把的咱们就不算数了)。相比之下,德州扑克的普及程度就要好的多,以至于我们团队有一次年会就放弃传统抽奖方式,而是靠德州扑克决定奖品名单的。

为什么高大上的围棋比不上德州扑克受欢迎呢?规则太复杂吗?

真正的原因是围棋的门槛太高了。在围棋里,水平的高低说带来胜率差异是碾压式的。对于两个围棋选手而言,如果棋艺差一级,那么对弈时弱者几乎没有赢的可能。这就让围棋变成了一群高智商玩家的小圈子游戏,刚入门的进来感觉就是找虐。而德州扑克则不是,不管你是不是行家,运气的成分总还是起了很大的作用,这就让它本身适合成为一款所有人都容易接受的游戏。

视频编辑也是如此,在电脑能够处理多媒体工作之后不久,就出现了很多的视频编辑软件。比如我过年回家,就能在长辈的书架上看到一本《会声会影 从入门到精通》。长辈退休了在家搞搞摄影,想要给自己拍的照片和视频加点特效或者做个剪辑,就会用到这类专业软件。我随手翻了几页,很快就没兴趣了,里面太多流程化的操作,需要我花不少的时间去研究和练习,而我缺乏学习这款软件的动力。

由此可见,入门门槛的高低,决定了一项活动或是一款产品,是被大众所普遍接受,还是停留在一个很小的专业圈子里。

就在不久之前,视频编辑还是一个小圈子的活动,纵使很多人有兴趣创作自己的小视频,在专业工具的入门门槛面前,也就选择洗洗睡了。直到快手和抖音的出现,让大家的入门门槛一下子变低了,你只要会用手机,就能快速的给自己拍的视频加一些特效,做一些个性化的编辑,进而引爆了“北快手,南抖音”这两款现象级的 APP。

但我想告诉您的是,从会声会影式的专业软件到普罗大众的快手抖音,绝不是交互层面的一个简单调整,而是一个复杂的故事。今天,我就带您一起来看一看,这背后的技术故事。

编辑的原理

下图简单的展示了视频编辑的一个大体流程,这在所有的视频编辑软件里都是类似的:

第一个需要了解的细节是,手机上的影片(比如 mp4 或者 mov) 都是不能直接拿来做特效编辑的,因为里面的数据都是经过压缩的。直接编辑这些编码后的影片是很困难的,我们在不解码影片文件的情况下,最多也就是做一下简单的裁剪和拼接。

举个现实生活中的例子,比如说你刚搬了新家,带着你的爱人去宜家挑选家具,宜家的服务很人性化,他们会在你进门的时候会给你一张卡片和一支铅笔,这样你就可以把想买的家具或则配件的编号记录下来,之后你可以去仓库一件件的取货,或者去办理送货上门服务。这一切都很方便,直到买单时你发现预算超了,于是决定要把一些比较贵的型号换成比较便宜的型号。但这个时候困难也出现了,因为只有编号你是做不到的,你得回到展示区按商品编号对号入座,然后才能知道有没有心仪的便宜款商品可选。否则你能做的也就只有从商品列表里把一些型号划掉。

视频编辑也是一样,已经经过编码的影片,再不经过解码的情况下,即使计算机也无法解读文件里蕴含的画面和声音,我们所能做得事情就很有限。这也就解释了上图复杂性的由来:

要做音视频的特效编辑,原始的影片(比如 mp4 或者 mov)必须先被拆解成独立视频流和音频流。以视频流为例,我们要先对视频流进行逐帧逐画面的视频解码,这样解码出来的内容才是一副计算机可以显示的画面。在这幅画面的基础上,计算机才可以理解每一个像素点对应的色彩数值和亮度大小。进一步地,计算机才可以在画面上添加字幕,做动态特效,或者叠加挂件。声音也是一样,编码后的 AAC 文件只适合传输和存储,计算机也是需要先将其解码成 PCM 格式的波形文件,才能知道每一个点的音调高低,进而能够编辑。

视频特效和声音特效都加完之后,还不算结束,因为用户真正想要的是编辑后的视频影片,而不是一幅幅的画面和一段段的声音,所以解码出的画面在经过特效叠加和处理之后,还要再一次地送给视频编码器进行编码,进而跟音频流一起,组合成新的视频影片。

预览功能

上述的流程看似复杂,但它只是视频编辑的最后一步,也就是编辑器的“最终生成”的这一步,在这一步之前,必须要有人通过编辑器决定在哪一段时间加什么类型的特效。

但没有人可以凭空知道在影片的第几秒把一个什么特效恰到好处的放置进去,用户需要根据影片的具体内容进行即兴的创作和发挥,所以,我们需要把预览功能作为 P0 特性加入进去。

如上图所示,简单的预览在原理上是一个完全没有技术难度的工作,我们只需要将经过特效处理的画面和声音播放出来即可。这里真正的难点是要优化好画面特效的性能,同时做好音画同步的校对。

因为影片的预览跟单张图片的预览不同,预览过程必须是一个很流畅的体验,否则用户在编辑影片时就会有很明显的卡顿感,导致用户在使用时如骨鲠在喉,难以有好的产品体验。

而性能优化和音画同步也都很好解决,真正困难的是逐帧的画面预览,也就是用户想要看哪一帧的效果,就能立刻如愿,也就是标题里所谓的“心随手动”。

这里,我们将面对一个在技术原理上就很难逾越的困难:

逐帧预览

虽然手机芯片的进步这两年可谓神速,但是功耗的限制决定了 PC 机的性能依然可以碾压手机。但不知你有没有发现,即使在性能这么好的 PC 电脑上,看电影时也会遭遇“拖拽卡顿”现象,也就是当你用鼠标拖拽进度时,能明显感觉卡顿感。

这是因为简单的视频卡顿背后,有一个巨大的性能陷阱,也即是解码器的解码规则,我通过下图来解释一下:

假设你将鼠标从第3幅画面拖拽到第13幅画面,按照表面上的理解,计算机只需要读取第13幅画面的内容,把画面显示出来就行了,这并没有什么难度。

但实际上,编码器在处理第13幅画面的时候,为了减少这幅画面的存储空间,只会保留第13幅和第12幅画面的差异部分。这也就意味着,要想看到第13幅画面,计算机需要先把第12幅画面解码出来。照此类推,要想看到第12幅画面,计算机就需要先把第11幅画面解码出来...

最终,计算机需要解码出第7幅画面,才能将上述这个循环打破,因为第7幅画面比较特殊,编码器在处理这一副画面的时候,并没有参考其它画面,所以这幅画面的内容在还原时,不需要依赖其它画面的内容(也正是因为如此,这幅画面在硬盘上的存储空间比其他画面都要大)。

当然,这里说的都是最简单的情况,由于技术的进步,现在普遍使用的编码器都已经在用 main profile 和 high profile 这种高级的编码模式,画面与画面之间的参考关系更加复杂,不仅仅参考前面的画面,也会参考后续的画面,进一步提升了复杂度和计算量。

这就解释了为什么拖拽本身的等待时间不确定,有时候你可能运气好,正好拖到了上图中的第7幅画面,那么如你所愿,画面立刻就切到第7幅;但也有可能,你拖拽到了第14幅画面,那么计算机只能认倒霉,它要把前面的7幅画面全都解码完成,才能切到你想要的那一幅画面上。

视频预处理

为了解决这个问题,我们只有两条路可以走:

一条路是等待摩尔定律进步到处理十几幅画面也只需弹指一挥间的事情,但安迪比尔定理也告诉你,摩尔定律所带来的那点进步会瞬间被 4K、8K 给吃掉。

另一条路就是工程思维解决问题了,我们的做法是:如果是编辑一个已经生成好的 MP4 或者 MOV 影片,我们会先对影片进行一轮预处理,也就是影片在送给编辑器之前,先要经过一轮提前的加工处理,把视频处理的更加易于编辑。

当然,如果你认为仅仅是为了提升逐帧预览的性能就要耗费这么大的精力是不值得的,那其实是多虑了。因为我们的工程师团队会充分利用这段新引入的时间,把很多耗时但又必须要做的事情在这个阶段也完成了,比如,下面图中的预览工具条,就是在预处理过程中每隔一段时间截图拼接实现的。

特效的制作

我们都知道动画的原理本身就是一幅画面到另一幅画面的快速变化,画面之间的微小差异经过累加,使人产生画面运动的错觉。画面变化的越快,人越不容易察觉,因为画面的流畅性也就越好。

我们在短视频编辑器上说添加的各种特效也是遵循这两个原则:

  • 特效本身是逐帧变化的,每一幅特效跟上一幅特效均有细微的差别。
  • 特效的变化跟影片原来的画面变化进行叠加,这样能够确保特效的流畅性自然而不生硬。

以我们在Demo中提供的第三个视频特效为例,它是这样实现的:

(1)取原始画面第一幅图像,对其做1.1倍的图像放大,之后截取中心的部分,然后去掉 50% 的透明度,这样就能得到一张新的半透明图片,这张新的半透明图片是用来形成虚影效果的。它会被叠加在原始图像上,这样一来,我们就得到了处理后的第一幅图像(带虚影特效)。

(2)照此步骤,我们对第二幅图像也做同样的处理,但这次稍有不同的是,不再做 1.1 倍放大,这次我们把放大倍数改成1.2倍,这样叠加出来的图像,50%透明度所形成的虚化部分,就相比于上一幅就要扩大了一圈。这扩大出来的一圈如果叠加起来,就可以制造出一种画面向外放射的错觉。

(3)对第三幅画面也是类似的操作,这次我们将放大倍数改为 1.3 倍,因此虚影部分又扩大了一圈...

(4)如此逐步做下去,处理后的图像就会形成一组新的连续动画,而这组新的动画已经包含了我们所期望的视频特效。

相比于其他的部分,特效本身的技术难度是比较简单的,尤其是视频特效的实现。

真正的困难则是来自于定制上的灵活性,由于抽象能力比价若,我们目前还没有把视频特效的制作能力开放出来供开发者自行设计,而是只能用更直接的办法,想到一个做一个。真正要做到客户随意定制,还需要一段时间的努力。

更多视频请点击—>这里

问答
如何搭建小程序音视频?
相关阅读
教你1天搭建自己的“微视”
教你从0到1搭建小程序音视频
教你快速搭建一场发布会直播方案
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

短视频APP是如何开启你的美好生活的?的更多相关文章

  1. 短视频APP+不同类型社交应用发展分析+化妆品电商

    短视频APP——昙花一现还是发展趋势? 在这个互联网与科技并行且飞速发展的时代,各种app不断涌入市场,其中短视频app便是一个典型,美拍,就成功入围2014年十大最火app.而短视频app也势必要成 ...

  2. 如何快速打造一款高清又极速的短视频APP?

    整个短视频的市场规模一直在增长,网络数据显示2018年已经突破100亿大关,在2019年预测将超过200亿.纵观行业,在生活资讯.美食.搞笑.游戏.美妆等领域,短视频流量巨大但竞争激烈,但是在教育.财 ...

  3. 快速搭建一个“微视”类短视频 App

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 " ...

  4. 浅谈短视频APP的发展趋势

    2014年6月20日,在AppAnnie最新发布5月应用指数中,美拍荣登“非游戏类iOS榜单”全球下载量第一位置,成为全球iOS应用商店最热门APP.能在<AppAnnie应用指数>这份A ...

  5. 【干货】零基础30分钟让你拥有一个完整属于自己的短视频APP系统

      目录 一.附言: 1 二.购买域名和购买服务器: 2 三.搭建服务器环境: 5 四.配置APP前端部分: 8 1.工具以及文件准备: 9 2.配置后端接口地址 11 3.配置APP启动图和启动图标 ...

  6. 最快1天搭建短视频APP!阿里云短视频解决方案上线

    短视频行业的发展前景乐观是毋庸置疑的,整个短视频的市场规模一直在增长,网络数据显示2018年已经突破100亿大关,在2019年预测将超过200亿.那么,对于短视频从业者来讲,要持续推动业务的发展,必须 ...

  7. 100行代码搞定抖音短视频App,终于可以和美女合唱了。

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由视频咖 发表于云+社区专栏 本文作者,shengcui,腾讯云高级开发工程师,负责移动客户端开发 最近抖音最近又带了一波合唱的节奏,老 ...

  8. 巧用 transition 实现短视频 APP 点赞动画

    在各种短视频界面上,我们经常会看到类似这样的点赞动画: 非常的有意思,有意思的交互会让用户更愿意进行互动. 那么,这么有趣的点赞动画,有没有可能使用纯 CSS 实现呢?那当然是必须的,本文,就将巧妙的 ...

  9. 10分钟快速上车短视频风口:基于uniapp框架创建自己的仿抖音短视APP

    在今年也就是第48次发布的<中国互联网络发展状况统计报告>有这样一个数据,21年的上半年以来,我国我国网民规模达10.11亿,其中短视频用户达8.88亿.碎片化的生活场景下,短视频成为人们 ...

随机推荐

  1. 【Win10】页面的导航效果

    CommonNavigationTransitionInfo ContinuumNavigationTransitionInfo DrillInNavigationTransitionInfo Ent ...

  2. what is HTTP OPTIONS verb

    The options verb is sent by browser to see if server accept cross origin request or not, this proces ...

  3. MySql数据库远程连接失败问题解决

    例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话. GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY ...

  4. SqlDataReader 结果集 转成 DataTable

    /// <summary> /// SqlDataReader 转成 DataTable /// 源需要是结果集 /// </summary> /// <param na ...

  5. asp.net core 的用户注册功能——Identity上手

    首先请using这个类库. using Microsoft.AspNetCore.Identity; 这个类库老牛逼了,首先是包含了一个IdentityUser类.我们可以自己写一个User类继承Id ...

  6. .net core AOP之Filter

    当我们进行项目开发时,往往在开发过程中需要临时加入一些常用功能性代码,如身份验证.日志记录.异常获取等功能.如果每个方法中都加入这些功能性代码的话,无疑使项目显得过于臃肿,代码繁杂.这时候就要加入过滤 ...

  7. 关于ORACLE的字符窜存储(未完善,欢迎补充)

    oracle中常见的用于存储字符串的数据类型有: 数据类型 是否定长 最多存储数 效率排行 备注 是否oracle特有 英文占位 中文占位 char 是 2000 比VARCHAR2稍高 char的长 ...

  8. WPF 图片抗锯齿,尤其是小图片更为严重

    WPF 图片抗锯齿,尤其是小图片更为严重 UseLayoutRounding="True" 搞定,就是这么给力,分享给大家

  9. [翻译].NET Core 3 Preview1和Windows桌面框架开源

    原文来自TechViews 今天,我们宣布推出.NET Core 3 Preview 1.这是.NET Core 3的第一个公开发布.我们有一些令人兴奋的新功能可供分享,并希望得到您的反馈.您可以使用 ...

  10. js中null, undefined 和 typeof

    参考自:http://www.cnblogs.com/wicub/p/3442891.html typeof 是运算符,注意不是函数,是运算符,其作用,是考察变量究竟是什么类型.或曰,是变量是否定义或 ...