本文只讨论应用于浏览器环境的流媒体协议的加密。
背景
付费观看视频的模式是很多平台的核心业务,如果视频被录制并非法传播,付费业务将受到严重威胁。因此对视频服务进行加密的技术变得尤为重要。
本文所指的视频加密是为了让要保护的视频不能轻易被下载,即使下载到了也是加密后的内容,其它人解开加密后的内容需要付出非常大的代价。
无法做到严格的让要保护的视频不被录制,原因在于你需要在客户端播放出视频的原内容,解密的流程在客户端的话不法分子就能模拟整个流程,最保守也能用屏幕录制软件录制到视频的原内容(可以通过加水印的方法缓解下)。我们的目标是让他获取原内容的代价更大。
本文为大家提供了一套简单的基于HLS流媒体协议,使用video.js + NodeJS + FFmpeg等相关技术实现的m3u8+ts+aes128视频加密及播放的解决方案示例。
目录
项目简介
起初是为了将工作中已有的基于Flash的视频播放器替换为不依赖Flash的HTML5视频播放器,主要使用了现有的video.js开源播放器做的定制化开发。当完成视频播放器的制作后,在进一步延伸Web端视频加密的相关内容时,开始了解并逐渐深入的研究了相关视频加密内容。最终通过整理归纳,以及自身的理解,做了这个简单的Demo。目的是为了能够给在视频加密这方面有相同目的的道友提供微薄的帮助,要是能起到抛砖引玉的效果,自然是再好不过了。
项目启动
1.安装项目环境
- 安装node、npm环境
- 根据app目录下的package.json安装对应的npm包
- 安装ffmpeg
2.启动项目
- 在app目录下,输入
npm start
,启动项目 - 在浏览器中访问
http://localhost:3000
- 按照页面中的顺序进行相关操作
3.权限登录
- 用户名:admin
- 密码:admin
项目原理
本项目的核心原理其实就是讲解了一个视频源从正常的mp4格式如何变为加密后的m3u8文件+ts文件+key秘钥文件,之后又如何在服务端被限制访问,最终能够在客户端正常播放的视频加密、解密并播放的流程。
项目原理图示
技术栈
- NodeJS + Express 实现服务器开发
- FFmpeg + fluent-ffmpeg 实现node环境下的视频转码、加密
- socket.io 通过websocket相关的类库,实现实时输出FFmpeg进行的视频转码、加密操作
- video.js + videojs-contrib-hls.js 实现客户端的视频解密及播放
- html + css + js 实现简单的前端开发