硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

Video Renderer:高性能移动 Web 端视频编辑器

  • 2019-09-05
  • 本文字数:990 字

    阅读完需:约 3 分钟

Video Renderer:高性能移动Web端视频编辑器

Video Renderer是一款针对移动 Web 应用开发的高性能视频编辑器。在 2019 伦敦全栈工程师大会(Fullstack London 2019 conference)上,Threads Styling公司的软件开发工程师Forbes Lindesay分享了 Video Renderer 的开发经验。


Canvas API支持在浏览器内编辑视频,但通常用于编辑静态图像。Canvas API 特别适合在画布内渲染单个视频帧甚至是整个视频。


下面给出的代码示例来自“video + canvas = magic”:


function draw(v,c,w,h) {    if(v.paused || v.ended) return false;    c.drawImage(v,0,0,w,h);    setTimeout(draw,20,v,c,w,h);}
复制代码


代码中定义的函数以 HTML 视频元素、Canvas 元素、当前帧的宽度和高度为输入,调用drawImage将视频当前栈复制到 Canvas 元素中,进而调用 setTimeout 设置 20 毫秒超时,形成 50 fps 的流畅视频。


图像一旦复制到 Canvas 中,就可以读取并编辑单个帧。这时,每个帧可视为静态的图像,进而可直接使用 Github 上提供的多种 Canvas 图像操作软件库。


编辑器设计提供的另一项功能是分层(Layering)。对于堆栈,在当前视频之上入栈另一个视频非常易于实现,但绘图和动画的入栈并非易事。这是因为绘图和动画通常含有透明属性,该属性不支持开箱即用。


为解决上述问题,最简单的做法是在服务器添加一步额外的操作。一旦用户上载图像,就创建该图像的黑白拷贝。其中,白色表示图像中的可见部分,黑色表示图像中的透明区域。进而,编辑器使用一种“透明指引机制”,判断图像中应绘制的区域,然后剩余的区域渲染背景视频。


为在服务器端创建上述“透明指引机制”,编辑器设计上使用了FFmpeg软件库提供的 FilterComplex 方法。FFmpeg 支持创建图像过滤器。


需指出的是,在浏览器中构建视频编辑器存在一个局限。尽管视频编辑功能在浏览器中运行得非常好,但是不推荐对压缩视频使用,尤其是在移动端。为解决这一局限,编辑器将复制服务器端编辑的视频,进而使用 FFmpeg 生成并压缩视频。为此,在向服务器发送原始视频的同时,会发送可重现用户已完成编辑操作的一系列指令。


这是一种临时的解决方案。未来,编辑器将考虑使用WebAssembly在浏览器中编译并运行 FFmpeg。事实上,对此Github上已有实验性项目,但是该项目尚未达到可适用于生产环境。


上面介绍了 Threads Styling 移动端视频编辑器的关键技术。该编辑器以 MIT 许可方式提供在Github上。


原文链接:


High Performance Video Editing for the Mobile Web


2019-09-05 08:008017
用户头像

发布了 391 篇内容, 共 153.2 次阅读, 收获喜欢 257 次。

关注

评论 1 条评论

发布
用户头像
赞,最近正好在研究这个
2020-02-23 16:25
回复
没有更多了
发现更多内容

产品经理训练营Week14学习心得

Mai

模块二:课后作业

iHai

架构实战营

架构训练营-模块二作业

Neil43

架构训练营

Spark任务等待与运行策略

小舰

4月日更

【LeetCode】移除元素Java题解

Albert

算法 LeetCode 4月日更

阿里P7手把手教你!系统学Android从零开始,内含福利

欢喜学安卓

android 程序员 面试 移动开发

微信朋友圈高性能复杂度分析

thewangzl

微信朋友圈高性能架构

chenmin

图算法系列之无向图的数据结构

Silently9527

Java 数据结构和算法 图算法 无向图

模块2—分析一下微信朋友圈的高性能复杂度

sandy

架构实战营

架构实战营第二模块作业

DZ

架构实战营-作业2

大肚皮狒狒

作业

华仔架构-模块

大师兄

后端服务太多,且涉及多种语言,如何进行高效管理?

我爱娃哈哈😍

架构 架构设计 架构场景实战

这三年被分布式坑惨了,曝光十大坑

悟空聊架构

6种常见的地标识别算法整理和总结

华为云开发者联盟

KNN CNN 地标识别 GLDv2 地标识别算法

使用gradle插件发布项目到nexus中央仓库

程序那些事

Java maven Gradle 程序那些事

细说Python Lambda函数的用法,建议收藏!

华为云开发者联盟

Python 函数 匿名 Lambda函数 表达式

app架构师,10天拿到字节跳动安卓岗位offer,好文推荐

欢喜学安卓

android 程序员 面试 移动开发

架构实战营模块 2 作业

Lukefang

架构实战营模块2作业

林子钧

作业 架构实战营 模块二

产品经理训练营 Week3 学习心得

Mai

产品经理训练营 Week4 学习心得

Mai

架构实战营 模块二作业

Dylan

架构实战营

一文搞懂分布式锁的原理与实现

架构精进之路

分布式锁 4月日更

带你入门目标检测算法

华为云开发者联盟

网络 数据集 目标检测 yolo two-stage

一文带你更方便的控制 goroutine

万俊峰Kevin

线程 并发 Go 语言 goroutine

关于 Spring 中 getBean 的全流程源码解析

小傅哥

Java spring 源码分析 小傅哥 getBean流程

聪明人的训练(十九)

Changing Lin

4月日更

陌陌一面,为什么SpringBoot的 jar 可以独立运行?

Java小咖秀

jar maven springboot 集成 pom

甲方日常 94

句子

工作 随笔杂谈 日常

Video Renderer:高性能移动Web端视频编辑器_大前端_Guy Nesher_InfoQ精选文章