forked from hauk0101/video-hls-encrypt
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
56 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,62 @@ | ||
## 深入浅出基于HLS流媒体协议视频加密的解决方案 | ||
|
||
一套简单的基于HLS流媒体协议,使用video.js + NodeJS + FFmpeg等相关技术实现的m3u8+ts+aes128视频加密及播放的解决方案示例。 | ||
一套简单的基于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:https://localhost:3000` | ||
* 按照页面中的顺序进行相关操作 | ||
|
||
|
||
#### 项目原理 | ||
本项目的核心原理其实就是讲解了一个视频源从正常的mp4格式如何变为加密后的m3u8文件+ts文件+key秘钥文件,之后又如何在服务端被限制访问,最终能够在客户端正常播放的视频加密、解密并播放的流程。 | ||
|
||
> 项目目录说明 | ||
|
||
> 项目原理图示 | ||
|
||
#### 技术栈 | ||
* NodeJS + Express 实现服务器开发 | ||
* FFmpeg + fluent-ffmpeg 实现node环境下的视频转码、加密 | ||
* socket.io 通过websocket相关的类库,实现实时输出FFmpeg进行的视频转码、加密操作 | ||
* video.js + videojs-contrib-hls.js 实现客户端的视频解密及播放 | ||
* html + css + js 实现简单的前端开发 | ||
|
||
#### 建议 | ||
|
||
* 本项目更多的价值在于展示出一整套的加密原理,同时为了证明这套原理的可行性,做的比较简单的示例。 | ||
* 本项目不会提供相关技术栈的使用教程。 | ||
* 如果需要在实际应用中使用相关原理或技术栈,建议根据实际项目对部分或整体解决方案进行完善和扩展。 | ||
|
||
#### 杂谈 | ||
_以下的内容均为个人观点,仅供参考_ | ||
|
||
由于本人自身是做前端开发的,所以很多相关的示例都是基于前端考虑,对于后端的相应的策略并不是很专业。比如后端服务器,也采用的是偏前端的`NodeJS`。我想表达的是,在整套解决方案中,我主要做了3件事: | ||
* 第一,把mp4的视频源通过`FFmpeg`转换为加密后的`m3u8`文件和`ts`文件以及关键的加密密钥`key`文件; | ||
* 第二,通过最简单的权限访问,保护加密密钥key文件; | ||
* 第三,利用`video.js`及相关的`videojs-contrib-hls.js`实现客户端的视频文件解密,并播放。 | ||
|
||
因此可以看出关于视频加密的解决方案中,最重要的其实是如何保护加密密钥`key`文件,而这部分工作更多的是在于服务器端的相关策略,比如可以使用`cookie`、`session`相关技术、添加自定义`token`校验、有效时长机制等等方法保证秘钥key文件的相对安全性、可靠性。 | ||
而如何将视频源文件转化为对应的加密后的文件,可以更多的研究开源库`FFmpeg`的使用,甚至如果没有迫切需求,可以考虑使用第三方视频云服务商的相关解决方案。至于客户端的视频解密,也可以研究`video.js`相关的内容。 |