当前位置:网站首页>阿里云视频点播+项目实战
阿里云视频点播+项目实战
2022-07-30 22:27:00 【Fairy要carry】
目录
场景:
功能十分多,可以对视频进行加密,防止盗链,并且节省了资源,覆盖了加速节点,安全系数高


流程:
- 用户获取上传授权。
- VoD下发 上传地址和凭证 及 VideoId。
- 用户上传视频保存视频ID(VideoId)。
- 用户服务端获取播放凭证。
- VoD下发带时效的播放凭证。
- 用户服务端将播放凭证下发给客户端完成视频播放。

设置转码格式

配置域名



项目实战
配置文件
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-sdk-vod-upload</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
</dependencies># 服务端口
server.port=8003
# 服务名
spring.application.name=service-vod
# 环境设置:dev、test、prod
spring.profiles.active=dev
#阿里云 vod
#不同的服务器,地址不同
aliyun.vod.file.keyid=your accessKeyId
aliyun.vod.file.keysecret=your accessKeySecret
# 最大上传单个文件大小:默认1M
spring.servlet.multipart.max-file-size=1024MB
# 最大置总上传的数据大小 :默认10M
spring.servlet.multipart.max-request-size=1024MB启动类
package com.guli.vod;
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(basePackages={"com.atguigu"})
public class VodApplication {
public static void main(String[] args) {
SpringApplication.run(VodApplication.class, args);
}
}整合阿里云Vod实现视频上传
1.创建一个常量类读取配置文件配置的视频点播的密钥
package com.guli.vod.util;
@Component
//@PropertySource("classpath:application.properties")
public class ConstantPropertiesUtil implements InitializingBean {
@Value("${aliyun.vod.file.keyid}")
private String keyId;
@Value("${aliyun.vod.file.keysecret}")
private String keySecret;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
@Override
public void afterPropertiesSet() throws Exception {
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
}
}2.创建一个VodClient客户端
通过地域节点,key和密钥塑造一个客户端client
package com.atguigu.vod.Utils;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
public class InitVodClient {
//填入AccessKey信息
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
String regionId = "cn-shanghai"; // 点播服务接入地域
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
}
3.创建Service接口,并创建对应的业务逻辑
package com.guli.vod.service;
public interface VideoService {
String uploadVideo(MultipartFile file);
}4.业务类,上传视频到阿里云
根据我们的demo写法就行,1.首先是得到上传文件的名称,定义一个流——>2.然后将key和密钥,文件名称,流封装到UploadStreamRequest中——>3.根据UploadVideoImpl定义的上传api:uploadStream()将请求封装起来得到响应UploadStreamResponse——>4.最后判断响应状态,返回响应的vido的id
删除阿里云视频,业务类似,只是说用的request请求不再是上传了,用的是删除
package com.atguigu.vod.service.impl;
import com.aliyun.vod.upload.impl.UploadVideoImpl;
import com.aliyun.vod.upload.req.UploadFileStreamRequest;
import com.aliyun.vod.upload.req.UploadStreamRequest;
import com.aliyun.vod.upload.resp.UploadFileStreamResponse;
import com.aliyun.vod.upload.resp.UploadStreamResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.vod.model.v20170321.DeleteVideoRequest;
import com.atguigu.eduservice.R;
import com.atguigu.eduservice.exceptionHandler.GuliException;
import com.atguigu.vod.Utils.ConstantVodUtils;
import com.atguigu.vod.Utils.InitVodClient;
import com.atguigu.vod.service.VodService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.List;
@Service
public class VodServiceImpl implements VodService {
/**
* 上传视频到阿里云
* @param file
* @return
*/
@Override
public String uploadVideoAly(MultipartFile file) {
try {
//accessKeyId, accessKeySecret
//fileName:上传文件原始名称
String fileName = file.getOriginalFilename();
//title:上传之后显示名称
String title = fileName.substring(0, fileName.lastIndexOf("."));
//inputStream:上传文件输入流
InputStream inputStream = file.getInputStream();
UploadStreamRequest request = new UploadStreamRequest(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET, title, fileName, inputStream);
UploadVideoImpl uploader = new UploadVideoImpl();
UploadStreamResponse response = uploader.uploadStream(request);
String videoId = null;
if (response.isSuccess()) {
videoId = response.getVideoId();
} else { //如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因
videoId = response.getVideoId();
}
return videoId;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 删除多个云视频
* @param videoIdList
*/
@Override
public void removeMoreAlyVideo(List<String> videoIdList) {
try {
//初始化对象(连接我们的云客户端)
DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
//创建删除视频的request对象
DeleteVideoRequest request = new DeleteVideoRequest();
//将videoIdList值转为1,2,3这种
String videoIds = StringUtils.join(videoIdList.toArray(), ",");
//然后向request设置视频id
request.setVideoIds(videoIds);
//返回response
client.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
throw new GuliException(20001,"删除视频失败");
}
}
}
5.控制层
package com.atguigu.vod.controller;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.vod.model.v20170321.DeleteVideoRequest;
import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthRequest;
import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse;
import com.atguigu.eduservice.R;
import com.atguigu.eduservice.exceptionHandler.GuliException;
import com.atguigu.vod.Utils.ConstantVodUtils;
import com.atguigu.vod.Utils.InitVodClient;
import com.atguigu.vod.service.VodService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Api(description = "上传视频")
@RestController
@RequestMapping("/eduvod/video")
@CrossOrigin
public class CodController {
@Autowired
private VodService vodService;
/**
* 1.上传视频到阿里云
*/
@PostMapping("uploadAlyiVideo")
public R uploadAlyiVideo(MultipartFile file){
String vodId=vodService.uploadVideoAly(file);
return R.ok().data("vodId",vodId);
}
/**
* 2.根据id删除阿里云视频
* 这里需要注意,我们只是删除了阿里云的东西,如果数据库中小节里面的视频id要删除还需要再前端调用接口进行思考
*/
@DeleteMapping("removeAlyVideo/{id}")
public R removeAlyVideo(@PathVariable String id){
try {
//初始化对象(连接我们的云客户端)
DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
//创建删除视频的request对象
DeleteVideoRequest request = new DeleteVideoRequest();
//然后向request设置视频id
request.setVideoIds(id);
//返回response
client.getAcsResponse(request);
return R.ok();
} catch (ClientException e) {
e.printStackTrace();
throw new GuliException(20001,"删除视频失败");
}
}
/**
* 3.删除多个阿里云视频
* 参数:多个视频id
*/
@DeleteMapping("delete-batch")
public R deleteBatch(@RequestParam("videoIdList") List<String> videoIdList){
vodService.removeMoreAlyVideo(videoIdList);
return R.ok();
}
/**
* 4.根据视频id获取视频凭证
*/
@GetMapping("getPlayAuth/{vid}")
public R getPlayAuth(@PathVariable String vid){
try {
//1.初始化对象client
DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
//2.创建获取凭证的request和resp对象
GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();
//3.向req中设置视频id
request.setVideoId(vid);
//4.调用方法得到凭证
GetVideoPlayAuthResponse response = client.getAcsResponse(request);
String playAuth = response.getPlayAuth();
return R.ok().data("playAuth",playAuth);
} catch (Exception e) {
throw new GuliException(20001,"获取凭证失败");
}
}
}
整合阿里云视频播放器
1.首先根据VodClient利用key和密钥初始化一个client——>2.然后定义一个获取视频凭证的request,里面封装视频id——>3.然后client通过这个reuqest请求得到response凭证——>4.最后根据response去getPlayAuth凭证并且进行响应
package com.guli.vod.controller;
@Api(description="阿里云视频点播微服务")
@CrossOrigin //跨域
@RestController
@RequestMapping("/vod/video")
public class VideoController {
@GetMapping("get-play-auth/{videoId}")
public R getVideoPlayAuth(@PathVariable("videoId") String videoId) throws Exception {
//获取阿里云存储相关常量
String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
//初始化
DefaultAcsClient client = AliyunVodSDKUtils.initVodClient(accessKeyId, accessKeySecret);
//请求
GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();
request.setVideoId(videoId);
//响应
GetVideoPlayAuthResponse response = client.getAcsResponse(request);
//得到播放凭证
String playAuth = response.getPlayAuth();
//返回结果
return R.ok().message("获取凭证成功").data("playAuth", playAuth);
}
}前端方面
1.点击之后进入这个url,并且传入视频的id,这个视频也就是我们的小节,小节上面是我们的章节,章节上面是课程,层层封装,我们只需要再页面中获取我们的课程信息就可以进而获取章节和视频id了
<ol class="lh-menu-ol" style="display: block">
<li
class="lh-menu-second ml30"
v-for="video in chapter.children"
:key="video.id"
>
<a
:href="'/player/' + video.videoSourceId"
target="_blank"
>
<span class="fr">
<i class="free-icon vam mr10">在线观看</i>
</span>
<em class="lh-menu-i-2 icon16 mr5"> </em
>{
{ video.title }}
</a>
</li>
</ol>2.从这个api中调用后台接口获取视频凭证
const api_name = '/vod/video'
export default {
getPlayAuth(vid) {
return request({
url: `${api_name}/get-play-auth/${vid}`,
method: 'get'
})
}
}3.创建播放的页面
<template>
<div>
<!-- 阿里云视频播放器样式 -->
<link rel="stylesheet" href="https://g.alicdn.com/de/prismplayer/2.8.1/skins/default/aliplayer-min.css" >
<!-- 阿里云视频播放器脚本 -->
<script charset="utf-8" type="text/javascript" src="https://g.alicdn.com/de/prismplayer/2.8.1/aliplayer-min.js" />
<!-- 定义播放器dom -->
<div id="J_prismPlayer" class="prism-player" />
</div>
</template>4.通过异步方法根据视频id获取播放凭证
<script>
import vod from '@/api/vod'
export default {
layout: 'video',//应用video布局
asyncData({ params, error }) {
return vod.getPlayAuth(params.vid).then(response => {
// console.log(response.data.data)
return {
vid: params.vid,
playAuth: response.data.data.playAuth
}
})
}
}
</script>5.创建播放器
/**
* 页面渲染完成时:此时js脚本已加载,Aliplayer已定义,可以使用
* 如果在created生命周期函数中使用,Aliplayer is not defined错误
*/
mounted() {
new Aliplayer({
id: 'J_prismPlayer',
vid: this.vid, // 视频id
playauth: this.playAuth, // 播放凭证
encryptType: '1', // 如果播放加密视频,则需设置encryptType=1,非加密视频无需设置此项
width: '100%',
height: '500px'
}, function(player) {
console.log('播放器创建成功')
})
}其他选项
// 以下可选设置
cover: 'http://guli.shop/photo/banner/1525939573202.jpg', // 封面
qualitySort: 'asc', // 清晰度排序
mediaType: 'video', // 返回音频还是视频
autoplay: false, // 自动播放
isLive: false, // 直播
rePlay: false, // 循环播放
preload: true,
controlBarVisibility: 'hover', // 控制条的显示方式:鼠标悬停
useH5Prism: true, // 播放器类型:html5功能展示:阿里云Aliplayer播放器
边栏推荐
- 3 minutes to take you to understand WeChat applet development
- QT 在父类中添加子类的流程,object tree,
- cmd (command line) to operate or connect to the mysql database, and to create databases and tables
- ClickHouse 数据插入、更新与删除操作 SQL
- MySQL 8.0.29 设置和修改默认密码
- DistSQL 深度解析:打造动态化的分布式数据库
- 解决一个Mysql的utf8编码导致的问题
- MySql 5.7.38 download and installation tutorial, and realize the operation of MySql in Navicat
- 【CTF】buuctf web 详解(持续更新)
- Installation and use of cnpm
猜你喜欢
随机推荐
2022.7.27
Successfully resolved ModuleNotFoundError: No module named 'Image'
MYSQL JDBC图书管理系统
Go1.18升级功能 - 模糊测试Fuzz 从零开始Go语言
PhpMetrics usage
MySql创建数据表
Ningbo Zhongning Pawn will transfer 29.5% of the equity for 2.8338 million yuan, and the owner's equity in 2021 will be 9.6875 million yuan
2022.7.28
1064 Complete Binary Search Tree
MySQL 8.0.29 decompressed version installation tutorial (valid for personal testing)
VS2017 compile Tars test project
Navicat cannot connect to mysql super detailed processing method
正则表达式语法及使用
Detailed explanation of the delete problem of ClickHouse delete data
StoneDB 为何敢称业界唯一开源的 MySQL 原生 HTAP 数据库?
2022/07/30 学习笔记 (day20) 面试题积累
2022.7.27
MySQL user authorization
MySql 5.7.38下载安装教程 ,并实现在Navicat操作MySql
Day 16 of HCIP









