视频点播
最佳实践
文档版本 01
发布日期 2022-02-16
版权所有 © 华为技术有限公司 2022。 保留一切权利。
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。
商标声明
和其他华为商标均为华为技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。
目 录
1 迁移音视频文件至 VOD...1
2 自定义视频封面... 5
3 使用 VOD 处理 OBS 中的音视频... 8
4 通过防盗链控制音视频的播放权限... 11
5 通过 HLS 加密防止视频泄露... 16
6 如何对音视频内容进行审核?...24
最佳实践 目 录
1 迁移音视频文件至 VOD
场景说明
视频业务在各领域的兴起,大量的音视频文件需要一个平台对其进行处理并加速分 发,华为云视频点播服务就是一个实现视频上传、自动化转码处理、媒资管理、分发 加速的一站式媒体服务。在使用点播服务的丰富的媒资处理功能前,您需要将这些音 视频文件上传到点播服务。为了满足源文件不同的存储方式的场景,华为云点播服务 同样也提供了多样的上传方式。
上传方式
视频点播提供了的音视频上传方式如表1-1所示
表1-1 上传方式
上传方式 适用场景
本地上传 适用于将存储在本地磁盘的音视频文件迁移至 VOD。
PC客户端工具上传
适用于大文件、长时间上传的场景。OBS转存
适用于将OBS桶中的音视频复制迁移至VOD的场 景。OBS托管
适用于仅需要使用VOD的音视频处理、分发等能 力,但源文件和处理后的文件仍存储在OBS桶的场 景。URL拉取
适用于将网络上的音视频文件拉取存储至VOD的场 景。本地上传
支持批量上传音视频文件,便于快速将媒资上传到点播服务中,使用浏览器登录控制 台即可进行上传。
华为云点播服务提供的本地上传功能有如下限制:
最佳实践 1 迁移音视频文件至 VOD
● 控制台由于安全策略,长时间上传可能会由于登录失效导致大文件上传失败,在 上传大量文件时,需要操作控制台,从而保证控制台不自动退出登录。
● 支持上传的格式如下所示:
– 视频文件:MP4,TS,MOV,MXF,MPG,FLV,WMV,AVI,M4V,
F4V,MPEG,3GP,ASF,MKV
– 音频文件:MP3,OGG,WAV,WMA,APE,FLAC,AAC,AC3,MMF,
AMR,M4A,M4R,WV,MP2 通过控制台本地上传
1. 登录视频点播控制台。
2. 在左侧导航栏选择“上传音视频 > 本地上传”,进入本地上传页面。
3. 单击“添加音视频”,添加存储在本地的音视频文件。
您可以根据实际需求在“音视频处理”中选择转码模板或工作流。上传成功后自 动对上传的音视频进行处理。
4. 单击“开始上传”,开始上传音视频文件。
上传时间与文件大小和网络情况都有关。
调用API完成本地上传
● 若您上传的音视频文件大小小于20M,则不需要先分段再上传,具体请参见媒资 上传(20M以下)。
● 若您上传的音视频文件大小大于20M,则您需要先将音视频文件进行分段,分段 大小必须小于20M,然后再分别上传各分段,具体请参见媒资上传(20M以 上)。
PC 客户端工具上传
华为云点播服务提供了PC端上传工具,支持将存储在华为云OBS桶或者本地的音视频 文件迁移至点播服务中,目前提供了Windows和Linux两个版本。
华为云点播服务提供的PC端上传工具有如下限制:
● 不支持跨区域进行OBS音视频迁移,如“华南-广州”OBS桶中的资源不能迁移至
“华北-北京四”点播服务。
● 使用上传工具需要先安装JDK,且版本不能低于JDK1.8(暂不支持Open JDK)。
● 目前暂只支持上传MP4、TS、MOV、MXF、MPG格式的视频文件。
● 不支持在上传后自动根据配置进行音视频处理。
PC客户端工具上传的使用方法请参见工具批量上传。
最佳实践 1 迁移音视频文件至 VOD
OBS 转存
若在开通点播服务前,已在华为云OBS桶中存储了大量的音视频文件,希望使用视频 点播的转码、截图等功能对这些音视频进行处理。您可以使用该功能将OBS桶中的音 视频文件复制转存到点播服务中,然后使用点播服务的相关功能。
华为云点播服务提供的OBS转存功能有如下限制:
● 不支持跨区域转存,如“华北-北京四”OBS桶中的音视频只能转存到“华北-北京 四”点播服务中。
● 转存是指将OBS桶中的音视频文件复制一份到点播服务中,因此,若OBS桶中的 音视频不删除,则OBS和点播服务中都将会有相关的存储费用产生。
● 支持转存的格式如下所示:
– 视频文件:MP4、TS、MOV、MXF、MPG、FLV、WMV、AVI、M4V、
F4V、MPEG、3GP、ASF、MKV
– 音频文件:MP3、OGG、WAV、WMA、APE、FLAC、AAC、AC3、MMF、
AMR、M4A、M4R、WV、MP2
OBS转存方式暂只支持调用API实现,您可以调用创建媒资:OBS转存接口实现该功 能。
OBS 托管
若您已有大量的音视频文件存储在华为云OBS桶中,希望使用视频点播的转码、截图 等功能对这些音视频进行处理。虽然使用OBS转存方式能满足该场景,但会导致OBS 和点播服务中分别存储有相同的音视频文件,不仅造成额外的存储费用,且OBS桶中 有新增音视频时,需要再次使用工具进行手动转存。因此,华为云点播服务还提供了 OBS托管功能,源文件仍存储在OBS桶中,将该OBS桶授权托管给点播服务,这样您就 可以直接在点播服务中对源文件进行处理,且处理后生成的相关媒资文件可以选择存 储在点播服务或者自己的OBS桶中。
华为云点播服务提供的OBS托管功能有如下限制:
● 不支持跨区域托管,如“华北-北京四”OBS桶中的音视频只能托管到“华北-北京 四”点播服务中。
● IAM子账号暂不支持使用OBS托管功能。
● 支持托管的格式如下所示:
– 视频文件:MP4,FLV,TS,MOV,MXF,MPEG,WMV,AVI,M4V,
F4V,MPG
– 音视频文件:MP3,OGG,WAV,WMA,APE,FLAC,AAC,AC3,
MMF,AMR,M4A,M4R,WV,MP2 通过控制台托管
您可以在视频点播控制台使用存量托管和增量托管完成音视频托管,具体操作请参见3 使用VOD处理OBS中的音视频。
调用API完成OBS托管
1. 获取调用API的用户Token,具体请参见构造请求。
2. 调用桶授权接口,将需要被托管的OBS桶授权给点播服务。
3. 调用创建媒资:OBS托管方式接口,在请求参数中设置存量托管的相关参数。
点播API暂只提供了存量托管功能,若您需要OBS有新增音视频文件时,会自动同 步到点播服务中,则还需要在点播控制台配置增量托管。
最佳实践 1 迁移音视频文件至 VOD
4. 调用查询媒资列表接口,查看托管结果。
托管成功后,即可使用视频点播服务处理被托管的音视频文件。
URL 拉取
支持将其它网络音视频拉取上传到点播服务,华为云点播服务提供的URL提取功能具 有如下限制:
● 控制台一次最多支持拉取100条音视频,API一次最多支持拉取16条音视频。
● 拉取的URL需要直接指向音视频文件,不能是某个网站的页面链接,且后缀必须 是音视频格式,当前支持拉取的URL后缀如下所示:
– 视频文件:MP4,TS,MOV,MXF,MPG,FLV,WMV,AVI,M4V,
F4V,MPEG,3GP,ASF,MKV
– 音视频文件:MP3,OGG,WAV,WMA,APE,FLAC,AAC,AC3,
MMF,AMR,M4A,M4R,WV,MP2
● 拉取的URL协议暂只支持HTTP和HTTPS。
● 从其它云服务商拉取过来的音视频将会生成新的媒资ID,无法继承原有媒资ID。
通过控制台拉取上传 1. 登录视频点播控制台。
2. 在左侧导航栏选择“上传音视频 > URL拉取”,进入URL拉取页面。
3. 单击“URL拉取”,输入符合要求的音视频URL。
您可以根据实际需求在“音视频处理”中选择转码模板或工作流。拉取成功后会 自动对拉取的音视频进行处理。
4. 单击“确认”,可在URL拉取列表中查看到任务执行情况。
调用点播API拉取上传
1. 获取调用API的用户Token,具体请参见构造请求。
2. 调用创建媒资:URL拉取注入接口,在请求参数中设置批量拉取的URL及音视频 处理参数。
3. 调用查询媒资列表接口,查看拉取结果。
建议您等待一两分钟后(具体根据视频文件的大小有所差别),再查询拉取结 果。
最佳实践 1 迁移音视频文件至 VOD
2 自定义视频封面
场景说明
随着视频点播存储视频文件量的增加,设置视频封面不仅能提升展示的美观性,还能 方便通过封面查找相关视频。同时,上传的视频封面也将会生成对应的封面地址,实 现加速分发,可以直接将封面与视频文件一同引用到网页中。
上传视频时,点播服务会默认截取视频的第一帧作为封面图片。您也可以通过上传图 片或截图封面来更新视频的封面。
● 上传封面:适用于需要通过封面表达视频的大概内容及重点的场景。在上传前,
您需要提前线下设计一张JPG或PNG格式的封面图片。
● 截图封面:适用于希望将视频中的某个瞬间画面来设置成封面的场景。无需要额 外准备工作,您可以直接使用视频点播的截图功能生成。
您可以通过以下方式自定义视频封面:
● 控制台设置视频封面
● 调用API设置视频封面
● 使用SDK设置视频封面
控制台设置视频封面
在视频点播控制台的音视频管理中上传封面图片。
1. 登录视频管理控制台,在左侧导航栏选择“音视频管理”,进入音视频管理页 面。
2. 在需要上传封面的视频行单击“管理”,在“基本信息”页签单击“编辑”。
3. 单击添加框,上传本地的封面图片,上传完成后单击“保存”即可。
在视频截图中,可以先对视频进行截图,然后选择某一张截图作为封面。支持截图的 视频格式有FLV、MP4、TS、MOV、MXF、MPG、WMV、AVI、M4V、F4V和 MPEG。
1. 登录视频管理控制台,在左侧导航栏选择“视频处理 > 视频截图”,进入视频截 图页面。
2. 勾选需要截图的视频,单击“截图”,在弹出的截图设置框中设置截图参数。
最佳实践 2 自定义视频封面
– 按时间间隔:根据设置的时间间隔,从视频首帧开始截图,以最后一帧截图 结束,最大间隔不能超过12秒。可选择是否将首帧截图作为视频封面。
– 指定时间点:根据设置指定时间从视频中截取图片,最多可设置10个时间 点。可选择是否将某张截图作为视频封面。
3. 单击“确定”,视频开始截图。
4. 截图完成后,单击“详情”,可以在详情页面中选择某一张截图作为封面。
调用 API 设置视频封面
视频点播API支持通过媒资上传、视频更新、视频处理三种方式设置视频的封面图片。
● 视频上传时设置封面
视频点播提供了上传、OBS转存、OBS托管、URL拉取四种创建媒资的方式,其中 上传方式创建媒资支持上传或截图封面,其它三种方式仅支持截图封面。具体如 下所示:
– 上传方式创建媒资
上传封面:调用创建媒资:上传方式接口,在请求参数中设置
“cover_type”,即上传封面的图片类型,然后在请求的返回参数中获取
“cover_upload_url”,通过“cover_upload_url”上传封面图片即可。
截图封面:调用创建媒资:上传方式接口,在请求参数中设置
“thumbnail”,设置截图类型,指定某张截图作为封面。
– OBS转存、OBS托管和URL拉取方式创建媒资
分别调用创建媒资:OBS转存方式口、创建媒资:OBS托管方式接口或创建 媒资:URL拉取注入接口,在请求参数中设置“thumbnail”,设置截图类 型,指定某张截图作为封面。
● 视频更新时设置封面
调用视频更新接口,在请求参数中设置“cover_type”,即上传封面的图片类 型,然后在请求的返回参数中获取“cover_upload_url”,通过
“cover_upload_url”上传封面图片即可。
● 视频处理时设置封面
调用视频处理接口生成截图,然后指定某张截图作为封面。若您需要在已生成的 截图中更换封面,则可以先调用查询媒资详细信息接口,获取该视频的截图 URL,然后调用设置封面接口修改截图封面。
最佳实践 2 自定义视频封面
使用 SDK 设置视频封面
视频点播提供的服务端SDK,对API接口进行了封装,您可以在SDK中心下载对应 SDK,然后进行集成开发。
● 视频上传时设置封面:服务端SDK提供了本地上传、OBS转存、OBS托管、URL拉 取四种媒资上传方法,可以在对应的方法中上传本地图片设置封面,或者截图设 置封面。
● 视频更新时设置封面:服务端SDK支持在视频上传完成后,可以调用视频更新方 法时上传本地图片,更新视频封面。
● 视频处理时设置封面:服务端SDK支持在视频上传完成后,可以调用音视频方法 时设置截图参数,选择某张截图作为视频封面。
最佳实践 2 自定义视频封面
3 使用 VOD 处理 OBS 中的音视频
场景说明
目前视频点播已提供了丰富的音视频上传方式,如视频点播控制台的本地上传,URL 拉取等功能。但若您已有大量的音视频文件存储在OBS桶中,希望使用视频点播的转 码、截图等功能对这些音视频文件进行处理,可以使用OBS转存方式将音视频文件迁 移到点播服务中。但这种方式会导致OBS和点播服务中分别存有相同的音视频文件,
不仅造成额外的存储费用,且OBS桶中有新增音视频时,需要再次进行手动转存。
为解决上述问题,视频点播提供了OBS音视频托管功能,源文件仍是存储在OBS桶 中,授权托管给点播服务后,您可以直接在视频点播控制台对源文件进行处理,且处 理后生成的相关媒资文件可以选择存储在点播服务或者自己的OBS桶中。
本示例中将实现如下场景:
“华北-北京四”的OBS桶中已存储了大量的音视频文件,先将现有的音视频同步到点 播服务中,后续若有新的音视频文件增加,将自动同步到点播服务。使用点播服务处 理音视频产生的相关媒资文件存储的“华北-北京四”的另一个OBS桶中,且存储路径 与源文件的路径一致。
处理流程
1. 在OBS托管前,需要将存储源文件的OBS桶、存储音视频处理后生成的相关媒资 文件的OBS桶都授权给点播服务,允许点播服务访问对应的OBS桶。
2. 使用点播服务的存量托管功能将现有的音视频同步到点播服务。
3. 在点播服务中为存储源文件的OBS桶添加增量托管配置,允许OBS桶中的新增音 视频自动同步到点播服务中。
处理步骤
步骤1 OBS桶授权。
1. 登录视频点播控制台,在左上角确认区域是否是“华北-北京四”,若不是,切换 区域。
2. 在左侧导航树中选择“音视频托管 > 桶授权”,进入桶授权页面。
最佳实践 3 使用 VOD 处理 OBS 中的音视频
3. 在对应的OBS桶行单击“授权”,完成桶授权。
步骤2 创建存量托管任务。
1. 在左侧导航树中选择“音视频托管 > 存量托管”,进入存量托管页面。
2. 单击“创建任务”,在任务创建页面配置相关参数。
– 源桶:需要被托管的OBS桶。
– 源范围:OBS桶托管的范围,支持对整个桶的某些类型的音视频进行托管,
也可以选择托管某个目录或者是某个音视频文件。
– 音视频处理:选择是否在托管后,对音视频进行转码或通过工作流进行处 理。
– 输出存储位置:在点播服务中对托管的音视频进行处理后生成的媒资文件的 存储位置,支持存储在点播或用户的OBS桶中,本示例选择“租户桶(输出 同源)”,然后在“输出桶”中选择需要存储的OBS桶,在该桶中的存储路 径与源文件路径相同。
3. 单击“确定”,开始执行托管任务。
当执行完成后,可以在“音视频管理”页面查看托管成功的音视频文件。
步骤3 添加增量托管配置。
1. 在左侧导航树中选择“音视频托管 > 增量托管”,进入增量托管页面。
2. 单击“添加配置”,在创建托管配置页面配置相关参数。
相关配置参数与存量托管类似,但与存量托管不同,增量托管是针对整个桶进行 托管,选择托管的文件类型后,若该OBS桶中有新增的对应类型的音视频文件,
则将自动同步到点播服务中。
3. 配置完成后,单击“确定”。
最佳实践 3 使用 VOD 处理 OBS 中的音视频
配置添加后即时生效,您可以通过在该托管的OBS桶中上传音视频文件进行验 证。
----结束
最佳实践 3 使用 VOD 处理 OBS 中的音视频
4 通过防盗链控制音视频的播放权限
场景说明
为对分发的音视频进行播放权限控制,点播服务提供了防盗链功能。开启后,CDN会 对所有播放请求中携带的关键信息进行校验,仅校验通过的请求会予以响应,其它非 法的访问将直接返回403。防盗链方案中包含Referer防盗链和Key防盗链。
Referer防盗链是基于HTTP协议支持的Referer机制实现的,通过播放请求中携带的 Referer字段识别请求来源。配置黑名单或白名单,CDN将根据名单对请求来源进行过 滤,从而达到最基本的访问控制的目的。Referer防盗链具有配置便捷,无需额外开 发,快速生效等优势,适用于音视频主要在web端引用的场景。
由于HTTP Header的内容可伪造,Referer防盗链只能达到最基本的保护,安全性不 高。所以还可以采用Key防盗链方案,通过鉴权播放URL保障点播资源的安全。由于鉴 权的Key值具有时效性,所以适用于对媒资安全要求比较高的场景。
本示例中,开启Referer防盗链,只允许白名单中的域名访问视频文件,然后通过Key 防盗链生成鉴权播放地址。
实现原理
Referer防盗链的实现原理比较简单,在点播控制台配置了白名单或黑名单后,点播服 务会将这份名单分发到CDN中。当CDN接收到资源请求时,会根据这个名单来识别请 求是否合法,若合法,则访问请求的资源,否则拒绝并返回403。
Key防盗链是视频点播的加速节点与点播源站联合实现的,比Referer防盗链更为安全 可靠的一种防盗播方案。Key防盗链的实现过程如图4-1所示。
最佳实践 4 通过防盗链控制音视频的播放权限
图4-1 Key 防盗链实现原理
流程说明如下所示:
1. 租户在点播控制台开启Key防盗链功能,并配置误差允许时间、算法等。
2. 点播服务将配置的密钥值等下发到CDN节点中。
3. 租户通过点播服务获取到点播媒资的鉴权URL。
4. 观众通过租户提供的鉴权播放URL向CDN请求视频播放。
5. CDN根据播放URL中携带的鉴权信息校验请求的合法性,仅校验通过的请求会被 允许。
配置 Referer 防盗链
先配置Referer防盗链,限制请求来源,使点播资源得到最基本的安全保障。
说明
当前Referer防盗链配置不支持带端口。
步骤1 登录视频点播控制台。
步骤2 在左侧导航栏选择“域名管理”,进入域名管理界面。
步骤3 单击域名右侧“配置 ”,在“防盗链”页签单击“Referer防盗链”。
步骤4 在弹出的配置框中打开“开关”,并配置相关参数。
最佳实践 4 通过防盗链控制音视频的播放权限
● 类型:支持黑名单和白名单模式。
– Referer黑名单:表示仅名单内的域名不允许访问点播资源,其它可以访问。
若同时勾选了“包含空Referer”,则表示不允许HTTP Header中Referer为空 的请求。
– Referer白名单:表示仅名单内的域名允许访问点播资源,其它不可以访问。
若同时勾选了“包含空Referer”,则表示允许HTTP Header中Referer为空的 请求。
● 规则:名单详情,最多支持4级域名,最多支持100条,以英文“;”分隔。域名、
IP地址可混合输入,支持泛域名添加。域名前不能带协议名(http://和 https://)。
示例:www.example.com;*.test.com;192.168.0.0 步骤5 单击“确定”,完成配置。
大约需要3-5分钟,Referer防盗链才生效。
----结束
配置 Key 防盗链
为点播资源配置Key防盗链,通过鉴权URL的时效性来进一步加强点播资源的安全。
步骤1 登录视频点播控制台。
步骤2 在左侧导航栏选择“域名管理”,进入域名管理界面。
步骤3 单击域名右侧“配置 ”,在“防盗链”页签选择“Key防盗链”。
步骤4 在弹出的配置框中打开“防盗链开关”,并配置相关参数。
最佳实践 4 通过防盗链控制音视频的播放权限
表4-1 参数说明
参数 描述说明
密钥值 即Key值,单击“生成”,可自动生成符合格式的密钥值。
误差允许时间 表示当前防盗链有效时间,默认为120分钟。
示例:若鉴权URL生成时间为1573806090(2019/11/15 16:21:30),配置的“误差允许时间”为120分钟,则鉴权 URL的失效时间为2019/11/15 18:21:30。
旧key的失效时间 采用新Key时,旧Key值的失效时间,从新Key生效时开始计 算,默认60分钟后失效。
示例:若新Key生效时间为2019/11/15 16:21:30,配置的“旧 Key的失效时间”为60分钟,则旧鉴权URL的真正失效时间为 2019/11/15 17:21:30。
算法 加密算法,支持ABCD四种算法,默认为算法D。选择的算法 不同,生成的鉴权URL也是不同的,具体的生成规则可参考
Key防盗链。
说明算法ABC暂不支持HLS和DASH播放场景,建议使用算法D。
步骤5 单击“确定”,完成参数配置。
步骤6 提交工单申请审核,提交的信息需要包含配置的域名,及表4-1中的信息。
审核通过后Key防盗链功能才会生效。若修改了Key防盗链的配置,也需重新提交工单 审核。
----结束
最佳实践 4 通过防盗链控制音视频的播放权限
验证防盗链功能
● 验证Referer防盗链
在Referer防盗链中配置的referer白名单为“www.huaweicloud.com”,且不勾选
“不包含空Referer”。在“http://www.example.com/test/test.html”网页中引 用点播服务中的视频文件“https://1280.cdn-vod.huaweicloud.com/input/
1.mp4”,访问该网页并播放视频,若播放失败则表示Referer防盗链生效。
● 验证Key防盗链
a. 登录视频点播控制台,在左侧导航树中选择“音视频管理”。
b. 在某个音视频行单击“管理”,选择“播放地址”页签,获取播放地址。
其中“地址”列为原始播放地址,单击 可获取鉴权播放地址。
c. 在播放器端分别播放原始播放地址和鉴权播放地址,若原始播放地址播放失 败,鉴权播放地址播放成功,则表示Key防盗链生效。
最佳实践 4 通过防盗链控制音视频的播放权限
5 通过 HLS 加密防止视频泄露
场景说明
使用防盗链机制可以控制播放行为,避免非授权用户通过播放URL下载或播放点播视 频,但无法阻止恶意的付费用户将视频下载到本地后进行二次分发。
为了有效防止视频泄露和盗链问题,华为云视频点播提供了对HLS视频内容进行加密 的能力。加密后的视频,即使恶意用户下载也无法分发给其他人观看。HLS加密涉及 到业务侧的密钥服务和Token生成服务的搭建,所以本方案主要适用于能自行搭建一套 完整的鉴权及密钥管理服务的业务侧。
实现原理
华为云视频点播提供的HLS加密使用的HLS规范中的通用加密方案,通过指定的 AES-128加密算法来加密每一个TS,并在生成的m3u8文件中描述播放器如何解密TS文 件的方法,支持所有的HLS播放器。
本方案中,点播服务集成了华为云的KMS,向HLS加密提供密钥。
● 加密流程
a. 业务侧将视频上传到点播服务(VOD)后,请求HLS加密。
b. 点播服务收到加密请求后,向KMS请求加密密钥,并将获取的密钥ID和密钥 密文存储在点播服务中。
c. 点播服务向媒体处理服务请求HLS加密,媒体处理服务通过转码功能将对应 的视频进行加密。
转码加密后生成的m3u8文件带有“#EXT-X-KEY”标签,该标签包含了
“METHOD”和“URI”属性,其中“URI”即为业务侧搭建的密钥管理服务 的地址,示例如下所示。
最佳实践 5 通过 HLS 加密防止视频泄露
说明
若加密后使用的播放地址是https,则秘钥管理服务的地址也需要配置为https协议,
否则无法在点播控制台预览播放。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://domain-sample/encrypt/get-key?
asset_id=6aee80009c4ca6970f508d6334194794",IV=0x80a3ff24ccd788042ca7f2237e74c59d
#EXTINF:5.000000, 6aee80009c4ca6970f508d6334194794_1_1920X1080_3000_0_0.ts
#EXTINF:5.000000, 6aee80009c4ca6970f508d6334194794_1_1920X1080_3000_0_1.ts
#EXT-X-ENDLIST
d. 加密后,点播服务通过CDN将加密的HLS视频文件进行加速分发。
● 解密流程
a. 终端用户登录播放器终端,业务侧会对终端用户进行身份校验,校验通过 后,会为播放终端分配一个Token,并将带Token的播放地址返回给播放器 端。
示例:若转码加密后的HLS视频播放地址为:https://1280.cdn-
vod.huaweicloud.com/input/test.m3u8,则播放器终端获取的播放地址为:
https://1280.cdn-vod.huaweicloud.com/input/test.m3u8?token={token}
b. 播放器终端通过带Token的播放URL向CDN请求播放。由于Token是动态的,
所以CDN收到请求后,会直接回源到点播服务。点播服务会将请求URL中的 Token写入请求的m3u8文件的“URI”中。
点播服务返回给CDN的m3u8文件中会携带播放终端的Token值,示例如下所 示。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://domain-sample/encrypt/get-key?
asset_id=6aee80009c4ca6970f508d6334194794&token={token}",IV=0x80a3ff24ccd788042ca7f22 37e74c59d
#EXTINF:5.000000, 6aee80009c4ca6970f508d6334194794_1_1920X1080_3000_0_0.ts
#EXTINF:5.000000, 6aee80009c4ca6970f508d6334194794_1_1920X1080_3000_0_1.ts
#EXT-X-ENDLIST
c. 播放终端解析返回的m3u8文件,得到EXT-X-KEY标签中的“URI”内容,向
“URI”请求密钥。
d. 业务侧的密钥管理服务收到请求后,先验证Token的合法性,若Token合法,
则通过调用点播服务的API查询密钥。
密钥管理服务可以选择将查询到的密钥缓存在本地,当下次有其它播放终端 请求时,可以直接返回,无需每次都向点播服务获取。
e. 密钥管理服务将点播服务返回的密钥返回给播放终端。播放终端通过获取的 密钥解密播放m3u8文件。
搭建相关服务
若需要使用HLS加密功能,并实现解密播放功能,您需要在您的业务端服务器搭建密 钥管理服务和Token生成服务。
● 密钥管理服务,搭建的密钥管理服务需要具备如下功能,密钥管理服务示例代码 请参见示例代码。
– 支持身份鉴定:如实现原理中描述,密钥管理服务收到密钥请求时,需要验 证请求的Token是否合法。
最佳实践 5 通过 HLS 加密防止视频泄露
– 支持向点播服务获取密钥:HLS加密的原始密钥是存储在点播服务中的,因 此,密钥管理服务需要调用点播服务API,获取对应媒资的密钥。
– 支持缓存获取的密钥:为避免每次都从点播服务获取密钥,密钥管理服务应 该具备缓存功能,将获取的密钥进行缓存。
● Token生成服务:当终端用户登录您的播放终端时,您的业务侧服务应该对终端用 户的合法性进行校验,生成对应的Token,将带Token的播放地址返回播放器端。
Token生成示例代码请参见示例代码。
生成的Token需要包含大写字母、小写字母和数字,长度可自行限制。每一次登录 分配一个唯一的Token,且具备时效性。
说明
您可以根据实际需求,参考demo源码搭建符合业务需求的密钥管理服务和Token生成服务。
视频加密
步骤1 上传待加密的视频文件。
若待加密的视频还未上传,可以通过服务端上传(本地上传、OBS转存、OBS托管、
URL拉取四种媒资上传方法)、客户端上传、控制台上传等方式上传到点播服务中。
步骤2 配置获取解密密钥URL。
加密前,需要将搭建相关服务中搭建的密钥管理服务的地址配置到点播服务中,加密 时,将把该地址写入转码生成的m3u8文件中。
1. 登录视频点播控制台,在左侧导航树中选择“全局设置 > 安全设置”,进入安全 设置页面。
2. 单击“HLS加密设置”,在弹出框中输入搭建的密钥管理服务的URL。
示例:https://domain-sample/encrypt/get-key 3. 单击“确定”,完成配置。
步骤3 创建转码模板。
HLS加密是通过转码来实现的,所以在转码前,需要创建开启加密的转码模板。
1. 在左侧导航树中选择“全局设置 > 转码设置”,进入转码设置页面。
2. 单击“自定义转码模板组”,在新建议转码模板页面配置相关参数。
基本信息中“输出格式”选择“HLS”,打开“加密”开关,其它参数可以根据 实际需求配置,具体可参考转码设置。
3. 单击“确定”,完成HLS转码模板的配置。
步骤4 视频加密。
最佳实践 5 通过 HLS 加密防止视频泄露
1. 在左侧导航树中选择“音视频管理”,进入音视频管理页面。
2. 勾选需要HLS加密的视频,单击“转码”。
3. 在弹出框中选择步骤3中创建的转码模板,单击“确定”。
视频开始转码,当转码状态为“转码成功”时表示转码完成,即HLS加密完成。
----结束
视频播放
由于本方案采用的HLS标准加密,对于支持HLS协议播放的播放器都可以进行解密播 放。
1. 登录视频点播控制台,在左侧导航树中选择“音视频管理”,进入音视频管理页 面。
2. 在已经加密的视频行单击“管理”,选择“播放地址”页签。
3. 在对应的HLS格式行单击 ,播放HLS视频。
4. 打开浏览器的开发者模式,可以看到控制台在预览播放时有自动通过配置的获取 密钥URL去请求密钥,并解密播放。
示例代码
密钥管理和Token生成服务的完整Demo源码请参见HLS加密Demo。
● 密钥管理服务示例代码
示例中采用UUID方式生成Token,您也可以自行选择生成方式。此外,示例代码 中未包含登录终端用户的合法性校验,若有需要,您也可以自行实现。
密钥管理服务收到密钥请求时,会先查看缓存中是否保存该媒资的解密密钥,若 没有,则调用点播服务端SDK查询密钥。
import java.util.Base64;
import java.util.UUID;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.huawei.kms.initvodclient.VodClientFactory;
import com.huawei.kms.util.CacheUtils;
import com.huaweicloud.sdk.vod.v1.model.ShowAssetCipherRequest;
import retrofit2.http.Header;
@RestController
public class KeyManagerController { /**
* 给合法客户端分配token并返回带token的播放url
最佳实践 5 通过 HLS 加密防止视频泄露
*
* @param accessToken 终端携带的鉴权信息,这里需要校验身份信息是否合法 * @param playUrl 播放url
* @return 返回带token的播放url */
@GetMapping("/get-url")
public String getTokenPlayUrl(@Header("access-token") String accessToken, @RequestParam(value = "play_url", required = true) String playUrl) { // 给合法终端分配token, 这里以uuid为例
String token = UUID.randomUUID().toString().replace("-", "");
// 构造带token的play_url并返回, http://{domain}/asset/{asset_id}/play_video/index.m3u8?
token={token}
return playUrl.substring(0, playUrl.lastIndexOf("/") + 1) +
playUrl.substring(playUrl.lastIndexOf("/") + 1) + "?token=" + token;
}
/**
* @param asset_id 媒资id
* @param token 给终端分配的token,这里需要校验token是否合法,只给校验通过的终端返回秘钥 * @param response
* @return 返回字节数组类型的秘钥 */
@GetMapping(value = "/get-key",headers = "Accept=application/octet-stream") public byte[] getKey(@RequestParam(value = "asset_id", required = true) String asset_id, @RequestParam(value = "token", required = true) String token, HttpServletResponse response) {
// 获取密钥,先从缓存中获取,假如不存在,再从点播服务获取。这里以本地缓存为例,用户可以自 行选择缓存方式,比如存在缓存数据库
String key = CacheUtils.getCipherFromCache(asset_id);
if (StringUtils.isEmpty(key)) {
ShowAssetCipherRequest request = new ShowAssetCipherRequest();
request.withAssetId(asset_id);
key = VodClientFactory.getClient().showAssetCipher(request).getDk();
// 跨域放通,填写实际的站点或填写“*”
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Content-Length", "16");
// 设置返回秘钥的数据类型
response.setHeader("Content-Type", "application/octet-stream");
// 更新缓存
CacheUtils.updateCipherFromCache(asset_id, key);
}
return Base64.getDecoder().decode(key);
} }
● 获取VodClient示例代码
import com.huaweicloud.sdk.core.auth.BasicCredentials;
import com.huaweicloud.sdk.core.auth.ICredential;
import com.huaweicloud.sdk.vod.v1.VodClient;
import com.huaweicloud.sdk.vod.v1.region.VodRegion;
public class VodClientFactory {
private final static String AK ="********";
private final static String SK ="**************";
private final static String REGION="cn-north-4"; // 服务实际节点,如cn-north-1,cn-east-2 private static volatile VodClient vodClient = null;
public static VodClient getClient() { if (vodClient == null) {
synchronized (VodClient.class) { if (vodClient == null) {
ICredential auth = new BasicCredentials() .withAk(AK)
.withSk(SK);
vodClient = VodClient.newBuilder().withCredential(auth) .withRegion(VodRegion.valueOf(REGION)) .build();
最佳实践 5 通过 HLS 加密防止视频泄露
} } }
return vodClient;
} }
● 缓存示例代码
密钥管理服务从VOD中获取到解密密钥后,需要将密钥缓存下来,避免同一媒资 重复请求VOD获取。示例中采用本地缓存方式,您也可以选择数据库方式缓存。
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;
public class CacheUtils {
private static Cache<String, String> cipherCache = CacheBuilder.newBuilder() .maximumSize(100) // 设置缓存的最大容量
.expireAfterWrite(10, TimeUnit.MINUTES) // 设置缓存在写入一分钟后失效 .concurrencyLevel(10) // 设置并发级别为10
.recordStats() // 开启缓存统计 .build();
public static String getCipherFromCache(String key) { return cipherCache.getIfPresent(key);
}
public static void updateCipherFromCache(String key, String value) { cipherCache.put(key, value);
} }
● 密钥编解码示例代码
获取的密钥需要使用标准Base64编解码。
/** * 标准Base64编解码,具体规范请参见相关文档。
* @author * @version 1.0 */public class Base64 {
/** Base64编码表。*/
private static char base64Code[] = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',};
/** Base64解码表。*/
private static byte base64Decode[] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1,
-1, // 注意两个63,为兼容SMP,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 63, -1,
63, // “/”和“-”都翻译成63。
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, // 注意两个0:
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, // “A”和“=”都翻译成0。
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,};
最佳实践 5 通过 HLS 加密防止视频泄露
/**
* 构造方法私有化,防止实例化。
*/
private Base64() {
super();
} /**
* Base64编码。将字节数组中字节3个一组编码成4个可见字符。
* @param bytes 需要被编码的字节数据。
* @return 编码后的Base64字符串。
*/
public static String encode(byte[] bytes) {
int a = 0;
// 按实际编码后长度开辟内存,加快速度
StringBuffer buffer = new StringBuffer(((bytes.length - 1) / 3) << 2 + 4);
// 进行编码
for (int i = 0; i < bytes.length; i++) {
a |= (bytes[i] << (16 - i % 3 * 8)) & (0xff << (16 - i % 3 * 8));
if (i % 3 == 2 || i == bytes.length - 1) {
buffer.append(Base64.base64Code[(a & 0xfc0000) >>> 18]);
buffer.append(Base64.base64Code[(a & 0x3f000) >>> 12]);
buffer.append(Base64.base64Code[(a & 0xfc0) >>> 6]);
buffer.append(Base64.base64Code[a & 0x3f]);
a = 0;
} }
// 对于长度非3的整数倍的字节数组,编码前先补0,编码后结尾处编码用=代替,
// =的个数和短缺的长度一致,以此来标识出数据实际长度 if (bytes.length % 3 > 0)
{
buffer.setCharAt(buffer.length() - 1, '=');
}
if (bytes.length % 3 == 1) {
buffer.setCharAt(buffer.length() - 2, '=');
}
return buffer.toString();
} /**
* Base64解码。
* @param str 用Base64编码的ASCII字符串 * @return 解码后的字节数据
*/
public static byte[] decode(String str) {
// 检查参数合法性 if (str == null) {
return null;
}
int length = str.length();
if (length % 4 != 0) {
throw new IllegalArgumentException("Base64 string length must be 4*n");
}
if (str.length() == 0) {
return new byte[0];
最佳实践 5 通过 HLS 加密防止视频泄露
}
// 统计填充的等号个数 int pad = 0;
if (str.charAt(length - 1) == '=') {
pad++;
}
if (str.charAt(length - 2) == '=') {
pad++;
}
// 根据填充等号的个数来计算实际数据长度 int retLen = length / 4 * 3 - pad;
// 分配字节数组空间
byte[] result = new byte[retLen];
// 查表解码
char ch1, ch2, ch3, ch4;
int i;
for (i = 0; i < length; i += 4) {
int j = i / 4 * 3;
ch1 = str.charAt(i);
ch2 = str.charAt(i + 1);
ch3 = str.charAt(i + 2);
ch4 = str.charAt(i + 3);
int tmp = (Base64.base64Decode[ch1] << 18) | (Base64.base64Decode[ch2] << 12) | (Base64.base64Decode[ch3] << 6) | (Base64.base64Decode[ch4]);
result[j] = (byte) ((tmp & 0xff0000) >> 16);
if (i < length - 4) {
result[j + 1] = (byte) ((tmp & 0x00ff00) >> 8);
result[j + 2] = (byte) ((tmp & 0x0000ff));
} else {
if (j + 1 < retLen) {
result[j + 1] = (byte) ((tmp & 0x00ff00) >> 8);
}
if (j + 2 < retLen) {
result[j + 2] = (byte) ((tmp & 0x0000ff));
} } }
return result;
} }
最佳实践 5 通过 HLS 加密防止视频泄露
6 如何对音视频内容进行审核?
场景说明
随着视频业务广泛应用到各平台中,视频内容审查已然成为重点关注的问题。特别是 在UGC场景,若视频平台未对用户自由上传的视频内容进行违规审核,则将会给平台 带来多方面的伤害。
为了满足视频业务对音视频的审核需求,华为云视频点播服务提供了审核功能,支持 对上传的音视频进行涉黄、涉恐、涉政审查,您可以及时下线违规的音视频,避免或 减少对外发布后造成的不良影响。
华为云视频点播服务提供了两种音视频审核模式:·
● 先发后审模式:音视频上传后先发布,其“媒资状态”为“已发布”,音视频可 以正常播放或预览,审核发现违规内容后再屏蔽。
● 先审后发模式:音视频上传后不发布,其“媒资状态”为“未发布”,音视频必 须经过审核并通过后,才可以在控制台以外的播放器被播放。该模式暂不支持通 过调用API实现。
审核流程
图6-1 审核流程
● 智能审核:在点播音视频审核模块中,提供了基于文本、封面、截图的智能鉴 黄、鉴恐、鉴政服务,默认为未开启状态。开启智能鉴黄、鉴恐、鉴政功能后,
针对已上传的音视频,会自动识别其合法性,如果有违规涉黄、涉恐、涉政的文 字描述或者画面,会在审核时标识,从而加快审核效率。对于视频文件和音视频 文件,智能审核的内容是有区别的,具体如下:
– 视频文件:审核范围包括封面、标题、视频描述、视频画面。
– 音频文件:审核范围包括标题、音频描述、封面。
● 人工审核:在音视频审核详情中,针对发现疑似有问题的音视频进行再审查,确 认存在问题后可以对音视频进行“屏蔽”或“通过”操作。
● 屏蔽:已屏蔽的媒资的状态会转为“未发布”,未发布状态的媒资只能通过控制 台预览,无法通过域名下载和播放,已被外网引用的播放地址也将无法播放。
最佳实践 6 如何对音视频内容进行审核?
先发后审模式
先发后审模式支持控制台、API和SDK方式。
控制台审核音视频
1. 在视频点播控制台使用本地上传、URL拉取、OBS托管方式上传音视频文件,上 传后,媒资状态默认为“已发布”。
2. 在视频点播控制台的“审核管理 > 审核设置”中配置审核模板。
3. 在视频点播控制台的“审核管理 > 音视频审核”中勾选需要审核的音视频,执行 审核操作,具体请参见音视频审核。
4. 审核后,您可以在音视频审列表中勾选审核未通过的音视频进行批量屏蔽。
调用API审核音视频
1. 调用媒资上传接口,上传音视频文件,并将请求参数“auto_publish”设置为
“1”,媒资上传后自动发布。
您可以使用上传方式、OBS转存方式或URL拉取方式接口创建媒资,其中上传方 式创建媒资可以参见示例2:媒资分段上传(20M以上)。
2. 配置音视频审核模板。
a. 登录视频点播控制台,在左侧导航树中选择“审核管理 > 审核设置”,进入 审核设置页面。
b. 在视频点播控制台的“审核管理 > 审核设置”中配置审核模板。
c. 可以将创建的审核模板设置为“默认”,并在音视频审核列表中获取对应的 模板ID。
3. 调用媒资审核接口,对步骤1中上传的音视频文件进行审核。
请求示例如下所示:
POST http/{endpoint}/v1.0/{project_id}/asset/review { "asset_id": "3e1cd21131a94525be55acf65888bf46", "review": {
"template_id": "c80e56dadb8542e8a1b7c2224dd6733a", } }
其中,“asset_id”为音视频上传后生成的媒资ID,“template_id”为步骤2.3中 获取的音视频审核ID。
4. 调用查询媒资详细信息接口获取审核结果,返回的“review_info”参数即为审核 结果。
5. 调用媒资发布取消接口将审核未通过的音视频取消发布,屏蔽成功后,对应的音 视频将无法在控制台以外的播放器中被播放。
使用SDK审核音视频
1. 调用媒资上传(本地上传、OBS转存、OBS托管、URL拉取)方法,上传音视频 文件,设置音视频上传后不自动发布。
req.setAutoPublish(1);
2. 调用视频审核方法,设置审核参数。
3. 调用查询媒资信息方法,查看审核结果。
最佳实践 6 如何对音视频内容进行审核?
4. 调用媒资发布取消方法将审核未通过的音视频取消发布,屏蔽成功后,对应的音 视频将无法在控制台以外的播放器中被播放。
先审后发模式
“先审后发模式”暂只支持API或者SDK方式。
调用API审核音视频
1. 调用媒资上传接口,上传音视频文件,并将请求参数“auto_publish”设置为
“0”,媒资上传后不自动发布。
您可以使用上传方式、OBS转存方式或URL拉取方式接口创建媒资,其中上传方 式创建媒资可以参见示例2:媒资分段上传(20M以上)。
2. 配置音视频审核模板。
a. 登录视频点播控制台,在左侧导航树中选择“审核管理 > 审核设置”,进入 审核设置页面。
b. 在视频点播控制台的“审核管理 > 审核设置”中配置审核模板。
c. 可以将创建的审核模板设置为“默认”,并在音视频审核列表中获取对应的 模板ID。
3. 调用媒资审核接口,对步骤1中上传的音视频文件进行审核。
请求示例如下所示:
POST http/{endpoint}/v1.0/{project_id}/asset/review { "asset_id": "3e1cd21131a94525be55acf65888bf46", "review": {
"template_id": "c80e56dadb8542e8a1b7c2224dd6733a", } }
其中,“asset_id”为音视频上传后生成的媒资ID,“template_id”为步骤2.3获 取的音视频审核ID。
4. 调用查询媒资详细信息接口获取审核结果,返回的“review_info”参数即为审核 结果。
5. 调用媒资发布接口将已审核通过的音视频进行发布,发布成功后,即可通过播放 器进行播放。
使用SDK审核音视频
1. 调用媒资上传(本地上传、OBS转存、OBS托管、URL拉取)方法,上传音视频 文件,设置音视频上传后不自动发布。
req.setAutoPublish(0);
2. 调用视频审核方法,设置审核参数即可。
3. 调用查询媒资信息方法,查看审核结果。
4. 调用媒资发布方法将已审核通过的音视频进行发布,发布成功后,即可通过播放 器进行播放。
最佳实践 6 如何对音视频内容进行审核?