使用无服务器服务构建高可用,低成本的动态添加水印的视频点播系统 – Part 1

使用无服务器服务构建高可用,低成本的动态添加水印的视频点播系统 – Part 1

💡 原文中文,约5000字,阅读约需12分钟。
📝

内容提要

随着移动互联网的发展,保护音视频文件的知识产权变得重要。本文介绍了在亚马逊云科技海外区域使用无服务器服务实现点播视频动态水印功能的方案。

🔎

延伸解读

为什么前端水印不可靠

文章指出,BS场景下前端JavaScript叠加水印层的方式存在明显漏洞:访问者可以跟踪浏览器请求获取干净视频流,或编写油猴脚本屏蔽水印层。因此,对于高价值视频,必须将水印硬编码到视频流中,才能有效防止盗录和追溯泄露源头。这一对比凸显了后端硬水印的必要性。

S3 Object Lambda 的巧妙之处

传统方案要么为每个用户维护独立视频库,要么在S3前构建代理层,前者不现实,后者增加复杂性和成本。S3 Object Lambda允许在S3检索数据时内联调用Lambda函数处理,无需修改应用代码,即可根据用户请求动态添加水印。这避免了冗余存储和代理层,实现了按需转码。

性能与成本的实际表现

测试显示,1080p分辨率下每10秒视频切片转码约需3秒,可支持实时流畅播放。单区域Lambda并发轻松达到800多,相当于调度超过5000个vCPU核心同时转码。这种弹性按需使用计算资源的方式,在保证灵活度的同时降低了维护和资源成本,缩短了项目交付时间。

安全传递水印信息的机制

水印信息通过预签名URL中的查询参数(如X-Amz-WatermarkContent)传递给转码服务,并且该参数被加入待签字符串中进行签名,防止篡改。这样,水印信息以简单、低延迟、可靠且安全的方式传递,避免了额外延迟导致视频播放卡顿,同时确保了水印内容的可信性。

❓

Q&A

为什么BS场景下前端添加水印不可靠,需要后端硬水印?

在BS场景中,前端JavaScript叠加的透明水印层容易被访问者通过跟踪浏览器请求获取干净视频流、编写油猴脚本屏蔽水印层等手段破坏,因此需要后端为视频增加硬水印,将水印信息编码到视频流中,防止盗录和追溯泄露源头。

S3 Object Lambda和S3事件通知有什么区别?

S3事件通知由多种S3事件触发(如对象创建),但不包括S3的Get请求;而S3 Object Lambda专门在S3 Get请求(以及HeadObject、ListObjects等)时触发,允许内联调用Lambda函数处理数据后再返回给应用程序。

动态水印方案中,水印信息是如何安全传递给转码服务的?

水印信息通过预签名URL(PresignURL)传递:视频播放服务在生成PresignURL时,在URL query中增加X-Amz-WatermarkContent等参数,并将这些参数加入待签字符串中进行签名,防止篡改。Lambda函数从URL中解析水印信息,用于添加水印。

Lambda函数如何配置以支持ffmpeg和Pillow库?

由于ffmpeg和Pillow库较大,超过代码包和单个layer的大小限制,因此以两个layer的形式上传到Lambda。Lambda函数内存设置为10240 MB(最大值,对应6vCPU),超时时间设置为59秒。

该方案在1080p视频下的转码性能如何?

经过测试,1080p分辨率下每10秒的视频切片Lambda转码时长约为3秒,可以做到实时流畅播放。单区域Lambda并发执行可轻松跑到800多,按vCPU计算相当于并发调度了超过5000个核心同时进行转码。

使用S3 Object Lambda实现动态水印有哪些优势?

该方案基于无服务器架构,具有高可用、低成本的特点。它无需为每个用户创建视频库,也无需构建代理层,降低了管理复杂性和成本。同时,弹性伸缩和按需使用计算资源显著降低了维护成本与资源成本,并缩短了项目交付时间。

🏷️

标签

➡️

继续阅读