导读:随着移动互联网的发展,视频化浪潮借着5G的东风扑面而来。然而众多用户在进行视频化创做的过程当中,被传统视频编辑器复杂的功能和陡峭的学习曲线劝退。为此,百度百家号业务研发团队结合用户的实际创做需求,开发出一款简单易用的在线视频编辑和发布工具——百家号在线视频编辑器。本文将细致地介绍这一编辑器的技术原理,架构和演进方向,并从一角揭示百度内部的技术合做与创新机制。html
随着移动互联网的快速发展,人们愈来愈习惯于在手机上观看视频内容。百家号做为手百的内容生产平台,须要为做者提供简单易用的视频编辑和发布工具。在线视频编辑器正是在这种需求下应运而生。这篇内容将细致地介绍百家号视频编辑器所采用的技术。前端
名词解释html5
BOS:百度对象存储BOS(Baidu Object Storage)提供稳定、安全、高效以及高扩展存储服务 后端
VOD:视频点播服务,本文特指百度VideoWorks(原VOD 音视频点播服务)浏览器
咱们调查了本地视频编辑器,列举出一些视频编辑器必需要实现的功能:安全
一款在线视频编辑器,一样也要实现上述功能,只是具体实现上有所不一样,例如:网络
此外,依托于百度和百家号技术体系,还能够实现音频转字幕,字幕合成音频,百家号图文内容转视频等额外功能。数据结构
FFmpeg是业界最经常使用的视频编解码集成框架,不只功能强大,并且编解码效率很高。所以,后端服务采用FFmpeg做为视频编解码底层。架构
FFmpeg是一个自由软件,能够运行音频和视频多种格式的录影、转换、流功能。包含了libavcodec——一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。框架
△图 1 ffmpeg
△图 2 ffmpeg命令行用法
例1: ffmpeg -i in.wmv -vcodec libxvid out.mp4 例2: ffmpeg -framerate 1 -t 1 -loop 1 -i "http://pic.rmb.bdstatic.com/2b18b480a1f2d15e3667e01c45dfc157.jpeg" -vcodec libx264 -pix\_fmt yuv420p -y test.mp4
FFmpeg中的Filter(avfilter)一般翻译为过滤器/滤镜,滤镜的做用就是过滤(Filtering))。
任何对解码后的多媒体资源进行的编辑操做都可以称做广义上的Filtering,而进行这些操做的组件和插件,就是滤镜。
例如,音频升降调/速、视频插帧/抽帧、剪裁/截取/合并/叠加等等。
△图 3 FFmpeg转码和Filter过程
基础滤镜使用很是简单,只要在输入文件(及选项)和输出文件(及选项)之间,使用-vf来添加须要的滤镜便可。例如:
ffmpeg -i video_1080p.mp4 -vf scale=w=640:h=360 video_360p.mp4
△图 4 scale示意图
ffmpeg -framerate 1 -t 1 -loop 1-i "http://pic.rmb.bdstatic.com/2b18b480a1f2d15e3667e01c45dfc157.jpeg"-vf"zoompan=z='if(eq(on,0),1,if(lt(zoom,1.25),zoom+0.0005,1.25))':d=16.06*25:x='if(lt(zoom,1.25),0,(x-1))':y='if(lt(zoom,1.25),0,(y+1))':s='1024x720'" -y tmp.mp4
△图 5 zoompan示意图
ffmpeg -i tmp.mp4 -filter_complex "boxblur=luma_radius='min(h,w)/30':luma_power=2" -y boxblur.mp4 模糊虚化
△图 6 boxblur示意图
ffmpeg -i tmp.mp4 -i watermark.png -filter_complex "[1:v]scale=-2:48[logo];[0:v][logo]overlay=48:48" -y watermark.mp4 左上logo
△图 7 overlay示意图
\-filter\_complex " \[0:v\]split\[front\]\[back\]; //复制并分离成front和back两条流 \[back\] //背景流 scale=1280:-2, //等比例缩放到输出宽度1280 boxblur=luma\_radius='min(h,w)/30':luma\_power=2, //模糊 crop=iw:720\[background\]; //剪裁到1280:720 \[front\]scale=-2:720\[foreground\]; //等比例缩放到输出高度720 \[background\]\[foreground\]overlay=(W-w)/2:(H-h)/2 //叠加 "
△图 8 管道化滤镜流示意图
△图 9 管道化滤镜流执行结果
前端界面使用React框架实现,快速预览功能基于浏览器的html5音视频播放器实现,经过html标签传递调整参数给播放器,实现简单的负片、浮雕、黑白等播放效果,经过在视频上叠加动图的方式模拟转场效果。
受限于前端预览方案的性能和复杂度,前端快速预览只能展示部分编辑效果。
进行具体的功能开发以前,须要根据需求和技术能力特色划分先后端功能边界,例如:
前端界面实现
后端服务实现
须要先后端共同实现
根据咱们的功能需求和先后端的功能划分,百家号在线视频编辑器的用户界面大体划分红3个区域:
△图 10 百家号在线视频编辑器界面分区
为了能在先后端之间进行交互,须要定义一种数据结构,这种数据结构要既便于前端多轨道编辑器的加载,修改和存储,又便于后端提取结构化数据。
咱们定义了一种时间轴数据结构,时间轴中的轨道与多轨道编辑器中的轨道一一对应:
{"timeline":{"video_track": [ //视频轨道{"start": 0.0, //开始时间"end": 1.5, //结束时间 = start + duration * speed"type": "video", //能够是视频video, 图片image, 转场动画transition, 黑屏blank"height": 720,"width": 1280,"in_effect": "fade_in", //入场效果"out_effect": "fade_out", //退出效果"style": "negative", // 效果: 负片,模糊,浮雕,黑白 等等"duration": 1.5, //时长"speed": 1, //播放速度"animation": "zoompan", //视频资源的动画效果, 如镜头晃动, 平移放大等"sourceUrl": "http://*.baidu.com/c20ad4d76fe97759aa27a0c99bff6710.mp4"}],"audio_track": [ //音频轨道{"start": 0.0, //开始时间"end": 1.5, //结束时间 = start + duration * speed"type": "video", //能够是视频video(视频音轨), 音频audio, 空白静音slience"in_effect": "fade_in", //入场效果"out_effect": "fade_out", //退出效果"style": "jazz", // 效果: 爵士, 摇滚, 人声 等等平衡器效果"duration": 1.5, //时长"speed": 1, //播放速度"sourceUrl": "http://*.baidu.com/c20ad4d76fe97759aa27a0c99bff6710.mp3","auto_subtitle": true, //语音转字幕}],"subtitle": [ //字幕轨道{"start": 0.0, //开始时间"end": 1.5, //结束时间 = start + duration * speed"type": "video", //能够是视频video(视频音轨), 音频audio, 空白静音slience"style": "Arial,23,yellow,white", // 效果: 字体,大小,颜色,描边颜色"duration": 1.5, //时长"text": "这是一条字幕","pos_x": 100, //字幕定位"pos_y": 200, //字幕定位"tts": true, //使用字幕合成语音}],"watermark": [ //水印,特图{"start": 0.0, //开始时间"end": 1.5, //结束时间 = start + duration * speed"style": "transparent", //能够是透明transparent, 负片 等效果"style_params": "0.8", //效果的具体参数, 如透明度等"duration": 1.5, //时长"sourceUrl": "http://*.baidu.com/c20ad4d76fe97759aa27a0c99bff6710.png","pos_x": 100, //贴图定位"pos_y": 200, //贴图定位"height": 100, //贴图高度"width": 100, //贴图宽度}]},"author_info":{}, //做者信息"extra":{}, //其余信息}
当用户在完成编辑工做后,需点击"保存"按钮提交。这时前端会将多轨道编辑器内全部资源要素封装成时间轴结构传递给后端服务。后端服务接到时间轴结构后会进行转译,并调用FFmpeg进行视频编解码。
后端这一阶段的工做是计算密集型的,一般须要消耗时间轴长度2-5倍的时间来完成视频最终合成。所以点击"保存"按钮后,前端采用异步调用 + 按期轮询状态的方式检查后端视频合成是否完成。
前面提到后端服务要对前端传递来的时间轴进行转译,转写成FFmpeg命令。
这一步的主要流程以下图所示:
△图 11 时间轴转译FFmpeg命令程图
△图 12 总体架构
目前视频编辑器提供了两种使用方法:面向最终用户的图形界面和面向开发者的服务接口。
其中图形界面集成在百家号内容创做后台,现已对部分百家号做者开放,而经过接口提供的音频转码,视频合并等服务也已经应用到了百家号线上服务当中。
在业务层中,为了隔离内外部网络请求,添加了UI层模块,用于处理来自于图形界面的视频编辑请求。Service模块是基于PHP开发的编辑器核心模块,主要做用是将图形界面和服务接口这两种类型的请求打平,将时间轴数据结构转译出可以直接执行的FFmpeg命令,并送给离线调度模块执行。
业务层Service模块在转译时主要完成了以下工做:
△图 13 overlay添加过场动画
△图 14 特效字幕头
在业务层中,涉及到用户信息、物料信息、语音合成等各类查询和调用,这些功能均由百家号和百度内部服务提供。
Dispatch是一个分布式的任务调度系统,负责在多个实例(或容器内)均衡地执行FFmpeg请求,将生成资源上传BOS/VOD,回调Service层模块返回任务调度的执行结果。
FFmpeg是一套开源的、完善的音视频流转编码自由软件,负责最终执行FFmpeg命令,生成音视频文件。
△图 15 Dispatch架构
相比视频编辑器,图文转视频项目的用户界面取消了时间轴,转而采用"场景(Scene)"这一律念。即一张图+一段话即是一个场景,视频就是由场景串接起来的。
△图 16 以场景为单元建立视频(设计稿)
得益于场景这一简单概念,能够将落地页URL简单地转成场景,从而让图文/图集做者能够一键开始视频内容的编辑和创做。
图17展现了这一创做过程的流程图。
△图17 URL转视频流程
当转成时间轴以后,便可调用视频编辑器的接口,生成和发布视频。
文末会附上几个图文转视频项目在技术验证时生成的视频,以展示实际效果。
请前往该连接观看:https://mp.weixin.qq.com/s/wH...
百家号的在线视频编辑器技术能够简单总结为:后端使用PHP将前端JS生成的时间轴格式数据转译成FFmpeg命令,并经过Dispatch调度调度框架来执行FFmpeg产出最终视频。从这一层面看,这一技术没有高深的技术门槛,没有复杂抽象的逻辑模型,咱们的技术创新,主要是组合现有技术,造成一项适应潮流的新的技术方案。
伴随着视频化浪潮到来的,不只是普通用户对视频内容的大量需求,还有创做者对视频编辑工具便利性的热切期待。百家号一直站创做者的角度,为创做者们提供更加优秀的视频编辑器。但愿经过咱们的努力,给视频化浪潮里的创做者们带去得力的船桨。
在百家号在线视频编辑器技术发展过程当中,吸引了来自百度ACG的媒体云团队的关注,两个团队在在线视频编辑器技术上进行了深刻的技术交流。
随后,百度媒体云基于这一技术开发出了智能视频快编服务。得益于媒体云的长期技术积累和对视频编辑底层技术的深刻挖掘,智能视频快编服务使用智能分片+GPU编解码技术,将视频编辑合成的效率提高了数倍,同时也提供了更多新特性和新功能,使在线视频编辑技术更加实用化。
目前,百家号正在将视频编辑器及通用视频编辑能力的底层服务逐步迁移到媒体云的智能视频快编服务。百家号团队做为在线视频编辑器技术的输出方,已经开始享受技术合做带来的红利。
原文连接:https://mp.weixin.qq.com/s/wH...
---------- END ----------
百度架构师
百度官方技术公众号上线啦!
技术干货 · 行业资讯 · 线上沙龙 · 行业大会
招聘信息 · 内推信息 · 技术书籍 · 百度周边
欢迎各位同窗关注!