视频分布式上传方案详解

先来说下这个分布式上传功能的背景
来公司之后很长一段时间都在优化改造审核系统,现在审核系统稳定了,而且也可以快速接需求了 。这时候被借到学院这边来做一些优化改造,其中视频分布式上传这个功能存在很多问题,急需改造处理
学院视频上传功能简介
学院这边上传视频的大致步骤如下
老师在教师管理后台上传视频教师管理后台再把视频上传到阿里云的点播平台审核人员去审核上传的视频资源将审核通过的视频进行转码处理将转码后生成的视频加密的播放地址绑定到课时当中学院通过加密的播放地址播放课程进行学习
因此上传视频的功能是非常重要的一环,它的服务对象是老师,在未改造之前的上传功能存在如下问题:
1. 由于历史原因,老的上传功能是 php 实现的、而现有的团队都是 java 程序员,这就导致出现问题无法进行维护2. 老师上传的文件会出现花屏、丢帧等一些质量问题,导致学院学生观看视频的时候客诉率很高3. 老师上传的文件的原文件播放时长与学生看到播放时长存在不一致情况4. 老师在管理后台上传的视频是成功状态,但是后端实际存储的状态是未上传成功的状态5. 老师上传视频完成之后无法覆盖之前的视频
所以改造视频上传这块的功能就成了一个迫在眉睫的一个事情

视频分布式上传方案详解

文章插图
改造上传功能的限制条件
注: 这里的前端有个重要的约束条件,就是分片上传是一块一块上传的,且有先后顺序
提供本地视频文件提供本地文件流或网络流提供视频网络地址
下面是阿里云官网的上传例子
// 视频文件上传// 视频标题(必选)String title = "测试标题";// 1.本地文件上传和文件流上传时,文件名称为上传文件绝对路径,如:/User/sample/文件名称.mp4 (必选)// 2.网络流上传时,文件名称为源文件名,如文件名称.mp4(必选) 。// 3.流式上传时,文件名称为源文件名,如文件名称.mp4(必选) 。// 任何上传方式文件名必须包含扩展名String fileName = "/Users/test/video/test.mp4";// 本地文件上传testUploadVideo(accessKeyId, accessKeySecret, title, fileName);// 待上传视频的网络流地址String url = "http://test.aliyun.com/video/test.mp4";// 2.网络流上传// 文件扩展名,当url中不包含扩展名时,需要设置该参数String fileExtension = "mp4";testUploadURLStream(accessKeyId, accessKeySecret, title, url, fileExtension);// 3.文件流上传testUploadFileStream(accessKeyId, accessKeySecret, title, fileName);// 4.流式上传,如文件流和网络流InputStream inputStream = null;// 4.1 文件流try {inputStream = new FileInputStream(fileName);} catch (FileNotFoundException e) {e.printStackTrace();}// 4.2 网络流try {inputStream = new URL(url).openStream();} catch (IOException e) {e.printStackTrace();}testUploadStream(accessKeyId, accessKeySecret, title, fileName, inputStream);
阿里云提供的 sdk 必需满足一个条件,就是上传的文件或者视频它是本地完整的文件或者流
这里是sdk使用方法:
在改造这个上传功能之前的几种实现方案 方案一,通过代理服务器,将同一个课时的视频定向传输到一台服务器
举个例子:
前端把视频文件分片上传到后端服务器nginx 会反向代理这个上传请求(我们可以在nginx 上面配置一些定向规则),比如我这里的视频对应的课时 id 为经过gninx 定向规则,定向到了服务 1 上面因为每个分片数据上传的时候都会带上课时 id,所以所有的分片数据最终都会存储在服务 1上面,我们在服务1上面进行分片数据合并,然后发送到阿里云点播平台即可