视频模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n6sJhool-1618451349047)(C:\Users\jiaxuan\AppData\Roaming\Typora\typora-user-images\image-20210415093427265.png)]
1、启动类
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @ComponentScan(basePackages = {"com.xuan"}) @EnableDiscoveryClient public class VodApplication { public static void main(String[] args) { SpringApplication.run(VodApplication.class, args); } }
解读:
进入到@SpringBootApplication
的源码,可以看到里面组合了三个我们感兴趣的注解:@ComponentScan
,@EnableAutoConfiguration
,@SpringBootConfiguration
spring里有四大注解:@Service
,@Repository
,@Component
,@Controller
用来定义一个bean.
@ComponentScan
注解就是用来自动扫描被这些注解标识的类,最终生成ioc容器里的bean.可以通过设置@ComponentScan
basePackages,includeFilters,excludeFilters属性来动态确定自动扫描范围,类型已经不扫描的类型.默认情况下:它扫描所有类型,并且扫描范围是@ComponentScan
注解所在配置类包及子包的类
@SpringBootConfiguration
这个注解的作用与@Configuration
作用相同,都是用来声明当前类是一个配置类.可以通过@Bean
注解生成IOC容器管理的bean.在QuickStartApplication
中定义bean
`@EnableAutoConfiguration
是springboot实现自动化配置的核心注解,通过这个注解把spring应用所需的bean注入容器中.@EnableAutoConfiguration
源码通过@Import
注入了一个ImportSelector
的实现类
AutoConfigurationImportSelector
,这个ImportSelector
最终实现根据我们的配置,动态加载所需的bean.
springboot是通过注解@EnableAutoConfiguration
的方式,去查找,过滤,加载所需的configuration
,@ComponentScan
扫描我们自定义的bean,@SpringBootConfiguration
使得被@SpringBootApplication
注解的类声明为注解类.因此@SpringBootApplication
的作用等价于同时组合使用@EnableAutoConfiguration
,@ComponentScan
,@SpringBootConfiguration
.
2、InitVodClient初始化视频服务类
public class InitVodCilent { 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; } }
3、ConstVodUtils
@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 ACCESS_KEY_SECRET; public static String ACCESS_KEY_ID; @Override public void afterPropertiesSet() throws Exception { ACCESS_KEY_ID = keyid; ACCESS_KEY_SECRET = keysecret; } }
4、VodServiceImpl
@Service public class VodServiceImpl implements VodService { @Override public String uploadVideoAly(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.ACCESS_KEY_ID,ConstantVodUtils.ACCESS_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 void removeMoreAlyVideo(List videoIdList) { try { //初始化对象 DefaultAcsClient client = InitVodCilent.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET); //创建删除视频request对象 DeleteVideoRequest request = new DeleteVideoRequest(); //videoIdList值转换成 1,2,3 String videoIds = StringUtils.join(videoIdList.toArray(), ","); //向request设置视频id request.setVideoIds(videoIds); //调用初始化对象的方法实现删除 client.getAcsResponse(request); }catch(Exception e) { e.printStackTrace(); throw new WXException(20001,"删除视频失败"); } } public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("11"); list.add("22"); list.add("33"); // 11,22,33 String join = StringUtils.join(list.toArray(), ","); System.out.println(join); } }
5、VodController
@RestController @RequestMapping("/eduvod/video") //@CrossOrigin public class VodController { @Autowired private VodService vodService; //上传视频到阿里云 @PostMapping("uploadAlyiVideo") public R uploadAlyiVideo(MultipartFile file) { //返回上传视频id String videoId = vodService.uploadVideoAly(file); return R.ok().data("videoId",videoId); } //根据视频id删除阿里云视频 @DeleteMapping("removeAlyVideo/{id}") public R removeAlyVideo(@PathVariable String id) { try { //初始化对象 DefaultAcsClient client = InitVodCilent.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET); //创建删除视频request对象 DeleteVideoRequest request = new DeleteVideoRequest(); //向request设置视频id request.setVideoIds(id); //调用初始化对象的方法实现删除 client.getAcsResponse(request); return R.ok(); }catch(Exception e) { e.printStackTrace(); throw new WXException(20001,"删除视频失败"); } } //删除多个阿里云视频的方法 //参数多个视频id List videoIdList @DeleteMapping("delete-batch") public R deleteBatch(@RequestParam("videoIdList") List<String> videoIdList) { vodService.removeMoreAlyVideo(videoIdList); return R.ok(); } //根据视频id获取视频凭证 @GetMapping("getPlayAuth/{id}") public R getPlayAuth(@PathVariable String id) { try { //创建初始化对象 DefaultAcsClient client = InitVodCilent.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET); //创建获取凭证request和response对象 GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest(); //向request设置视频id request.setVideoId(id); //调用方法得到凭证 GetVideoPlayAuthResponse response = client.getAcsResponse(request); String playAuth = response.getPlayAuth(); return R.ok().data("playAuth",playAuth); }catch(Exception e) { throw new WXException(20001,"获取凭证失败"); } } }