From 37491bae34e68b8fbb2277dbd8bdd4d321e0aa1a Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Tue, 27 Apr 2021 18:32:04 +0800 Subject: [PATCH] fix aliyunvideo --- mallinkVideo/pom.xml | 2 +- .../video/aliyun/AliyunVideoExcutor.java | 82 ++++++++++++++++++- .../aliyun/config/AliyunVideoConfig.java | 1 + .../aliyun/sdk/server/AliyunVedioServer.java | 50 +++++++++++ .../upload/AliyunVedioUpload.java} | 81 ++++++++++-------- .../video/entity/VideUploadResult.java | 2 + 6 files changed, 178 insertions(+), 40 deletions(-) create mode 100644 mallinkVideo/src/main/java/com/iformall/video/aliyun/sdk/server/AliyunVedioServer.java rename mallinkVideo/src/main/java/com/iformall/video/aliyun/{AliyunVedioUploadHelper.java => sdk/upload/AliyunVedioUpload.java} (92%) diff --git a/mallinkVideo/pom.xml b/mallinkVideo/pom.xml index 2bf9feeee..429dea615 100644 --- a/mallinkVideo/pom.xml +++ b/mallinkVideo/pom.xml @@ -37,7 +37,7 @@ com.alibaba fastjson - 1.2.28 + 1.2.62 org.json diff --git a/mallinkVideo/src/main/java/com/iformall/video/aliyun/AliyunVideoExcutor.java b/mallinkVideo/src/main/java/com/iformall/video/aliyun/AliyunVideoExcutor.java index 8fbf75e55..3e0f31635 100644 --- a/mallinkVideo/src/main/java/com/iformall/video/aliyun/AliyunVideoExcutor.java +++ b/mallinkVideo/src/main/java/com/iformall/video/aliyun/AliyunVideoExcutor.java @@ -1,34 +1,108 @@ package com.iformall.video.aliyun; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.aliyun.vod.upload.resp.UploadStreamResponse; +import com.aliyun.vod.upload.resp.UploadURLStreamResponse; +import com.aliyun.vod.upload.resp.UploadVideoResponse; +import com.aliyuncs.exceptions.ClientException; import com.iformall.video.VideoExcutor; import com.iformall.video.aliyun.config.AliyunVideoConfig; +import com.iformall.video.aliyun.sdk.server.AliyunVedioServer; +import com.iformall.video.aliyun.sdk.upload.AliyunVedioUpload; import com.iformall.video.entity.VideUploadResult; +import lombok.extern.slf4j.Slf4j; + @Component +@Slf4j public class AliyunVideoExcutor implements VideoExcutor { @Autowired AliyunVideoConfig config; + private String getUrlByVeidoId(String videoId) { + try { + return AliyunVedioServer.getVedioUrl(config, videoId); + } catch (ClientException e) { + log.error("aliyun getUrlByVeidoId error",e); + } + return null; + } + @Override public VideUploadResult uploadLocalVideo(String title,String localFile) { - //AliyunVedioUploadHelper. - return null; + VideUploadResult result = new VideUploadResult(); + try { + UploadVideoResponse response =AliyunVedioUpload.uploadVideo(config.getAccessKeyId(), config.getAccessKeySecret(), title, localFile); + if (response.isSuccess()) { + result.setVideoId(response.getVideoId()); + result.setVideoUrl(getUrlByVeidoId(response.getVideoId())); + result.setSuccess(true); + }else { + //如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 + result.setSuccess(false); + result.setMsg("ErrorCode["+response.getCode()+"]"+response.getMessage()); + } + } catch (Exception e) { + log.error("aliyun uploadLocalVideo error",e); + result.setSuccess(false); + result.setMsg(e.getLocalizedMessage()); + } + return result; } @Override public VideUploadResult uploadLocalVideo(String title,File localFile) { - return null; + VideUploadResult result = new VideUploadResult(); + UploadStreamResponse response; + FileInputStream inputStream = null; + try { + inputStream = new FileInputStream(localFile); + response = AliyunVedioUpload.uploadStream(config.getAccessKeyId(), config.getAccessKeySecret(), title, localFile.getName(), inputStream); + if (response.isSuccess()) { + result.setVideoId(response.getVideoId()); + result.setVideoUrl(getUrlByVeidoId(response.getVideoId())); + result.setSuccess(true); + } else { //如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 + result.setSuccess(false); + result.setMsg("ErrorCode["+response.getCode()+"]"+response.getMessage()); + } + } catch (FileNotFoundException e) { + log.error("aliyun uploadLocalVideo error",e); + result.setSuccess(false); + result.setMsg(e.getLocalizedMessage()); + }finally { + if (null != inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + } + } + } + return result; } @Override public VideUploadResult uploadNetVideo(String title,String url,String ext) { - return null; + VideUploadResult result = new VideUploadResult(); + UploadURLStreamResponse response = AliyunVedioUpload.uploadURLStream(config.getAccessKeyId(), config.getAccessKeySecret(), title, url, ext); + if (response.isSuccess()) { + result.setVideoId(response.getVideoId()); + result.setVideoUrl(getUrlByVeidoId(response.getVideoId())); + result.setSuccess(true); + } else { + /* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */ + result.setSuccess(false); + result.setMsg("ErrorCode["+response.getCode()+"]"+response.getMessage()); + } + return result; } } diff --git a/mallinkVideo/src/main/java/com/iformall/video/aliyun/config/AliyunVideoConfig.java b/mallinkVideo/src/main/java/com/iformall/video/aliyun/config/AliyunVideoConfig.java index 1b8e832d9..39b625e0b 100644 --- a/mallinkVideo/src/main/java/com/iformall/video/aliyun/config/AliyunVideoConfig.java +++ b/mallinkVideo/src/main/java/com/iformall/video/aliyun/config/AliyunVideoConfig.java @@ -11,4 +11,5 @@ import lombok.Data; public class AliyunVideoConfig { private String accessKeyId; private String accessKeySecret; + private String regionId;//cn-shanghai 点播服务接入区域 } diff --git a/mallinkVideo/src/main/java/com/iformall/video/aliyun/sdk/server/AliyunVedioServer.java b/mallinkVideo/src/main/java/com/iformall/video/aliyun/sdk/server/AliyunVedioServer.java new file mode 100644 index 000000000..e79751db9 --- /dev/null +++ b/mallinkVideo/src/main/java/com/iformall/video/aliyun/sdk/server/AliyunVedioServer.java @@ -0,0 +1,50 @@ +package com.iformall.video.aliyun.sdk.server; + +import java.util.List; + +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.vod.model.v20170321.GetPlayInfoRequest; +import com.aliyuncs.vod.model.v20170321.GetPlayInfoResponse; +import com.iformall.video.aliyun.config.AliyunVideoConfig; + +import lombok.extern.slf4j.Slf4j; + +import com.aliyuncs.exceptions.ClientException; + +@Slf4j +public class AliyunVedioServer { + + + private static DefaultAcsClient initVodClient(AliyunVideoConfig config) throws ClientException { + DefaultProfile profile = DefaultProfile.getProfile(config.getRegionId(), config.getAccessKeyId(), config.getAccessKeySecret()); + DefaultAcsClient client = new DefaultAcsClient(profile); + return client; + } + + private static DefaultAcsClient initVodClient(AliyunVideoConfig config, String securityToken) throws ClientException { + DefaultProfile profile = DefaultProfile.getProfile(config.getRegionId(), config.getAccessKeyId(), config.getAccessKeySecret(), securityToken); + DefaultAcsClient client = new DefaultAcsClient(profile); + return client; + } + + //获取视频播放地址 + //https://help.aliyun.com/document_detail/61064.html?spm=a2c4g.11186623.6.1043.7c2d3838K6wQPZ + public static String getVedioUrl(AliyunVideoConfig config,String videoId) throws ClientException { + DefaultAcsClient client = initVodClient(config); + GetPlayInfoResponse response = new GetPlayInfoResponse(); + try { + GetPlayInfoRequest request = new GetPlayInfoRequest(); + request.setVideoId(videoId); + response = client.getAcsResponse(request); + List playInfoList = response.getPlayInfoList(); + //播放地址 + for (GetPlayInfoResponse.PlayInfo playInfo : playInfoList) { + return playInfo.getPlayURL(); + } + } catch (Exception e) { + log.error("getVedioUrl error.",e); + } + return null; + } +} diff --git a/mallinkVideo/src/main/java/com/iformall/video/aliyun/AliyunVedioUploadHelper.java b/mallinkVideo/src/main/java/com/iformall/video/aliyun/sdk/upload/AliyunVedioUpload.java similarity index 92% rename from mallinkVideo/src/main/java/com/iformall/video/aliyun/AliyunVedioUploadHelper.java rename to mallinkVideo/src/main/java/com/iformall/video/aliyun/sdk/upload/AliyunVedioUpload.java index 0b4961e33..c9c377d65 100644 --- a/mallinkVideo/src/main/java/com/iformall/video/aliyun/AliyunVedioUploadHelper.java +++ b/mallinkVideo/src/main/java/com/iformall/video/aliyun/sdk/upload/AliyunVedioUpload.java @@ -1,4 +1,4 @@ -package com.iformall.video.aliyun; +package com.iformall.video.aliyun.sdk.upload; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -26,6 +26,9 @@ import com.aliyun.vod.upload.resp.UploadStreamResponse; import com.aliyun.vod.upload.resp.UploadURLStreamResponse; import com.aliyun.vod.upload.resp.UploadVideoResponse; import com.aliyun.vod.upload.resp.UploadWebM3u8Response; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.vod.model.v20170321.CreateUploadVideoRequest; +import com.aliyuncs.vod.model.v20170321.CreateUploadVideoResponse; /** * 以下Java示例代码演示了如何在服务端上传媒资文件至视频点播,媒资类型支持音频、视频和图片。 @@ -81,7 +84,7 @@ import com.aliyun.vod.upload.resp.UploadWebM3u8Response; * 注意: * 请替换示例中的必选参数,示例中的可选参数如果您不需要设置,请将其删除,以免设置无效参数值与您的预期不符。 */ -public class AliyunVedioUploadHelper { +public class AliyunVedioUpload { public static void main(String[] args) { @@ -150,6 +153,37 @@ public class AliyunVedioUploadHelper { // testUploadAttachedMediaStream(accessKeyId, accessKeySecret); } + /** + * 通过视频ID获取音视频播放地址 + * @param client + * @return + * @throws Exception + */ + public static CreateUploadVideoResponse createUploadVideo(DefaultAcsClient client) throws Exception { + CreateUploadVideoRequest request = new CreateUploadVideoRequest(); + request.setTitle("this is a sample"); + request.setFileName("filename.mp4"); + + //UserData,用户自定义设置参数,用户需要单独回调URL及数据透传时设置(非必须) + //JSONObject userData = new JSONObject(); + + //UserData回调部分设置 + //JSONObject messageCallback = new JSONObject(); + //messageCallback.put("CallbackURL", "http://192.168.0.0/16"); + //messageCallback.put("CallbackType", "http"); + //userData.put("MessageCallback", messageCallback.toJSONString()); + + //UserData透传数据部分设置 + //JSONObject extend = new JSONObject(); + //extend.put("MyId", "user-defined-id"); + //userData.put("Extend", extend.toJSONString()); + + //request.setUserData(userData.toJSONString()); + + return client.getAcsResponse(request); + } + + /** * 本地文件上传接口 * @@ -158,7 +192,7 @@ public class AliyunVedioUploadHelper { * @param title * @param fileName */ - public static void uploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) { + public static UploadVideoResponse uploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) { UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName); /* 可指定分片上传时每个分片的大小,默认为2M字节 */ request.setPartSize(2 * 1024 * 1024L); @@ -203,15 +237,7 @@ public class AliyunVedioUploadHelper { // request.setEcsRegionId("cn-shanghai"); 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"); - } + return response; } /** @@ -224,7 +250,7 @@ public class AliyunVedioUploadHelper { * @param fileName * @param url */ - public static void uploadURLStream(String accessKeyId, String accessKeySecret, String title, String url, String fileExtension) { + public static UploadURLStreamResponse uploadURLStream(String accessKeyId, String accessKeySecret, String title, String url, String fileExtension) { UploadURLStreamRequest request = new UploadURLStreamRequest(accessKeyId, accessKeySecret, title, url); /* 文件扩展名*/ @@ -265,15 +291,7 @@ public class AliyunVedioUploadHelper { // request.setEcsRegionId("cn-shanghai"); UploadVideoImpl uploader = new UploadVideoImpl(); UploadURLStreamResponse response = uploader.uploadURLStream(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"); - } + return response; } /** @@ -284,7 +302,7 @@ public class AliyunVedioUploadHelper { * @param title * @param fileName */ - public static void uploadFileStream(String accessKeyId, String accessKeySecret, String title, String fileName) { + private static void uploadFileStream(String accessKeyId, String accessKeySecret, String title, String fileName) { UploadFileStreamRequest request = new UploadFileStreamRequest(accessKeyId, accessKeySecret, title, fileName); /* 是否使用默认水印(可选),指定模板组ID时,根据模板组配置确定是否使用默认水印*/ //request.setShowWaterMark(true); @@ -336,7 +354,7 @@ public class AliyunVedioUploadHelper { * @param fileName * @param inputStream */ - public static void uploadStream(String accessKeyId, String accessKeySecret, String title, String fileName, InputStream inputStream) { + public static UploadStreamResponse uploadStream(String accessKeyId, String accessKeySecret, String title, String fileName, InputStream inputStream) { UploadStreamRequest request = new UploadStreamRequest(accessKeyId, accessKeySecret, title, fileName, inputStream); /* 是否使用默认水印(可选),指定模板组ID时,根据模板组配置确定是否使用默认水印*/ //request.setShowWaterMark(true); @@ -368,14 +386,7 @@ public class AliyunVedioUploadHelper { // request.setEcsRegionId("cn-shanghai"); UploadVideoImpl uploader = new UploadVideoImpl(); UploadStreamResponse response = uploader.uploadStream(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"); - } + return response; } /** @@ -538,7 +549,7 @@ public class AliyunVedioUploadHelper { * m3u8FileURL: 网络m3u8索引文件的URL地址,且m3u8文件的分片信息必须是相对地址,不能含有URL或本地绝对路径 * sliceFileURLs: ts分片文件的URL地址列表;需自行拼接ts分片的URL地址列表 */ - private static void uploadWebM3u8(String accessKeyId, String accessKeySecret) { + public static void uploadWebM3u8(String accessKeyId, String accessKeySecret) { String title = "test_upload_web_m3u8"; String m3u8FileURL = "http://test.aliyun.com/f0d644abc547129e957b386f772c72/a0e1e2817ab9425aa558fe67a90e717f-538087dcf2c201c31ce4324bf76af691-ld.m3u8"; UploadWebM3u8Request request = new UploadWebM3u8Request(accessKeyId, accessKeySecret, title, m3u8FileURL); @@ -596,7 +607,7 @@ public class AliyunVedioUploadHelper { * @param accessKeyId * @param accessKeySecret */ - private static void uploadAttachedMediaLocalFile(String accessKeyId, String accessKeySecret) { + public static void uploadAttachedMediaLocalFile(String accessKeyId, String accessKeySecret) { /* 业务类型 */ String businessType = "watermark"; /* 文件扩展名 */ @@ -639,7 +650,7 @@ public class AliyunVedioUploadHelper { * @param accessKeyId * @param accessKeySecret */ - private static void uploadAttachedMediaStream(String accessKeyId, String accessKeySecret) { + public static void uploadAttachedMediaStream(String accessKeyId, String accessKeySecret) { /* 业务类型 */ String businessType = "watermark"; /* 文件扩展名 */ diff --git a/mallinkVideo/src/main/java/com/iformall/video/entity/VideUploadResult.java b/mallinkVideo/src/main/java/com/iformall/video/entity/VideUploadResult.java index 57feb119d..55bdb92e6 100644 --- a/mallinkVideo/src/main/java/com/iformall/video/entity/VideUploadResult.java +++ b/mallinkVideo/src/main/java/com/iformall/video/entity/VideUploadResult.java @@ -6,4 +6,6 @@ import lombok.Data; public class VideUploadResult { private String videoId; private String videoUrl; + private boolean success = false; + private String msg; }