視頻點播(ApsaraVideo for VoD)是集音視頻采集、編輯、上傳、自動化轉(zhuǎn)碼處理、媒體資源管理、分發(fā)加速于一體的一站式音視頻點播解決方案。
1、應(yīng)用場景
- 音視頻網(wǎng)站:無論是初創(chuàng)視頻服務(wù)企業(yè),還是已擁有海量視頻資源,可定制化的點播服務(wù)幫助客戶快速搭建擁有極致觀看體驗、安全可靠的視頻點播應(yīng)用。
- 短視頻:集音視頻拍攝、特效編輯、本地轉(zhuǎn)碼、高速上傳、自動化云端轉(zhuǎn)碼、媒體資源管理、分發(fā)加速、播放于一體的完整短視頻解決方案。目前已幫助1000+App快速實現(xiàn)手機短視頻功能。
- 直播轉(zhuǎn)點播:將直播流同步錄制為點播視頻,用于回看。并支持媒資管理、媒體處理(轉(zhuǎn)碼及內(nèi)容審核/智能首圖等AI處理)、內(nèi)容制作(云剪輯)、CDN分發(fā)加速等一系列操作。
- 在線教育:為在線教育客戶提供簡單易用、安全可靠的視頻點播服務(wù)。可通過控制臺/API等多種方式上傳教學(xué)視頻,強大的轉(zhuǎn)碼能力保證視頻可以快速發(fā)布,覆蓋全網(wǎng)的加速節(jié)點保證學(xué)生觀看的流暢度。防盜鏈、視頻加密等版權(quán)保護(hù)方案保護(hù)教學(xué)內(nèi)容不被竊取。
- 視頻生產(chǎn)制作:提供在線可視化剪輯平臺及豐富的OpenAPI,幫助客戶高效處理、制作視頻內(nèi)容。除基礎(chǔ)的剪切拼接、混音、遮標(biāo)、特效、合成等一系列功能外,依托云剪輯及點播一體化服務(wù)還可實現(xiàn)標(biāo)準(zhǔn)化、智能化剪輯生產(chǎn),大大降低視頻制作的檻,縮短制作時間,提升內(nèi)容生產(chǎn)效率。
- 內(nèi)容審核:應(yīng)用于短視頻平臺、傳媒行業(yè)審核等場景,幫助客戶從從語音、文字、視覺等多維度精準(zhǔn)識別視頻、封面、標(biāo)題或評論的違禁內(nèi)容進(jìn)行AI智能審核與人工審核。2、功能介紹
2、功能介紹
二、開通視頻點播云平臺
1. 產(chǎn)品->視頻服務(wù)->視頻服務(wù)->視頻點播
2.開通視頻點播
3.選擇按流量計費,比較省錢
4.資費說明:
https://www.aliyun.com/price/product?spm=a2c4g.11186623.2.12.7fbd59b9vmXVN6#/vod/detail
5.整體流程
- 用戶獲取上傳授權(quán)。
- VoD下發(fā) 上傳地址和憑證 及 VideoId。
- 用戶上傳視頻保存視頻ID(VideoId)。
- 用戶服務(wù)端獲取播放憑證。
- VoD下發(fā)帶時效的播放憑證。
- 用戶服務(wù)端將播放憑證下發(fā)給客戶端完成視頻播放。
三、視頻點播服務(wù)的基本使用
1、設(shè)置轉(zhuǎn)碼格式
選擇全局設(shè)置 > 轉(zhuǎn)碼設(shè)置,單擊添加轉(zhuǎn)碼模板組。
在視頻轉(zhuǎn)碼模板組頁面,根據(jù)業(yè)務(wù)需求選擇封裝格式和清晰度。
或直接將已有的模板設(shè)置為默認(rèn)即可
2、分類管理
選擇全局設(shè)置 > 分類管理
3、上傳視頻文件
選擇媒資庫 > 音視頻,單擊上傳音視頻
4、配置域名
音視頻上傳完成后,必須配一個已備案的域名,并完成CNAME綁定
5、此時視頻可以在阿里云控制臺播放
6、獲取web播放器代碼
四、服務(wù)端SDk集成
1.sdk的方式將api進(jìn)行了進(jìn)一步的封裝,不用自己創(chuàng)建工具類。
我們可以基于服務(wù)端SDK編寫代碼來調(diào)用點播API,實現(xiàn)對點播產(chǎn)品和服務(wù)的快速操作。
2.使用SDK
首先添加Maven倉庫,然后再加入依賴項。
1.1,添加maven倉庫 <repositories> <repository> <id>sonatype-nexus-staging</id> <name>Sonatype Nexus Staging</name> <url>
https://oss.sonatype.org/service/local/staging/deploy/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
1.2,添加Jar包依賴 <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-JAVA-sdk-core</artifactId> <version>4.5.1</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.62</version> </dependency>
3.初始化
根據(jù)文檔示例創(chuàng)建 AliyunVODSDKUtils.java
public class OSSTest {
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云主賬號AccessKey擁有所有API的訪問權(quán)限,風(fēng)險很高。強烈建議您創(chuàng)建并使用RAM賬號進(jìn)行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創(chuàng)建RAM賬號。
String accessKeyId = "LTAI5tSjEbLtaqn8HMe4zF4G";
String accessKeySecret = "mGgEO1ueh5WdVK4oK4kJOSPQgHPR5m";
String bucketName = "fire-file";
@Test
public void testCreateBucket() {
// 創(chuàng)建OSSClient實例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 創(chuàng)建存儲空間。
ossClient.createBucket(bucketName);// 關(guān)閉OSSClient。
System.out.println(ossClient.listBuckets());
// ossClient.shutdown();
}
@Test
public void testExist() {
// 創(chuàng)建OSSClient實例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
boolean exists = ossClient.doesBucketExist(bucketName);
System.out.println(exists);
// 關(guān)閉OSSClient。
ossClient.shutdown();
}
}
4.springboot集成
FileUploadController
package com.atguigu.controller;
import com.atguigu.commonutils.R;
import com.atguigu.service.FileService;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/eduoss")
@CrossOrigin
public class FileUploadController {
@Autowired
private FileService fileService;
/**
* 13
* 文件上傳
* 14
* <p>
* 15
*
* @param file 16
*/
@ApiOperation(value = "文件上傳")
@PostMapping("upload")
public R upload(
@ApiParam(name = "file", value = "文件", required = true) @RequestParam("file") MultipartFile file) {
String uploadUrl = fileService.upload(file);
//返回r對象
return R.ok().message("文件上傳成功").data("url", uploadUrl);
}
}
service
package com.atguigu.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.atguigu.service.FileService;
import com.atguigu.utils.ConstantPropertiesUtil;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.UUID;
@Service
public class FileServiceImpl implements FileService {
@Override
public String upload(MultipartFile file) {
// 工具類獲取值
String endpoint = ConstantPropertiesUtil.END_POINT;
String accessKeyId = ConstantPropertiesUtil.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtil.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
try {
// 創(chuàng)建OSS實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//獲取上傳文件輸入流
InputStream inputStream = file.getInputStream();
//獲取文件名稱
String fileName = file.getOriginalFilename();
//1 在文件名稱里面添加隨機唯一的值
String uuid = UUID.randomUUID().toString().replaceAll("-","");
// yuy76t5rew01.jpg
fileName = uuid+fileName;
//2 把文件按照日期進(jìn)行分類
//獲取當(dāng)前日期
// 2019/11/12
String datePath = new DateTime().toString("yyyy/MM/dd");
//拼接
// 2019/11/12/ewtqr313401.jpg
fileName = datePath+"/"+fileName;
//調(diào)用oss方法實現(xiàn)上傳
//第一個參數(shù) Bucket名稱
//第二個參數(shù) 上傳到oss文件路徑和文件名稱 aa/bb/1.jpg
//第三個參數(shù) 上傳文件輸入流
ossClient.putObject(bucketName,fileName , inputStream);
// 關(guān)閉OSSClient。
ossClient.shutdown();
//把上傳之后文件路徑返回
//需要把上傳到阿里云oss路徑手動拼接出來
// https://edu-guli-1010.oss-cn-beijing.aliyuncs.com/01.jpg
String url = "http://"+bucketName+"."+endpoint+"/"+fileName;
return url;
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
utils
package com.atguigu.utils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ConstantPropertiesUtil implements InitializingBean {
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
public static String END_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
System.out.println(ACCESS_KEY_ID+"==========================");
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
注意END_POINT、ACCESS_KEY_ID、ACCESS_KEY_SECRET、BUCKET_NAME用自己的,具體申請方式在控制臺》點擊頭像》AccessKey 管理