springboot阿里雲視頻點播服務實現上傳視頻和刪除功能


視頻播放參照地址:https://www.cnblogs.com/konglxblog/p/15116534.html

一、開通視頻點播雲平台

1、選擇視頻點播服務(收費)

阿里雲地址:https://www.aliyun.com/activity/618/2021?spm=5176.22772544.J_8058803260.d83.10632ea9TWsUsu&scm=20140722.3979.2.4317

產品->視頻服務->視頻點播

2、開通視頻點播(選擇按使用流量計費)

我的已經開通了,沒開通的開通一下

3、選擇按使用流量計費(選擇使用流量計費,目前少於50G不收費,具體以實際為准)

 

4、資費說明

地址:https://www.aliyun.com/price/product?spm=a2c4g.11186623.2.12.7fbd59b9vmXVN6#/vod/detail

5、整體流程

  1. 用戶獲取上傳授權。
  2. VoD下發 上傳地址和憑證 及 VideoId。
  3. 用戶上傳視頻保存視頻ID(VideoId)。
  4. 用戶服務端獲取播放憑證。
  5. VoD下發帶時效的播放憑證。
  6. 用戶服務端將播放憑證下發給客戶端完成視頻播放。

二、視頻點播服務的基本使用

參考地址:https://help.aliyun.com/product/29932.html?spm=a2c4g.11186623.6.540.3c356a58OEmVZJ

1、設置轉碼格式

選擇全局設置 > 轉碼設置,單擊添加轉碼模板組。
在視頻轉碼模板組頁面,根據業務需求選擇封裝格式和清晰度。
或直接將已有的模板設置為默認即可

 

2、分類管理

選擇全局設置 > 分類管理

3、上傳視頻文件

選擇媒資庫 > 音視頻,單擊上傳音視頻

4、配置域名,之前視頻播放必須配置域名,現在可以不配置,但是播放加密的視頻,必須要域名。

音視頻上傳完成后,必須配一個已備案的域名,並完成CNAME綁定

 

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、前提條件

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類,例子中有多種上傳方式,上邊通過【本地文件上傳接口】方式實現上傳。

四、視頻上傳,刪除視頻功能實現(通過【流式上傳接口】實現視頻上傳)

視頻刪除參考地址:https://help.aliyun.com/document_detail/61065.html?spm=a2c4g.11186623.6.831.654b3815cIxvma#title-pqt-085-dyf

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; }
配置nginx上傳文件大小,否則上傳時會有 413 (Request Entity Too Large) 異常
打開nginx主配置文件nginx.conf,找到http{},添加
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,"刪除視頻失敗"); } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM