OSS作为对象存储产品,主要提供的是海量非结构化数据的存储,其中绝大部分都是视频和图片等富媒体数据,针对该场景的需求,OSS提供了丰富的图片处理功能来帮助用户更加方便的对存储于OSS上的图片数据进行加工,从而减少了对于流量、CPU等资源的消耗。
但是随着视频业务的发展,对于如何处理OSS上大量的视频数据在业务上也是一个比较大的挑战。比如视频预览就是很多业务场景下的强需求,常规的做法是从OSS读取视频文件然后本地处理再返回给用户,这个过程中文件读取和处理都会存在一定的瓶颈。针对这个场景,OSS内置提供了视频截帧功能。这里主要介绍OSS提供的视频截帧功能的使用方法。
调用方式
OSS提供的视频截帧功能和OSS图片服务功能使用的方式是类似的,都是通过传入x-oss-process参数的方式来实现的。最简单的使用方式就是直接在public的object的url后面拼接处理字符串。比如如下的url:
http://a-image-demo.oss-cn-qingdao.aliyuncs.com/demo.mp4?x-oss-process=video/snapshot,t_10000,m_fast
指定的就是对demo.mp4这个文件直接调用视频截图,截图的位置由参数t指定,后面的单位是ms,因此这个url的含义就是截取视频文件的第10s的内容。生成的url可以直接嵌入在网页提供给用户浏览。
如果需要对private的object调用视频截图,需要使用SDK进行鉴权,接口和OSS图片服务的调用接口一致。
目前OSS只支持视频编码为h264的视频文件的处理,视频格式本身没有限制。
调用参数
目前支持的参数见视频截帧功能的文档:
https://help.aliyun.com/document_detail/64555.html。
这里介绍一下具体的一些应用:
时间越界
视频截帧是通过t来指定截帧时间参数,t的范围为0到INT32_MAX,当t指定的时间超出视频的长度的时候,返回视频最后一帧的内容。
控制图片输出大小
视频截帧功能支持选择输出图片的大小,使用w参数指定宽度,h指定长度。
- 不指定w和h参数,或者w和h都指定为0,输出的图片大小为视频的真实长宽。
- 单独指定w或者h参数,输出的图片大小指定的数值,另外一个没有指定的数值通过视频原始比例自动计算出来。
- 同时指定w和h参数,输出图片大小为指定的数值,如果长宽比例和原始视频比不相等则强制拉伸。
比如下面这个url就是将输出的图片大小指定为800宽度。
关键帧
关键帧,也称I帧,是视频编码中的一个关键概念,指的是不依赖于前后参考帧就能独立解码的一种视频帧,在h264格式中常见的关键帧间隔为3-10秒。解码关键帧只需要读取关键帧对应的数据,而解码非关键帧需要顺序读取上一个关键帧到当前帧所有的数据才能完成。因此在OSS视频截帧功能中提供了控制功能,可以选择是否只读取关键帧信息,即m参数。
当m指定为fast的时候,OSS读取到指定时间点之前最接近的一个关键帧就解码返回;如果没有指定该参数则会持续解码到精确的时间点对应的视频帧再返回。对于没有特殊需求的用户来说,OSS强烈建议指定m_fast参数,这样可以大大提升截帧的请求响应速度。
输出格式
OSS输出的视频格式支持jpg和png两种格式,可以通过f参数来切换,默认输出的是jpg格式,对于没有特殊需求的用户无需指定该参数。
下面这个url就是将输出格式切换为png。