視頻播放參照地址:https://www.cnblogs.com/konglxblog/p/15116534.html
一、開通視頻點播雲平台
1、選擇視頻點播服務(收費)

2、開通視頻點播(選擇按使用流量計費)
我的已經開通了,沒開通的開通一下
3、選擇按使用流量計費(選擇使用流量計費,目前少於50G不收費,具體以實際為准)
4、資費說明
地址:https://www.aliyun.com/price/product?spm=a2c4g.11186623.2.12.7fbd59b9vmXVN6#/vod/detail
5、整體流程
- 用戶獲取上傳授權。
- VoD下發 上傳地址和憑證 及 VideoId。
- 用戶上傳視頻保存視頻ID(VideoId)。
- 用戶服務端獲取播放憑證。
- VoD下發帶時效的播放憑證。
- 用戶服務端將播放憑證下發給客戶端完成視頻播放。
二、視頻點播服務的基本使用
參考地址:https://help.aliyun.com/product/29932.html?spm=a2c4g.11186623.6.540.3c356a58OEmVZJ
1、設置轉碼格式
2、分類管理
3、上傳視頻文件
4、配置域名,之前視頻播放必須配置域名,現在可以不配置,但是播放加密的視頻,必須要域名。
5、視頻上傳只有用到基礎信息中的ID值
三、視頻上傳文檔資料
地址:https://www.aliyun.com/product/vod?spm=5176.19720258.J_8058803260.342.73832c4aJtohbh
參考上邊地址里的服務端API和服務端SDK,阿里雲推薦使用服務端SDK調用API.SDK的底層是API,本文主要參考服務端ADK->JAVA SDK.
API:阿里雲提供固定的地址,只需要調用這個固定的地址,向地址傳遞參數,實現功能
SDK:調用阿里雲提供類或者接口的方法實現功能
服務端:指的是java接口
客戶端:指的是瀏覽器,安卓,ios
1、環境准備
適用於JDK 6及以上版本。
2、安裝SDK
本例中用到的版本以及jar包。(注意本文用到的jar包是VODUploadDemo-java-1.4.11jar,有些jar包未開源,在maven中央倉庫沒有未開源的jar包,所以pom文件里不能自動聯網下載,可以通過maven命令手動安裝本地maven倉庫中。)
可以參照這個地址:https://www.cnblogs.com/konglxblog/p/14881649.html
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>service</artifactId> <groupId>com.stu</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>service-vod</artifactId> <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> </project>
版本號
<properties> <java.version>1.8</java.version> <guli.version>0.0.1-SNAPSHOT</guli.version> <mybatis-plus.version>3.0.5</mybatis-plus.version> <velocity.version>2.0</velocity.version> <swagger.version>2.7.0</swagger.version> <aliyun.oss.version>2.8.3</aliyun.oss.version> <jodatime.version>2.10.1</jodatime.version> <poi.version>3.17</poi.version> <commons-fileupload.version>1.3.1</commons-fileupload.version> <commons-io.version>2.6</commons-io.version> <httpclient.version>4.5.1</httpclient.version> <jwt.version>0.7.0</jwt.version> <aliyun-java-sdk-core.version>4.3.3</aliyun-java-sdk-core.version> <aliyun-sdk-oss.version>3.1.0</aliyun-sdk-oss.version> <aliyun-java-sdk-vod.version>2.15.5</aliyun-java-sdk-vod.version> <aliyun-java-vod-upload.version>1.4.11</aliyun-java-vod-upload.version> <aliyun-sdk-vod-upload.version>1.4.11</aliyun-sdk-vod-upload.version> <fastjson.version>1.2.28</fastjson.version> <gson.version>2.8.2</gson.version> <json.version>20170516</json.version> <commons-dbutils.version>1.7</commons-dbutils.version> <canal.client.version>1.1.0</canal.client.version> <docker.image.prefix>zx</docker.image.prefix> <cloud-alibaba.version>0.2.2.RELEASE</cloud-alibaba.version> </properties>
3、前提條件
- 確認已注冊阿里雲賬號,完成實名認證,並開通視頻點播服務。
- 准備好訪問點播服務使用的Access Key。可以在阿里雲Access Key管理創建主賬號Access Key,也可以在RAM訪問控制台創建RAM用戶,並授予VOD權限后進行相應操作,請參見創建RAM用戶並授權。
4、初始化(本文以填入賬號AccessKey信息,進行初始化)
點播服務的接入區域請參見接入區域和標識,例如:接入區域在上海,請使用cn-shanghai
。(注意cn-shanghai是固定的。)
-
獲取視頻播放地址
-
獲取視頻播放憑證
- 視頻功能主要根據視頻的ID來實現功能,不根據視頻地址實現,原因上傳的視頻可以加密,不加密的視頻根據視頻地址可以播放,但是加密地址的視頻播放不了,所以根據ID實現功能,往數據庫存儲的是視頻ID。
- 獲取視頻播放地址和獲取視頻播放憑證都可以播放視頻,但是用憑證既能播放加密視頻也能播放不加密的視頻。
- 本文說的視頻ID就是下圖中的ID。
5、根據視頻ID獲取視頻地址,獲取視頻憑證,上傳視頻代碼示例
InitAcsClint初始化類(參照阿里雲JAVA SDK ->初始化->填入賬號AccessKey信息,進行初始化)
參考地址:https://help.aliyun.com/document_detail/61062.html?spm=a2c4g.11186623.6.1033.5c3f5186TnVPYE
package com.stu.vod.test; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; public class InitAcsClint { 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; } }
TestVod測試類,根據視頻ID獲取視頻地址,獲取視頻憑證,上傳視頻方法(參照阿里雲JAVA SDK->獲取視頻播放地址和獲取視頻播放憑證,上傳SDK->服務端上傳->JAAV上傳SDK)
視頻地址和視頻憑證參考地址:https://help.aliyun.com/document_detail/61064.html?spm=a2c4g.11186623.2.20.322fd418dScXpy
視頻上傳參考地址:https://help.aliyun.com/document_detail/53406.html?spm=a2c4g.11186623.6.1025.3562d418A5I6t0
package com.stu.vod.test; import com.aliyun.vod.upload.impl.UploadVideoImpl; import com.aliyun.vod.upload.req.UploadVideoRequest; import com.aliyun.vod.upload.resp.UploadVideoResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.vod.model.v20170321.GetPlayInfoRequest; import com.aliyuncs.vod.model.v20170321.GetPlayInfoResponse; import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthRequest; import com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse; import java.util.List; public class TestVod { public static void main(String[] args) throws Exception { testUploadVideo(); } /** * 本地文件上傳接口 * */ private static void testUploadVideo() { String accessKeyId ="LTAI5t9VceHAhYQWzbRYStXv"; String accessKeySecret = "VQGvWWcpYKmJRiW9GRqdWDns17gc6i"; //視頻標題(必選) String title = "3 - How Does Project Submission Work - upload by sdk"; //本地文件上傳和文件流上傳時,文件名稱為上傳文件絕對路徑,如:/User/sample/文件名稱.mp4 (必選) //文件名必須包含擴展名 String fileName = "F:/aa.mp4"; //本地文件上傳 UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName); /* 可指定分片上傳時每個分片的大小,默認為2M字節 */ request.setPartSize(2 * 1024 * 1024L); /* 可指定分片上傳時的並發線程數,默認為1,(注:該配置會占用服務器CPU資源,需根據服務器情況指定)*/ request.setTaskNum(1); UploadVideoImpl uploader = new UploadVideoImpl(); UploadVideoResponse response = uploader.uploadVideo(request); System.out.print("RequestId=" + response.getRequestId() + "\n"); //請求視頻點播服務的請求ID if (response.isSuccess()) { System.out.print("VideoId=" + response.getVideoId() + "\n"); } else { /* 如果設置回調URL無效,不影響視頻上傳,可以返回VideoId同時會返回錯誤碼。其他情況上傳失敗時,VideoId為空,此時需要根據返回錯誤碼分析具體錯誤原因 */ System.out.print("VideoId=" + response.getVideoId() + "\n"); System.out.print("ErrorCode=" + response.getCode() + "\n"); System.out.print("ErrorMessage=" + response.getMessage() + "\n"); } } public static void getPlayAuth() throws Exception { //1根據視頻id獲取視頻播放地址 //1.1創建初始化對象 DefaultAcsClient client = InitAcsClint.initVodClient("LTAI5t9VceHAhYQWzbRYStXv","VQGvWWcpYKmJRiW9GRqdWDns17gc6i"); //1.2創建獲取視頻地址response和request對象 GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest(); GetVideoPlayAuthResponse response = new GetVideoPlayAuthResponse(); //1.3向request對象里面設置視頻id request.setVideoId("0aff5247d80d4ff1bbddcfc6a5c8e6a1"); //1.4調用初始化對象里的方法,取得憑證 response = client.getAcsResponse(request); System.out.println(response.getPlayAuth()); } public static void getPlayUrl() throws Exception { //1根據視頻id獲取視頻播放地址 //1.1創建初始化對象 DefaultAcsClient client = InitAcsClint.initVodClient("LTAI5t9VceHAhYQWzbRYStXv","VQGvWWcpYKmJRiW9GRqdWDns17gc6i"); //1.2創建獲取視頻地址response和request對象 GetPlayInfoRequest request = new GetPlayInfoRequest(); GetPlayInfoResponse response = new GetPlayInfoResponse(); //1.3向request對象里面設置視頻id request.setVideoId("0aff5247d80d4ff1bbddcfc6a5c8e6a1"); //1.4調用初始化對象里的方法,傳遞request,獲取數據 response = client.getAcsResponse(request); List<GetPlayInfoResponse.PlayInfo> playInfoList = response.getPlayInfoList(); //1.5播放地址 for (GetPlayInfoResponse.PlayInfo playInfo : playInfoList) { System.out.print("PlayInfo.PlayURL = " + playInfo.getPlayURL() + "\n"); } //Base信息 System.out.print("VideoBase.Title = " + response.getVideoBase().getTitle() + "\n"); } }
6、JAVA上傳SDK示例代碼(比5里的更詳細,可以理解為5的擴充)
首先在地址:https://help.aliyun.com/document_detail/51992.htm?spm=a2c4g.11186623.2.6.1fea5186ltnfVA#title-mbq-hhb-gy2下載SDK。
然后解壓,找到上傳demo類,例子中有多種上傳方式,上邊通過【本地文件上傳接口】方式實現上傳。
四、視頻上傳,刪除視頻功能實現(通過【流式上傳接口】實現視頻上傳)
1、application.properties屬性文件以及配置nginx反向代理(jar包以及依賴同上,如果沒用到nginx可以不用配置)
#服務端口 server.port=8003 #服務名 spring.application.name=service-vod # 環境設置:dev、test、prod spring.profiles.active=dev #阿里雲 vod #不同的服務器,地址不同 aliyun.vod.file.keyid=LTAI5t9VceHAhYQWzbRYStXv aliyun.vod.file.keysecret=VQGvWWcpYKmJRiW9GRqdWDns17gc6i # 最大上傳單個文件大小:默認1M spring.servlet.multipart.max-file-size=1024MB # 最大置總上傳的數據大小 :默認10M spring.servlet.multipart.max-request-size=1024MB
ConstantVodUtils屬性文件值獲取
package com.stu.vod.utils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; //項目啟動,spring接口,spring加載之后,執行接口一個方法 @Component public class ConstantVodUtils implements InitializingBean { //通過@value注解讀取屬性文件里的值,賦值給keyId @Value("${aliyun.vod.file.keyid}") private String keyId; @Value("${aliyun.vod.file.keysecret}") private String keysecret; //定義一些靜態常量 public static String KEY_ID; public static String KEY_SECRET; //上邊賦值完成后,會執行afterPropertiesSet方法,這是spring機制 @Override public void afterPropertiesSet() throws Exception { KEY_ID = keyId; KEY_SECRET = keysecret; } }
nginx反向代理(nginx.conf文件配置)
將接口地址加入nginx配置
location ~ /
eduvod
/ { proxy_pass http://localhost:8003; }
client_max_body_size 1024m;
重啟nginx
nginx -s reload
nginx.exe路徑下cmd命令輸入【nginx.exe】啟動nginx,輸入nginx.exe按回車,光標閃爍表示啟動成功
輸入【nginx -s reload】重啟nginx(有時候在Windows環境可能不好用)或者通過 nginx.exe -s stop關閉然后通過nginx.exe啟動
完整配置
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; client_max_body_size 1024m; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 81; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} server { listen 9001; server_name localhost; location ~ /eduservice/ { proxy_pass http://localhost:8001; } location ~ /eduOss/ { proxy_pass http://localhost:8002; } location ~ /eduvod/ { proxy_pass http://localhost:8003; } } }
2、controller文件
package com.stu.vod.controller; import com.stu.commonutils.ResultData; import com.stu.vod.service.VodService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/eduvod/video") @CrossOrigin public class VodController { @Autowired private VodService vodService; //上傳視頻到阿里雲 @PostMapping("uploadAlyVideo") public ResultData uploadAlyVideo(MultipartFile file){ //返回視頻id String videoId = vodService.uploadAlyVideo(file); return ResultData.success().data("videoId",videoId); } //根據id刪除阿里雲視頻 @DeleteMapping("removeVideo/{id}") public ResultData removeVideo(@PathVariable String id){ //返回視頻id String videoId = vodService.removeVideo(id); return ResultData.success(); } }
3、service接口
package com.stu.vod.service; import org.springframework.web.multipart.MultipartFile; public interface VodService { String uploadAlyVideo(MultipartFile file); String removeVideo(String id); }
4、service接口實現類
package com.stu.vod.service.impl; import com.aliyun.vod.upload.impl.UploadVideoImpl; import com.aliyun.vod.upload.req.UploadStreamRequest; import com.aliyun.vod.upload.resp.UploadStreamResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.vod.model.v20170321.DeleteVideoRequest; import com.stu.servicebase.exceptionHandler.GuliException; import com.stu.vod.service.VodService; import com.stu.vod.utils.ConstantVodUtils; import com.stu.vod.utils.InitVodClient; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; @Service public class VodServiceImpl implements VodService {
//通過【流式上傳接口】實現 @Override public String uploadAlyVideo(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.KEY_ID,ConstantVodUtils.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; } } @Override public String removeVideo(String id) { try { //1初始化對象 DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.KEY_ID, ConstantVodUtils.KEY_SECRET); //2創建刪除視頻request對象 DeleteVideoRequest request = new DeleteVideoRequest(); //3向request設置視頻id request.setVideoIds(id); //4調用初始化對象的方法刪除視頻 client.getAcsResponse(request); return id; } catch (Exception e) { e.printStackTrace(); throw new GuliException(20001,"刪除視頻失敗"); } } }