奇技 · 指南
互联网和智能设备的普及,使得过去靠专业人士、专业设备才能进行的视频内容创作逐步在移动平台变得可能. 移动平台优秀的视频内容创作工具大多是闭源或收费的,未形成强大的技术群体和社区力量。本文结合360智汇云视频剪辑SDK产品(https://zyun.360.cn/product/videoedit)的实践来分享具体的架构设计、工程优化以及踩过的坑,同时也对端云结合的视频内容创作方式进行了思考和展望
1
视频剪辑的历史
剪辑源于法语“Montage”,中文里通常音译为“蒙太奇”,意为构成装配,后来发展成一种电影镜头组合理论。第一个应用蒙太奇并取得成功的人是电影之父格里菲斯(D.W.Griffith,下图左一)。他在1915年拍摄了电影史上的第一部票房大片《一个国家的诞生》,票房收入高达200万美元,这个纪录几十年后才有人打破。格里菲斯是电影的蒙太奇技术的集大成者。
苏联人在20世纪20年代把蒙太奇理论化,最著名的人物就是Kuleshov以及以他名字命名的库乐雪夫效应(Kuleshov Effect)。爱森斯坦和普多夫希则把蒙太奇理论继续发扬光大,形成了完整的蒙太奇理论。
什么是Kuleshov Effect呢?看下面的几组图,上面一排都是同一幅图,下面是不同的对象。当上下两个镜头拼接在一起时,就会产生不同含义的理解。这就是说镜头A和镜头B的拼接不是简单的1+1=2,而是会激发人的想像,产生1+1>2的效果。有了剪辑技术,同时发生的画面,也可以通过不同时间拍摄的镜头通过剪辑组装让人产生是同时发生的效果。
2
剪辑的工具与概念
视频内容创作流程复杂,对专业性和设备能力有巨大挑战。从底层的网络与媒体协议,再到复杂的编解码与硬件加速,再到高深的图像、音频处理算法,还有不同终端平台的复杂性,整个视频剪辑技术有着艰深、复杂的技术栈体系。
在传统的影视内容制作生产过程中,会用到很多成熟的剪辑工具。比如Adobe公司的Premiere、Final Cut、AE等等。这些工具一般运行在PC端,并且设备有比较好的运算性能和图像加速性能。而且这类工具需要非常专业的技术人员才能使用,无疑增加了门槛。另外相对PC设备,移动设备的计算、存储、渲染能力都比较有限。这些都增加了视频剪辑的难度。近些年,随着移动设备的普及,越来越多的内容是用户产生(UGC),只有快速、炫酷、简单的视频制作工具才能普及到大众。
剪辑的基本概念
对于视频剪辑来说,输入是音频、视频、图片、贴纸等各类素材,剪辑框架需要对这些进行管理。下面列一些最基本的概念:
时间线(Timeline):时间线比较好理解,代表一个时间轴。所有的素材都是安插在时间线上。
轨道(Track) :轨道是独立的音视频单位。轨道和轨道之间在逻辑上是独立的。
素材片段(Clip) :Clip是基本的素材单位,Clip可以摆放在Track上。
特效(Effect) :Effect代表作用在某个Clip、Track、Timeline上的一个效果。常见的滤镜就是一种特效。
转场(Transition) :不同的Clip场景间,时间轴上有重叠的话,需要转场效果来实现平滑的过渡。
层级、深度 :不同的Track间是有三维空间上的深度和层级关系的,上层的能遮挡下层。
剪辑的基本手法
不管对于电影、电视剧,还是咱们当前流行的长、短视频制作,都需要很多种不同的剪辑手法。视频剪辑最核心的还是从时间、空间、图像、声音等方面进行加工处理,下面的图整理归纳整理了常见的分类。通过这些手法的排列组合,再辅助丰富的材料,就能制造出丰富多彩的场景,展示信息、强化表达、传递作者的思想。
3
剪辑SDK的架构设计
剪辑SDK的组件构成
剪辑SDK一般由下面的几部分构成,最上层除了常规的供上层调用的API,还有通用的一些崩溃手机、日志收集的一些功能。中间的业务逻辑层主要管理剪辑的描述操作,主控器、监视组件。这里需要强调一下的是,剪辑一般会提供所见即所得的实时预览画面,这个必须保证实时的速度。而最终合成导出时,因为不需要预览,则是可以全速进行合成的。
剪辑处理逻辑流程
从逻辑上看,剪辑框架处理的过程就是按层级从低先上逐步组合运算的过程。通常一个Clip有音视频和视频轨,视频和音视是分开来处理的。视频轨按时间线的顺序解码各Clip的素材,分别处理布局、特效、转场,然后经过Composition组合成Track级别的图像输出。再经过Track级别的特效处理。不同的Track间再根据层级和深度进行Composition处理,最后再应用上时间线的特效,然后输出到渲染引擎。音视的处理逻辑类似,只不过声音的组合是Mix混音操作,渲染输出是播放PCM而已。
时间轴的管理
无论是剪裁、转场、变速、顺序调节都会带来时长的变化。对靠前的一个clip进行一个裁剪操作,就会导致整个track上后面的资源的时间线整体前移。转场因为两个clip有重叠部分,也会缩短时长。变速也类似,同样影响时长。处理的方式就是每次都分层动态计算。
画面空间布局
对于空间布局而言,采用类似Web开发中的CSS的布局来管理,灵活方便。定位坐标支持了绝对坐标和相对坐标。渲染填充方式也支持多种(CenterIn/CenterOut), 深度上支持Z轴,并支持Alpha混合。
4
性能优化
对于视频而言,无论是编解码还是图像处理,都是个计算密集型的操作。性能上的优化就显得至关重要。
整体的流程大体分4个大的环节:IO线程、解码线程、媒体处理线程、编码线程。
IO线程 :负责读取素材并做解复用。读取出来的数据包是压缩的码流,音视频各自以包队列的方式来管理。
解码线程:解码是计算密集型操作,为了提升解码效率,一般会采用系统自带的硬件加速解码(Android平台的MediaCodec和iOS平台的VideoToolBox). 视频解码后的数据是未压缩数据,占用比较大的内存,所以一般会控制解码后的图像帧队列长度。而且由于图像处理一般会使用GPU来进行处理,所以图像帧一般也会以Texture的方式存储到GPU内存里。
媒体处理线程:媒体处理线程的输入和输出都是原始的未压缩数据。图像对应在GPU里的纹理,PCM一般缓存在内存里。
编码线程:编码的计算量比解码还要大很多,所以更加需要硬件加速来编码。编码完成后,Muxer会把音视频复用到一起存文件输出
整体上看,流水线上下游通过队列来衔接,队列的空满状态传递性能瓶颈,从而制约整体性能。
通常在视频剪辑的流水线中,编解码的开销相对是固定的,但是特效算法则会随着用户添加的特效多少而变化。当叠加的特效算法比较多时,图像处理的环节就成了性能瓶颈,我们可以通过提升渲染的并行度来改善。但采用并发渲染处理后会带来一个问题: 乱序,每个并行的处理线程的处理速度并不完全一样,可能会导致处理完后输出的结果帧并不能保持原始的顺序,这时就需要一个缓存队列来进行排序处理,完全按序的部分则挪到待编码队列。同时,待排序队列与待编码队列的队列长度作为两个反馈信息反馈到并行渲染模块来控制并发的程度。
通常对于一个特效算法模块,为了维护通用性,一般是把filter进行插件化来处理。每添加一个filter,就需要进行一个OpenGL的完整的Pipeline的处理,但是每次完整的渲染流程是有一定Overhead开销的。在追求极致性能的情况下,我们可以动态合并多个shader,只走一次OpenGL的渲染管线处理,这样就能显著降低overhead。如下图所示,当叠加的filter个数N越大时,获得的收益就越高。需要注意的是,像查色图、亮度调节等单像素计算滤镜适合动态合并,而需要领域像素计算的不适合此方法。
在剪辑的操作中,有时会使用倒放的效果。当前视频编码,都是基于顺序播放来设计的(当然可以Seek)。由于视频流是有结构、有解码依赖的序列,不能任意随机访问。Seek到某一帧,必须先Seek到前面的IDR帧开始解码。倒放的场景就需要把GOP解码的数据进行缓存。如果GOP较大,就会消耗过多内存。通常有几种可选的方式
方案1:预处理成全I帧编码,缺点是存储体积较大
方案2:预处理成小GOP的正序,播放时缓存整个GOP,渲染时调整顺序
方案3:预处理成小GOP的逆序文件,播放时不用做特殊处理。
方案3中,为了降低缓存开销,实际上会经历三个步骤:第一步是变成正序小GOP;第二步就是对每个小GOP进行解码再逆序编码,然后调整小GOP的顺序,最终形成全局逆序的小GOP文件。
视频剪辑过程中,一般都需要所见即所得,并且能够保证实时的预览。但对在大分辨率、低端机场合下,处理速度跟不上实时预览的速度。由于图像处理的开销基本和图像的面积成正比,而预览效果时并不需要以原始的分辨率来处理,所以就可以通过降低预览的分辨率来节省开销,使得在大分辨率、低端机场合下还有良好的表现。而对于最终的合成,则还是按最终的画布输出尺寸进行合成,保留期望的画质。
在视频剪辑的过程中,可能还会有频繁的Seek操作。为了加快Seek的速度,非参考帧可以直接丢弃不解码。对于目标Seek位置之前的参考帧虽然解码了,也可以选择不输出。这样能加快seek的速度。
5
兼容性处理
除了性能方面的优化,移动端剪辑工具还需要处理很多兼容性问题。从输入、处理、输出三个方面来讨论。
输入:由于输入是用户提供的,会有多种多样的来源。如果输入的容器格式或编码格式不能够利用系统硬件加速解码,那么就需要提供软件解码来解决。另外,对于手机上的很多素材,还会携带一些属性,比如旋转属性、苹果的慢视频、容器里携带编辑信息等等。这些都需要做不同的处理。
处理:由于用户的终端设备型号、能力各不相同,很多环节需要细致、特殊的对待。比如设备是否支持硬件加速编解码、支持编解码实例的个数、帧Index的个数、OpenGL的兼容性、iOS的wakeup问题等等
输出:输出环节主要是在合成编码。对于编码也存在不同的码率控制模式(VBR、CBR、CQ),Andriod设备的码率控制不是很准,经常会跑偏很多,对设备的码率控制需要根据输出来调整输入参数,把码率控制到期望的码率。另外输出成mp4文件后,为了方便网络播放,一般还会优化一下索引的位置。
6
展望
除了上面介绍的一些剪辑能力外,剪辑也在朝着智能化和3D化渲染发展。3D的渲染结合一些物理引擎、粒子引擎,可以做出更多的炫酷效果。智能化则是利用AI物体检测、场景分类、图像分割的结果,做出更具互动性和趣味性的效果。
除此了移动端的剪辑,还可以把剪辑的脚本送到云端,在云端进行大规模、大批量的模板式生产,形成端云协同。真正做到One Script,Run anywhere。除了做离线的内容生产,端云结合还可以通过类似云游戏的方式,把计算和操作分离,终端进行预览和操作,云端执行真正的计算。这样既能直接使用云端海量的素材,又能直接把结果放在云端,省去终端上传结果的流程。
未来的社会是用视频化来表达的社会,视频剪辑的能力就代表了人的表达能力。360智汇云的视频剪辑SDK赋能内容生产者充分的利用视频表达自我、成就不凡人生!
往期精彩回顾
360技术公众号
技术干货|一手资讯|精彩活动
扫码关注我们