1:開通視訊點播服務,并可以上傳視訊做一些設定,轉碼,分類等
2:根據官方提供sdk示例, 實作上傳視訊功能
3:代碼實作
引入依賴
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20170516</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
這個塊有個問題,使用上傳SDK aliyun-java-vod-upload-1.4.13.jar時,這個包下載下傳不下來,是由于這個包沒有開源,
那麼先解決這個問題,
1:先在官方文檔中下載下傳Java上傳SDK及示例代碼VODUploadDemo-java-1.4.13.zip
2:解壓後打開lib目錄,然後打開cmd視窗,執行如下指令,版本号根據自己的修改
mvn install:install-file -DgroupId=com.aliyun -DartifactId=aliyun-sdk-vod-upload -Dversion=1.4.11 -Dpackaging=jar -Dfile=aliyun-java-vod-upload-1.4.11.jar
3:根據下載下傳的aliyun-java-vod-upload-1.4.13.jar中的 UploadVideoDemo.java檔案參照,裡面都是上傳案例,我們用流的方式上傳,代碼如下
controller層
@PostMapping("uploadAlyiVideo")
public R uploadAlyiVideo(MultipartFile file) {
//傳回上傳視訊id
String videoId = vodService.uploadVideoAly(file);
return R.ok().data("videoId",videoId);
}
service層
@Override
public String uploadVideoAly(MultipartFile file) {
try {
//accessKeyId, accessKeySecret
//fileName:上傳檔案原始名稱
// 01.03.09.mp4
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;
}
}
4:删除視訊案例:
controller層:
//根據視訊id删除阿裡雲視訊
@DeleteMapping("removeAlyVideo/{id}")
public R removeAlyVideo(@PathVariable String id) {
try {
//初始化對象
DefaultAcsClient client = InitVodCilent.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
//建立删除視訊request對象
DeleteVideoRequest request = new DeleteVideoRequest();
//向request設定視訊id
request.setVideoIds(id);
//調用初始化對象的方法實作删除
client.getAcsResponse(request);
return R.ok();
}catch(Exception e) {
e.printStackTrace();
throw new MyRuntimeException(20001,"删除視訊失敗");
}
}
//删除多個阿裡雲視訊的方法
//參數多個視訊id List videoIdList
@DeleteMapping("delete-batch")
public R deleteBatch(@RequestParam("videoIdList") List<String> videoIdList) {
vodService.removeMoreAlyVideo(videoIdList);
return R.ok();
}
service層
@Override
public void removeMoreAlyVideo(List videoIdList) {
try {
//初始化對象
DefaultAcsClient client = InitVodCilent.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);
//調用初始化對象的方法實作删除
client.getAcsResponse(request);
}catch(Exception e) {
e.printStackTrace();
throw new MyRuntimeException(20001,"删除視訊失敗");
}
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("11");
list.add("22");
list.add("33");
// 11,22,33
String join = StringUtils.join(list.toArray(), ",");
System.out.println(join);
}
三:實作在浏覽器播放阿裡雲點播視訊
注意: 其中如果不是加密轉碼視訊,就直接用視訊位址播放就可以,但是如果是轉碼加密視訊,就需要擷取播放憑證後才能轉碼
參考文檔:https://help.aliyun.com/document_detail/61109.html
一、後端擷取播放憑證
//根據視訊id擷取視訊憑證
@GetMapping("getPlayAuth/{id}")
public R getPlayAuth(@PathVariable String id) {
try {
//建立初始化對象
DefaultAcsClient client =
InitVodCilent.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
//建立擷取憑證request和response對象
GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();
//向request設定視訊id
request.setVideoId(id);
//調用方法得到憑證
GetVideoPlayAuthResponse response = client.getAcsResponse(request);
String playAuth = response.getPlayAuth();
return R.ok().data("playAuth",playAuth);
}catch(Exception e) {
throw new MyRuntimeException(20001,"擷取憑證失敗");
}
}
二、前端播放器整合
<template>
<div>
<!-- 阿裡雲視訊播放器樣式 -->
<link rel="stylesheet" href="https://g.alicdn.com/de/prismplayer/2.8.1/skins/default/aliplayer-min.css" target="_blank" rel="external nofollow" >
<!-- 阿裡雲視訊播放器腳本 -->
<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>
<script>
import vod from '@/api/vod'
export default {
layout: 'video',//應用video布局
asyncData({ params, error }) {
console.log(params)
console.log(params.vid)
return vod.getPlayAuth(params.vid)
.then(response => {
return {
playAuth: response.data.data.playAuth,
vid: params.vid
}
})
},
mounted() { //頁面渲染之後 created
new Aliplayer({
id: 'J_prismPlayer',
vid: this.vid, // 視訊id
playauth: this.playAuth, // 播放憑證
encryptType: '1', // 如果播放加密視訊,則需設定encryptType=1,非加密視訊無需設定此項
width: '100%',
height: '500px',
// 以下可選設定
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
}, function(player) {
console.log('播放器建立成功')
})
}
}
</script>