阿里云上传视频回调处理

(HTTP形式回调)续上一篇上传视频,发现了一个问题当你阿里云那边设置了视频转码,如果上传完成后你立即去获取视频信息,会返回你视频还在转码中无法获取视频信息,看了阿里的回调api 写回调事件,当视频回调转码成功后再去填充数据里的视频信息

需注意如果你设置了回调URL鉴权后,他会发两个"X-VOD-TIMESTAMP",“X-VOD-SIGNATURE” 这样做是防止别人恶意刷你的链接

URL鉴权api链接

回调事件类型api链接

上代码:

AliyunVideoUtils.callbackUrl// 这个是你设置回调的url  
AliyunVideoUtils.privateKey  //这个是你设置鉴权让你预设的签名Key~
public void callback(@RequestBody String body, HttpServletRequest request, HttpServletResponse response) {
        try {
            String vodTimestamp = request.getHeader("X-VOD-TIMESTAMP");   //UNIX时间戳,整形正数,固定长度10,1970年1月1日以来的秒数,表示回调请求发起时间~
            String vodSignature = request.getHeader("X-VOD-SIGNATURE");	//签名字符串,为32位MD5值
            String sign = DigestUtils
                    .md5Hex(AliyunVideoUtils.callbackUrl + "|" + vodTimestamp + "|" + AliyunVideoUtils.privateKey); //以这种形式拼接起来 下面进行对比 
            if (!sign.equalsIgnoreCase(vodSignature)) { //进行对比   此操作是防止别人通过 你的链接刷数据
                logger.warn("阿里云视频回调签名不通过!X-VOD-TIMESTAM={},X-VOD-SIGNATURE={}", vodTimestamp, vodSignature);
            } else {
                logger.info("阿里云视频回调:{}", body);
                if (StringUtils.isNotBlank(body)) {
                    // 判断事件,如此事件是视频转码完成,根据videoId 来获取视频信息来填充数据库
                    Map<String, Object> map = jsonToMap(body);// 此方法是将返回来的json字符串 转为map   下面有这方法
                    //断送事件类型 有很多个事件类型  我这是单个视频转码成功事件类型 通过判断 EventType 来确认是回调了什么事件类型再处理
                   //注意他会回两个这个事件 ,因有m3u8与MP4 所以 我根据 FileUrl拿后缀名去减少多于的循环
                    if (map.get("EventType").toString().equalsIgnoreCase("StreamTranscodeComplete")
                            && map.get("Status").toString().equalsIgnoreCase("success")
                            && map.get("FileUrl").toString()
                                    .substring(map.get("FileUrl").toString().lastIndexOf(".") + 1)
                                    .equalsIgnoreCase("mp4")) {
                        String videoId = map.get("VideoId").toString();
                        List<CourseVideo> courseVideos = courseVideoService.findByVideoUrl(videoId);
                        if (courseVideos != null && courseVideos.size() > 0) {
                            for (CourseVideo courseVideo : courseVideos) {
                            //经过多个判断通过后 调用我上一次写的工具类来获取转码成功后的视频 信息 并填充到数据库
                                GetPlayInfoResponse playInfo = AliyunVideoUtils.getPlayInfo(videoId);
                                if (playInfo != null) {
                                    // courseVideo.setCoverUrl(playInfo.getVideoBase().getCoverURL()); //  我以第一帧去做封面 但3000秒后失效 所以不要存到数据库中  我是当controlle拿数据填充 View时再将这些视频信息填充到实体类(我是实体类中有暂存字段的)中
                                    courseVideo.setStatus(CourseVideoStatus.DRAFT.getValue());
                                    courseVideo.setDuration(
                                            Integer.parseInt(playInfo.getPlayInfoList().get(0).getDuration()));
                                } else {
                                    logger.warn("阿里云视频获取不到视频信息:{}", "VideoId:" + videoId);
                                }
                            }
                            courseVideoService.save(courseVideos);
                        } else {
                            logger.warn("未找到相对于的课程视频信息,videoId={}", videoId);
                        }
                    } else if (map.get("EventType").toString().equalsIgnoreCase("ImageUploadComplete")
                            && map.get("Status").toString().equalsIgnoreCase("success")) {
                        // 图片上传回调
                    }
                }
            }
        } catch (Exception e) {
            logger.error("阿里云回调处理服务器内部出错,原因={}", e.getMessage(), e);
            response.setStatus(500);
        }
    }

  /**
     * json字符串转Map<String,Object>
     */
    public Map<String, Object> jsonToMap(String jsonString) {
        JSONObject json = new JSONObject(jsonString);
        Map<String, Object> map = new HashMap<String, Object>();
        @SuppressWarnings("rawtypes")
        Iterator it = json.keys();
        while (it.hasNext()) {
            String key = (String) it.next();
            Object value = json.get(key);
            map.put(key, value);
        }
        return map;
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,关于go阿里云oss视频上传的问题,我可以为您提供一些建议和参考。 首先,您需要在阿里云官网注册账号并创建一个OSS存储空间。然后,您可以使用阿里云提供的Go SDK来实现视频上传功能。在使用SDK前,您需要先安装SDK,并在代码中引入相应的SDK包。 接下来,您需要编写代码来实现视频上传功能。以下是一个简单的示例代码: ``` import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 阿里云OSS的Access Key ID和Access Key Secret accessKeyId := "your_access_key_id" accessKeySecret := "your_access_key_secret" // OSS存储空间的Endpoint和名称 endpoint := "your_endpoint" bucketName := "your_bucket_name" // 本地视频文件的路径和文件名 localFile := "path/to/local/video.mp4" // OSS存储空间中视频文件的名称 objectName := "video.mp4" // 创建OSS客户端实例 client, err := oss.New(endpoint, accessKeyId, accessKeySecret) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 获取存储空间实例 bucket, err := client.Bucket(bucketName) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 上传视频文件 err = bucket.PutObjectFromFile(objectName, localFile) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Println("Video uploaded successfully.") } ``` 在代码中,您需要替换accessKeyId、accessKeySecret、endpoint、bucketName、localFile和objectName等参数为您自己的值。 以上就是使用Go语言实现阿里云OSS视频上传的基本步骤和示例代码。希望能对您有所帮助。 ### 回答2: 阿里云oss是一种云存储服务,可以用于上传、存储和管理各种文件,包括视频文件。下面是如何使用阿里云oss进行视频上传的步骤: 1. 创建阿里云账号并登录控制台。如果还没有账号,需要先注册一个阿里云账号。 2. 在控制台中找到并点击进入OSS服务。 3. 在OSS服务中创建一个存储空间,即Bucket。Bucket可以理解为一个文件夹,用于存放上传视频文件。 4. 在创建Bucket时,需要设置Bucket的名称和地域等属性。 5. 在Bucket中创建一个文件夹,用于存放视频文件。 6. 使用OSS的SDK或者API,将视频文件上传到创建的文件夹中。SDK和API提供了丰富的功能,可以支持断点续传、上传进度监听等。 7. 在上传视频文件时,可以设置一些参数,例如文件的ACL权限、存储类型等。 8. 上传完成后,可以在控制台中查看已上传视频文件。 9. 可以通过OSS提供的URL链接,获取已上传视频的访问地址,用于分享、播放等。 10. 在需要使用已上传视频时,可以使用OSS提供的SDK或API进行相关操作,例如下载、删除等。 总结,使用阿里云OSS进行视频上传需要创建阿里云账号、登录控制台,创建存储空间和文件夹,使用SDK或API实现上传功能,最后通过链接分享或进行其他操作。 ### 回答3: 阿里云的OSS(对象存储服务)是一种可靠、安全、高性能的云存储产品。通过OSS,我们可以方便地上传和管理各种类型的文件,包括视频文件。 要使用阿里云OSS上传视频,需要先获取阿里云账号,并在控制台中创建一个OSS Bucket(存储空间)。在创建Bucket时,需要选择合适的地域和权限策略。 在上传视频之前,我们需要将视频文件切片处理,这可以通过FFmpeg等工具来实现。切片处理可以将大文件切割成小的分片,便于上传和管理。 接下来,我们可以使用阿里云的OSS SDK或API进行视频上传。SDK提供了多种编程语言的封装,例如Java、Python、PHP等,方便开发者使用。我们需要设置好上传的目标Bucket、Object(视频文件名)、上传文件的本地路径以及其他可选的上传参数。 在视频上传过程中,可以选择通过断点续传来保证上传的稳定性。断点续传可以将大文件分成多个分片,每个分片独立上传,如果某个分片上传失败,可重新上传该分片而不需要重新上传整个文件。 上传完成后,可以通过OSS提供的URL访问视频文件。同时,我们还可以设置访问权限,限定只有特定的用户或应用可以访问视频文件。 阿里云OSS还提供了丰富的功能,例如数据归档、数据迁移、安全备份等,可以根据实际需求来进行配置和使用。 总之,通过阿里云OSS,我们可以方便地将视频文件上传至云端,并进行灵活的管理和访问。这为视频存储和分发提供了可靠的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值