视频点播VoD 服务搭建

前言

今天学习了阿里云的视频点播VoD,记录一下搭建与阿里云VoD的对接服务

本篇同样是阿里云的云服务,有些地方类似的操作(比如开通服务流程、创建子账号、权限分组等)就不重复详细记录了直接一笔带过。类似的操作OSS服务搭建中有详细步骤,可以作为参考

什么是视频点播VoD

摘自阿里云视频点播VoD文档:

https://www.aliyun.com/product/vod

视频点播(ApsaraVideo VoD,简称VoD)是集视频采集、编辑、上传、媒体资源管理、自动化转码处理(窄带高清TM)、视频审核分析、分发加速于一体的一站式音视频点播解决方案。

整体架构

计费规则

https://www.aliyun.com/price/product?spm=5176.8413026.1397775..1a0b11cfE7n8nG&aly_as=sXiM5Y4IA#/vod/detail

学习的话充个几块钱即可

开通VoD

开通服务

按流量计费

VoD管理后台

上传一个自己的视频

上传视频

转码

  • 如果选择不转码将以原视频格式进行上传

转码

  • 如果选择转码,将会生成一个加密的文件格式

m3u8

  • 在转码模板组中可以设置默认与自定义转码方式,我刚刚选择的转码组中配置有两个转码模板(MP4、m3u8)所以上传的文件会变成3个格式!

    转码模板组

  • 在加密的格式中默认阿里云私有加密,高级参数可设置HLS加密

    HLS加密

域名绑定

如果要加密视频的话一定要绑定域名并且域名备案。正在备案…TODO

账号设置

还是用我搭建OSS时创建的Access子账号,并在其所在用户组添加视频点播权限

设置用户组权限

对接VoD SDK

参考官方Java SDK文档

https://help.aliyun.com/document_detail/57756.html?spm=a2c4g.11186623.6.906.e692192bBnfacC

Java对接代码

添加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>

添加pom依赖

<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.2</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>
  • 注意:上传视频的代码阿里还没有开源,所以我们需要下载代码并安装到我们本地maven仓库

  • 视频上传SDK下载

    提示

添加依赖的两种方式

  1. 直接添加到项目resourses/lib下

  2. 添加到Maven仓库

    mvn install:install-file -DgroupId=组名 -DartifactId=依赖 -Dversion=版本 - Dpackaging=jar -Dfile=文件名

    安装成功

添加未开源的本地依赖

<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-vod-upload</artifactId>
<version>1.4.12</version>
</dependency>

配置application.yml

server:
port: 8092
spring:
servlet:
multipart:
max-file-size: 100MB # 设置文件上传最大大小 -默认值1MB -默认单位B -可写B、KB、MB、GB、TB
vod:
aliyun:
accessKeyId: LTAI4FgBBEeeRTMkVVFkKFEA # 我这里与OSS账号一样
accessKeySecret: -----------------------

VodConfigProperties

package cn.hetonghao.oss.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
* oss配置属性
*
* @author HeTongHao
* @since 2020/4/12 14:35
*/
@Data
@ConfigurationProperties(prefix = "vod.aliyun")
public class VodConfigProperties {
/**
* 地域节点
*/
private String accessKeyId;
private String accessKeySecret;
}

IVodService

package cn.hetonghao.oss.service;

import org.springframework.web.multipart.MultipartFile;

/**
* oss 文件管理
*
* @author HeTongHao
* @since 2020/4/12 14:32
*/
public interface IVodService {
/**
* 上传视频
*
* @param multipartFile
* @return
*/
String upload(MultipartFile multipartFile);

/**
* 删除视频
*
* @param videoId
* @return
*/
void removeVideo(String videoId);
}

ServiceImpl

package cn.hetonghao.oss.service.impl;

import cn.hetonghao.oss.config.VodConfigProperties;
import cn.hetonghao.oss.service.IVodService;
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.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.DeleteVideoRequest;
import com.aliyuncs.vod.model.v20170321.DeleteVideoResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
* vod 视频点播实现
*
* @author HeTongHao
* @since 2020/4/12 14:34
*/
@Service
@EnableConfigurationProperties(VodConfigProperties.class)
public class VodServiceImpl implements IVodService {
@Autowired
private VodConfigProperties vodConfigProperties;

@Override
public String upload(MultipartFile multipartFile) {
InputStream inputStream;
try {
inputStream = multipartFile.getInputStream();
} catch (IOException e) {
e.printStackTrace();
return null;
}
String fileName = multipartFile.getOriginalFilename();
if (fileName == null) {
return null;
}
String title = fileName.substring(0, fileName.lastIndexOf("."));
UploadStreamRequest request = new UploadStreamRequest(vodConfigProperties.getAccessKeyId()
, vodConfigProperties.getAccessKeySecret(), title, fileName, inputStream);
UploadVideoImpl uploader = new UploadVideoImpl();
UploadStreamResponse response = uploader.uploadStream(request);
return response.getVideoId();
}

@Override
public void removeVideo(String videoId) {
try {
DefaultAcsClient defaultAcsClient =
initVodClient(vodConfigProperties.getAccessKeyId(), vodConfigProperties.getAccessKeySecret());
DeleteVideoRequest request = new DeleteVideoRequest();
request.setVideoIds(videoId);
DeleteVideoResponse response = defaultAcsClient.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
}
}

private static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) {
//点播服务接入区域 国内使用 cn-shanghai
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
return new DefaultAcsClient(profile);
}
}

VideoController

/**
* vod 视频点播Controller
*
* @author HeTongHao
* @since 2020/4/12 15:15
*/
@Api("vod视频点播")
@RestController
@RequestMapping("video")
public class VideoController {
@Autowired
private IVodService vodService;

@ApiOperation("视频上传")
@PostMapping("upload")
public SingleResponse<String> upload(@RequestParam MultipartFile file) {
return new SingleResponse<String>()
.setData(vodService.upload(file));
}

@ApiOperation("删除视频")
@DeleteMapping("{videoId}")
public SingleResponse<String> upload(@PathVariable("videoId") String videoId) {
vodService.removeVideo(videoId);
return new SingleResponse<>();
}
}

测试

测试上传视频

  • 打开swagger测试

成功取到视频ID

  • 进入VoD后台查看

    上传成功

测试删除视频

  • 打开swagger测试

    删除

  • 进入VoD后台查看,ID:01e919f81c7448bbaf332e1adb8e3c7c 已经不存在了

    删除成功

集成视频播放器

Aliplayer提供了在线生成视频播放器的页面,可根据自己的需求生成相应的视频播放器代码:Aliplayer在线生成

Aliplayer在线生成页面

文章作者: 何同昊
文章链接: http://hetonghao.cn/2020/04/VoD服务搭建/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 何同昊 Blog
支付宝超级火箭🚀
微信超级火箭🚀