阿里云-視頻點(diǎn)播(ApsaraVideo VoD,簡(jiǎn)稱VoD)是集視頻采集、編輯、上傳、媒體資源管理、自動(dòng)化轉(zhuǎn)碼處理(窄帶高清?)、視頻審核分析、分發(fā)加速于一體的一站式音視頻點(diǎn)播解決方案。
我的視頻點(diǎn)播后臺(tái)鏈接:https://vod.console.aliyun.com/#/overview 個(gè)人消費(fèi)明細(xì):https://usercenter2.aliyun.com/finance/fund-flow?spm=5176.12818093.ProductAndResource–ali–widget-home-billing-overview.dfinance.3be916d0ACbqBL
一、開(kāi)通視頻點(diǎn)播服務(wù),選擇按流量計(jì)費(fèi)
這邊建議往賬號(hào)里充個(gè)幾毛錢,正常開(kāi)發(fā)基本夠用了,用量小于50G是不收費(fèi)的
阿里云視頻點(diǎn)播服務(wù)界面,未開(kāi)通的點(diǎn)擊開(kāi)通,開(kāi)通后可以查看價(jià)格及服務(wù)介紹,點(diǎn)擊管理控制臺(tái),就可以來(lái)到我們的一個(gè)視頻點(diǎn)播管理后臺(tái)界面了
參考文章:https://blog.csdn.net/qq_33857573/article/details/79564255
二、使用Java代碼整合阿里云視頻點(diǎn)播服務(wù)[參考服務(wù)端和上傳SDK]
獲取視頻播放地址 獲取視頻播放憑證 上傳視頻到阿里云視頻點(diǎn)播服務(wù)
注意:加密視頻不能直接通過(guò)視頻存儲(chǔ)id查看,而需要綁定域名,數(shù)據(jù)庫(kù)存儲(chǔ)的是視頻id,而不是視頻地址(視頻加密后,直接訪問(wèn)地址無(wú)效,需要獲取視頻播放簽證,然后整合阿里云視頻播放器播放)
服務(wù)端和客戶端SDK介紹
引入相關(guān)依賴
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.6.0</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-vod</artifactId><version>2.16.10</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-kms</artifactId><version>2.10.1</version>
</dependency>
初始化:編寫視頻點(diǎn)播 初始化對(duì)象 [AccessKey初始化] InitObject
package com.xxz.test;import com.aliyun.oss.ClientException;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;/*** 視頻點(diǎn)播 初始化對(duì)象 [AccessKey初始化]*/
public class InitObject {//填入AccessKey信息public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {String regionId = "cn-shanghai"; // 點(diǎn)播服務(wù)接入地域DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);DefaultAcsClient client = new DefaultAcsClient(profile);return client;}}
Vod視頻點(diǎn)播相關(guān)測(cè)試TestVod.java
package com.xxz.test;import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.vod.model.v20170321.GetPlayInfoRequest;
import com.aliyuncs.vod.model.v20170321.GetPlayInfoResponse;import java.util.List;/*** Vod視頻點(diǎn)播相關(guān)測(cè)試*/
public class TestVod {// 測(cè)試 阿里云 存儲(chǔ)視頻 id :b45893008b5871ed808f6723a78f0102public static void main(String[] args) throws Exception {//1.根據(jù)視頻id獲取視頻播放地址//(1)創(chuàng)建初始化對(duì)象 LTAI5tHGkW8GcwhFypERMW59 KUNfdGLjxkyvCVYS7iL7ovSIQxIJG0DefaultAcsClient client = InitObject.initVodClient("LTAI5tHGkW8GcwhFypERMW59", "KUNfdGLjxkyvCVYS7iL7ovSIQxIJG0");//(2)創(chuàng)建獲取視頻地址request和responseGetPlayInfoRequest request = new GetPlayInfoRequest();GetPlayInfoResponse response = new GetPlayInfoResponse();//(3)向request對(duì)象里面設(shè)置視頻idrequest.setVideoId("b45893008b5871ed808f6723a78f0102");//(4)調(diào)用初始化對(duì)象里面的方法,傳遞request,獲取數(shù)據(jù)response = client.getAcsResponse(request);//獲取路徑集合List<GetPlayInfoResponse.PlayInfo> playInfoList = response.getPlayInfoList();//播放地址for (GetPlayInfoResponse.PlayInfo playInfo : playInfoList) {System.out.println("PlayInfo.PlayURL = " + playInfo.getPlayURL() + "\n");}//Base信息System.out.println("VideoBase.Title = " + response.getVideoBase().getTitle() + "\n");}}
報(bào)錯(cuò) “Forbidden.RAM-You are not authorized to operate this resource, or this API does not support RAM“
解決方案鏈接:https://blog.csdn.net/KiddoKid/article/details/122993446
加密視頻查看方式(獲取簽證、整合阿里云播放器才可播放)
package com.xxz.test;import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.vod.model.v20170321.*;
import org.apache.commons.collections4.Get;import java.util.List;/*** Vod視頻點(diǎn)播相關(guān)測(cè)試*/
public class TestVod {public static void main(String[] args) throws Exception{//測(cè)試非加密視頻notSecretVideoShow();//測(cè)試加密視頻hasSecretVideoShow();}// 測(cè)試 阿里云 存儲(chǔ)視頻 id :b45893008b5871ed808f6723a78f0102 [非加密視頻]public static void notSecretVideoShow() throws Exception {//1.根據(jù)視頻id獲取視頻播放地址//(1)創(chuàng)建初始化對(duì)象 LTAI5tHGkW8GcwhFypERMW59 KUNfdGLjxkyvCVYS7iL7ovSIQxIJG0DefaultAcsClient client = InitObject.initVodClient("LTAI5tHGkW8GcwhFypERMW59", "KUNfdGLjxkyvCVYS7iL7ovSIQxIJG0");//(2)創(chuàng)建獲取視頻地址request和responseGetPlayInfoRequest request = new GetPlayInfoRequest();GetPlayInfoResponse response = new GetPlayInfoResponse();//(3)向request對(duì)象里面設(shè)置視頻idrequest.setVideoId("b45893008b5871ed808f6723a78f0102");//(4)調(diào)用初始化對(duì)象里面的方法,傳遞request,獲取數(shù)據(jù)response = client.getAcsResponse(request);//獲取路徑集合List<GetPlayInfoResponse.PlayInfo> playInfoList = response.getPlayInfoList();//播放地址for (GetPlayInfoResponse.PlayInfo playInfo : playInfoList) {System.out.println("PlayInfo.PlayURL = " + playInfo.getPlayURL() + "\n");}//Base信息System.out.println("VideoBase.Title = " + response.getVideoBase().getTitle() + "\n");}// 測(cè)試 阿里云 存儲(chǔ)視頻 id :b45893008b5871ed808f6723a78f0102 [加密視頻]public static void hasSecretVideoShow() throws Exception {//1.根據(jù)視頻id獲取視頻播放地址//(1)創(chuàng)建初始化對(duì)象 LTAI5tHGkW8GcwhFypERMW59 KUNfdGLjxkyvCVYS7iL7ovSIQxIJG0DefaultAcsClient client = InitObject.initVodClient("LTAI5tHGkW8GcwhFypERMW59", "KUNfdGLjxkyvCVYS7iL7ovSIQxIJG0");//(2)創(chuàng)建獲取視頻地址request和responseGetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();GetVideoPlayAuthResponse response = new GetVideoPlayAuthResponse();//(3)向request對(duì)象里面設(shè)置視頻idrequest.setVideoId("b45893008b5871ed808f6723a78f0102");//(4)調(diào)用初始化對(duì)象里面的方法,傳遞request,獲取數(shù)據(jù)response = client.getAcsResponse(request);//Auth簽證信息System.out.println("PlayAuth: " + response.getPlayAuth());}}
進(jìn)入Java SDK-媒體資源管理,定位到刪除視頻目錄頁(yè)中DeleteVideo
視頻點(diǎn)播-文件上傳SDK(客戶端上傳、服務(wù)端上傳)
安裝上傳SDK(aliyun-java-vod-upload-1…4.9.jar)
下載aliyun-java-vod-upload-1…4.9.jar
解壓后定位到lib目錄中,地址欄輸入cmd進(jìn)入控制臺(tái),輸入maven安裝指令
指令:mvn install:install-file -DgroupId=com.aliyun -DartifactId=aliyun-sdk-vod-upload -Dversion=1.4.15 -Dpackaging=jar -Dfile=aliyun-java-vod-upload-1.4.15.jar
simple目錄包含實(shí)現(xiàn)上傳案例代碼,直接使用即可
上傳測(cè)試UploadVod.java
package com.xxz.test;import com.aliyun.vod.upload.impl.UploadVideoImpl;
import com.aliyun.vod.upload.req.UploadVideoRequest;
import com.aliyun.vod.upload.resp.UploadVideoResponse;/*** 上傳案例代碼*/
public class UploadVod {public static void main(String[] args) {String accessKeyId = "LTAI5tHGkW8GcwhFypERMW59";String accessKeySecret = "KUNfdGLjxkyvCVYS7iL7ovSIQxIJG0";//上傳之后文件名稱String title = "6 - What If Want to Move Faster - upload by sdk";//本地文件路徑String fileName = "E:\\1672744612359.mp4";//調(diào)用上傳視頻方法testUploadVideo(accessKeyId, accessKeySecret, title, fileName);}/*** 本地文件上傳接口** @param accessKeyId* @param accessKeySecret* @param title* @param fileName*/private static void testUploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) {//通過(guò)必要參數(shù) 獲取視頻上傳請(qǐng)求對(duì)象UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName);/* 可指定分片上傳時(shí)每個(gè)分片的大小,默認(rèn)為2M字節(jié) */request.setPartSize(2 * 1024 * 1024L);/* 可指定分片上傳時(shí)的并發(fā)線程數(shù),默認(rèn)為1,(注:該配置會(huì)占用服務(wù)器CPU資源,需根據(jù)服務(wù)器情況指定)*/request.setTaskNum(1);//獲取上傳 工具類UploadVideoImpl uploader = new UploadVideoImpl();UploadVideoResponse response = uploader.uploadVideo(request);System.out.print("RequestId=" + response.getRequestId() + "\n"); //請(qǐng)求視頻點(diǎn)播服務(wù)的請(qǐng)求IDif (response.isSuccess()) {System.out.print("VideoId=" + response.getVideoId() + "\n");} else {/* 如果設(shè)置回調(diào)URL無(wú)效,不影響視頻上傳,可以返回VideoId同時(shí)會(huì)返回錯(cuò)誤碼。其他情況上傳失敗時(shí),VideoId為空,此時(shí)需要根據(jù)返回錯(cuò)誤碼分析具體錯(cuò)誤原因 */System.out.print("VideoId=" + response.getVideoId() + "\n");System.out.print("ErrorCode=" + response.getCode() + "\n");System.out.print("ErrorMessage=" + response.getMessage() + "\n");}}}
application.yml配置文件
#服務(wù)端口
server.port=8003
#服務(wù)名
spring.application.name=service-vod#環(huán)境設(shè)置:dev、test、prod
spring.profiles.active=dev#阿里云 OSS
#不同的服務(wù)器,地址不同
aliyun.vod.file.keyid=LTAI5tHGkW8GcwhFypERMW59
aliyun.vod.file.keysecret=KUNfdGLjxkyvCVYS7iL7ovSIQxIJG0#報(bào)錯(cuò) The field file exceeds its maximum permitted size of 1048576 bytes.
spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.max-request-size=50MB
視頻點(diǎn)播啟動(dòng)類
package com.xxz.vod;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;/*** 阿里云 視頻點(diǎn)播 vod 啟動(dòng)類*/
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(basePackages = {"com.xxz"})
public class VodApplicatioin {public static void main(String[] args) {SpringApplication.run(VodApplicatioin.class, args);}}
視頻點(diǎn)播-上傳視頻:常量類ConstantVodUtils.java
package com.xxz.vod.utils;import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** 視頻點(diǎn)播 - 視頻上傳 常量工具類 InitialzingBean */
@Component
public class ConstantVodUtils implements InitializingBean {@Value("${aliyun.vod.file.keyid}")private String keyid;@Value("${aliyun.vod.file.keysecret}")private String keysecret;public static String END_POIND;public static String ACCESS_KEY_ID;/*** 當(dāng)容器加載完之后執(zhí)行* @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {END_POIND = keyid;ACCESS_KEY_ID = keysecret;}
}
視頻點(diǎn)播-上傳視頻:業(yè)務(wù)類VodServiceImpl.java - > uploadAliyunVideo(){}
package com.xxz.vod.service.impl;import com.aliyun.vod.upload.impl.UploadVideoImpl;
import com.aliyun.vod.upload.req.UploadStreamRequest;
import com.aliyun.vod.upload.req.UploadURLStreamRequest;
import com.aliyun.vod.upload.resp.UploadStreamResponse;
import com.aliyun.vod.upload.resp.UploadURLStreamResponse;
import com.xxz.vod.service.VodService;
import com.xxz.vod.utils.ConstantVodUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;/*** 視頻點(diǎn)播-上傳視頻 業(yè)務(wù)類*/
@Service
public class VodServiceImpl implements VodService {/*** //上傳視頻* @param file* @return*/@Overridepublic String uploadAliyunVideo(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.END_POIND, title, fileName, inputStream);/* 是否顯示水印(可選),指定模板組ID時(shí),根據(jù)模板組配置確定是否顯示水印*/UploadVideoImpl uploader = new UploadVideoImpl();UploadStreamResponse response = uploader.uploadStream(request);String videoId = null;if (response.isSuccess()) {videoId = response.getVideoId();} else {/* 如果設(shè)置回調(diào)URL無(wú)效,不影響視頻上傳,可以返回VideoId同時(shí)會(huì)返回錯(cuò)誤碼。其他情況上傳失敗時(shí),VideoId為空,此時(shí)需要根據(jù)返回錯(cuò)誤碼分析具體錯(cuò)誤原因 */videoId = response.getVideoId();}return videoId;}catch (Exception e){return null;}}
}
視頻點(diǎn)播-上傳視頻:控制器VodController.java
package com.xxz.vod.controller;import com.xxz.util.Result;
import com.xxz.vod.service.VodService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;@RestController
@RequestMapping("/edu/video")
@CrossOrigin //跨域
public class VodController {@Autowiredprivate VodService vodService;//上傳視頻到 阿里云@PostMapping("uploadAliyunVideo")public Result uploadAliyunVideo(MultipartFile file){//上傳視頻String videoId = vodService.uploadAliyunVideo(file);return Result.ok().data("videoId", videoId);}}
SpringBoot 項(xiàng)目在文件上傳時(shí)出現(xiàn)了 報(bào)錯(cuò)Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes. 的錯(cuò)誤,顯示文件的大小超出了允許的范圍。原因是 SpringBoot內(nèi)嵌的 tomcat 默認(rèn)的所有上傳的文件大小為 1MB,超出這個(gè)大小就會(huì)報(bào)錯(cuò),解決這個(gè)問(wèn)題需要在application.properties配置文件更改以下兩個(gè)默認(rèn)。
multipart.maxFileSize multipart.maxRequestSize 解決方案呢,要根據(jù)SpringBoot的版本來(lái)確定,以下列舉出了幾種情況,可以根據(jù)自己項(xiàng)目的SpringBoot版本來(lái)對(duì)應(yīng):把默認(rèn)的文件的大小限制修改一下即可。以下是我項(xiàng)目中的用到的文件大小限制,改成50MB即可滿足我的需求了。
SpringBoot 1.3.x 之前
multipart.maxFileSize=50Mb
multipart.maxRequestSize=50Mb
SpringBoot 1.4.x
spring.http.multipart.maxFileSize=50Mb
spring.http.multipart.maxRequestSize=50Mb
SpringBoot 2.0.x之后
#最大上傳單個(gè)文件大小: 默認(rèn)1M
spring.servlet.multipart.max-file-size=50MB
#最大值總上傳的數(shù)據(jù)大小: 默認(rèn)10M
spring.servlet.multipart.max-request-size=50MB
Swagger測(cè)試結(jié)果
http狀態(tài)碼413,并提示Request Entity Too Large的解決辦法鏈接:https://www.cnblogs.com/lcword/p/16067649.html
刪除阿里云-視頻點(diǎn)播SDK(編寫業(yè)務(wù)方法)
package com.xxz.vod.utils;import com.aliyun.oss.ClientException;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;/*** 視頻點(diǎn)播 初始化對(duì)象 [AccessKey初始化... 初始化操作視頻點(diǎn)播 目錄 客戶端]*/
public class InitVodClient {//填入AccessKey信息public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {String regionId = "cn-shanghai"; // 點(diǎn)播服務(wù)接入地域DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);DefaultAcsClient client = new DefaultAcsClient(profile);return client;}
}
package com.xxz.vod.utils;import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** 視頻點(diǎn)播 - 視頻上傳 常量工具類*/
@Component
public class ConstantVodUtils implements InitializingBean {@Value(value = "${aliyun.vod.file.keyid}")private String keyid;@Value("${aliyun.vod.file.keysecret}")private String keysecret;public static String END_POIND;public static String ACCESS_KEY_ID;/*** 當(dāng)容器加載完之后執(zhí)行* @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {END_POIND = keysecret;ACCESS_KEY_ID = keyid;}
}
阿里云視頻點(diǎn)播-刪除視頻 > 控制器方法
package com.xxz.vod.controller;import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.vod.model.v20170321.DeleteVideoRequest;
import com.xxz.base.exception.GuiguExcetion;
import com.xxz.util.Result;
import com.xxz.vod.service.VodService;
import com.xxz.vod.utils.ConstantVodUtils;
import com.xxz.vod.utils.InitVodClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;@RestController
@RequestMapping("/vod/video")
@CrossOrigin //跨域
public class VodController {@Autowiredprivate VodService vodService;//上傳視頻到 阿里云@PostMapping("uploadAliyunVideo")public Result uploadAliyunVideo(MultipartFile file){//上傳視頻String videoId = vodService.uploadAliyunVideo(file);return Result.ok().data("videoId", videoId);}@DeleteMapping("removeAliyunVideo/{videoId}")public Result removeAliyunVideo(@PathVariable String videoId){try{//初始化對(duì)象DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_ID);//創(chuàng)建刪除視頻request對(duì)象DeleteVideoRequest request = new DeleteVideoRequest();//向request設(shè)置視頻idrequest.setVideoIds(videoId);//調(diào)用初始化對(duì)象的方法實(shí)現(xiàn)刪除client.getAcsResponse(request);}catch (Exception e){e.printStackTrace();//拋出異常throw new GuiguExcetion(20001, "刪除視頻失敗");}return Result.ok();}}
總結(jié)
以上是生活随笔 為你收集整理的阿里云视频点播——企业服务 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。