腾讯云多媒体文件处理总结

简单记录一下项目中使用cos进行图像、视频处理时遇到的问题和思考总结。

场景一

 需要根据用户上传的视频自动获取视频封面图片用做视频展示的封面

场景二

需要根据用户上传的图片进行压缩处理以节省图片下载时长,减少页面响应时长

场景三

后台获取用户上传视频的时长(前端获取的时候无法保证在上传到cos之前及时获取视频时长,所以需要后台通过接口来获取)

场景四

前端视频偶现无法下载的情况,

解决过程:

一、前置条件:

        在腾讯云控制台开启媒体处理功能(收费),如果要使用cos提供的媒体处理功能,如图片压缩,视频获取指定帧,获取媒体文件元信息等必须要开通该功能,开通媒体服务如下:

 配置媒体文件访问时的跨域问题:

 二、解决过程

        首先,通过后端Http请求的方式获取视频媒体文件的时长,从而限制用户上传的视频不能超过一定时长,代码如下:

public Boolean checkVideoDuration(String videoUrl) {
        try {
            String reqUrl = videoUrl + "?ci-process=videoinfo";
            log.info("提交检测视频文件url: {}", reqUrl);
            String respStr = restTemplate.getForObject(reqUrl, String.class);

            //创建解析XML对象
            XStream xStream = new XStream() {
                @Override
                protected MapperWrapper wrapMapper(MapperWrapper next) {
                    return new MapperWrapper(next) {
                        @Override
                        public boolean shouldSerializeMember(Class definedIn, String fieldName) {
                            if (definedIn == Object.class) {
                                return false;
                            }
                            return super.shouldSerializeMember(definedIn, fieldName);
                        }
                    };
                }
            };
            xStream.processAnnotations(Response.class);
            @SuppressWarnings("unchecked")
            Response resp = (Response) xStream.fromXML(respStr);
            Double duration = resp.getMediaInfo().getStream().getVideo().getDuration();
            return 120 - duration.intValue() > 0;
        } catch (Exception e) {
            log.error("解析视频信息异常, {}", e);
            return false;
        }
    }

         腾讯云媒体处理官网链接:https://cloud.tencent.com/document/product/436/55672        

        此处用resttemplate模拟发送http请求到cos服务端,由于官方文档说返回的响应结果是application/xml格式,导致这里有一个小插曲,由于当时时间紧,任务急所以就直接找了jackson-xml进行String到JavaBean的格式转换,导致所有的http请求的响应到前端都成了xml格式了,虽然临时通过前端添加Content-Type: application/json的方式解决了,但是还是导致一些没有加的接口返回xml这种不友好的格式,最终采用了xstream的方式进行解析xml字符串到JavaBean的转换;

        然后,就是媒体文件的压缩和获取第一帧的问题,下面是对应的官网文档链接:

https://cloud.tencent.com/document/product/436/60453

        说说我当时的思考过程,以及实践之后的总结,根据官网的说明,压缩图片可以通过如下的方式进行实现:

http://example-1258125638.cos.ap-shanghai.myqcloud.com/sample.png?imageMogr2/format/webp

就是将已经上传的图片生成的链接后面添加imageMogr2/format/webp这种后缀就可以实现,由于当时想的是,由于在官网接口说明中需要Auth String才能通过上面的url方式直接实现压缩,当时我就跟着官网说明查看获取Auth String的方式发现有点繁琐,后面想着对比华为云OBS的文件压缩方式,就直接拿着上面的url链接在浏览器试了一下,发现可以实现压缩,并展示出来压缩的图片,然后保存图片,发现确实图片大小确实小了很多,大功告成;

        接下来看看获取视频指定帧,官方文档链接如下:

https://cloud.tencent.com/document/product/436/55671

如官方文档所示,直接在图片url后面添加参数的方式来实现获取截屏帧,如下:

https://<BucketName-APPID>.cos.<Region>.myqcloud.com/for-test.mp4?ci-process=snapshot&time=1&format=jpg&<Auth String>

和上面压缩如出一辙,也是需要Auth String,当时也是没唬住了,想办法获取这个Auth String,后来结合之前使用OBS的场景,大胆尝试,发现已经上传的视频,直接在后面添加

"ci-process=snapshot&time=1&format=jpg"参数,就可以获取视频第一帧的图片了;

        最后,出现在当时已经在云端存储的视频文件,在pc端下载出现失败的情况,除了修改上面的跨域配置之外,如果还开启了cdn全球加速的话,也要吧cdn全球加速、cdn跨域headers配置都设置一下,否则还是会出现下载失败的情况

总结:

        后来仔细一想,可能我们通过我们的key,scret在上传文件到cos的时候,如果上传成功了,返回的文件url其实就包含我们的bucket,endpoint等信息,这个时候,直接使用这个文件的url去访问媒体处理相关服务的时候,其实这个Auth String的鉴权信息其实已经自动就识别了,可能通过我们的bucket,endpoint等信息就已经不需要再传递Auth String等额外鉴权信息了;

        而且不论阿里的OSS,华为云的OBS,腾讯云的COS,他们的文件url结构都是类似的组装结构,尤其当我们将我们的bucket的读写权限设置成如下公共读的时候,就已经可以直接拿文件的url进行访问相关服务,而不需要重新获取Auth String相关信息了

 

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 31
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值