-
场景说明目前视频点播已提供了丰富的音视频上传方式,如视频点播控制台的本地上传,URL拉取功能等。但若您已有大量的音视频文件存储在OBS桶中,希望使用视频点播的转码、截图、视频剪辑等功能对这些音视频进行处理。使用工具批量上传可以将音视频文件迁移到点播服务中,但这种方式会导致OBS和点播服务中分别存有相同的音视频文件,不仅造成额外的存储费用,且OBS桶中有新增音视频时,需要再次使用工具进行手动转存。为解决上述问题,视频点播提供了OBS音视频托管功能,源文件仍是存储在OBS桶中,授权托管给点播服务后,您可以直接在视频点播控制台对源文件进行处理,且处理后生成的相关媒资文件可以选择存储在点播服务或者自己的OBS桶中。本示例中我们将实现如下场景:“华北-北京四”的OBS桶中已存储了大量的音视频文件,先将现有的音视频同步到点播服务中,后续若有新的音视频文件增加,将自动同步到点播服务。使用点播服务处理音视频产生的相关媒资文件存储的“华北-北京四”的另一个OBS桶中,且存储路径与源文件的路径一致。处理流程在OBS托管前,需要将存储源文件的OBS桶、存储音视频处理后生成的相关媒资文件的OBS桶都授权给点播服务,允许点播服务访问对应的OBS桶。使用点播服务的存量托管功能将现有的音视频同步到点播服务。在点播服务中为存储源文件的OBS桶添加增量托管配置,允许OBS桶中的新增音视频自动同步到点播服务中。处理步骤OBS桶授权。登录视频点播控制台,在左上角确认区域是否是“华北-北京四”,若不是,切换区域。在左侧导航树中选择“音视频托管 > 桶授权”,进入桶授权页面。在对应的OBS桶行单击“授权”,完成桶授权。创建存量托管任务。源桶:需要被托管的OBS桶。源范围:OBS桶托管的范围,支持对整个桶的某些类型的音视频进行托管,也可以选择托管某个目录或者是某个音视频文件。音视频处理:选择是否在托管后,对音视频进行转码或通过工作流进行处理。输出存储位置:在点播服务中对托管的音视频进行处理后生成的媒资文件的存储位置,支持存储在点播和自己的OBS桶中,本示例选择“租户桶(输出同源)”,然后在“输出桶”中选择需要存储的OBS桶,在该桶中的存储路径与源文件路径相同。在左侧导航树中选择“音视频管理 > 存量托管”,进入存量托管页面。单击“创建任务”,在任务创建页面配置相关参数。单击“确定”,开始执行托管任务。当执行完成后,可以在“音视频管理”页面查看托管成功的音视频文件。添加增量托管配置。在左侧导航树中选择“音视频管理 > 增量托管”,进入增量托管页面。单击“添加配置”,在创建托管配置页面配置相关参数。相关配置参数与存量托管类似,但与存量托管不同,增量托管是针对整个桶进行托管,选择托管的文件类型后,若该OBS桶中有新增的对应类型的音视频文件,则将自动同步到点播服务中。配置完成后,单击“确定”。配置添加后即时生效,您可以通过在该托管的OBS桶中上传音视频文件进行验证。更多详情请参见:https://support.huaweicloud.com/vod/index.html
-
A服务和B服务都对接了CSE,A服务通过CSE的RestTemplate调用B服务的接口,响应报错:com.huawei.mpe.domain.CreateTaskRsp cannot be cast to com.huawei.vod.retrofit.api.mpe.CreateEditTaskRspcom.huawei.mpe.domain.CreateTaskRsp是A服务接收B服务的响应。com.huawei.vod.retrofit.api.mpe.CreateEditTaskRsp是B服务的响应。假如要严格按照类名整改,工作量非常大,体验很差。有没有其他解决方式?
-
尊敬的华为云客户:华为云对视频直播、视频点播按需(含流量、日峰值带宽、存储空间)、流量包、存储包资源的价格进行降价,新价格于2019/08/01 00:00(北京时间)正式生效,生效后视频直播、视频点播按需(含流量和日峰值带宽)、流量包、存储包资源新购、续费均按调整后价格收取费用。具体价格详情如下:视频直播:流量流量阶梯原价格(元/GB)调整后价格(元/GB)0~10TB(含)0.270.2310~50TB(含)0.260.250~100TB(含)0.240.17100TB~1PB(含)0.210.15大于1PB0.170.12日峰值带宽日峰值带宽阶梯原价格(元/Mbps/日)调整后价格(元/Mbps/日)0~100Mbit/s(含)0.730.64100~500Mbit/s(含)0.690.61500Mbit/s~5Gbit/s(含)0.660.585~20Gbit/s(含)0.630.56大于20Gbit/s0.60.55直播CDN流量包CDN流量包规格原套餐包价格(元)调整后套餐包价格(元)500 GB132104.51 TB268223.335 TB12801125.9310 TB25802269.4450 TB108009900200 TB37800297571 PB178800152250视频点播:流量流量阶梯原价格(元/GB)调整后价格(元/GB)0~10TB(含)0.240.210~50TB(含)0.230.1850~100TB(含)0.210.15100TB~1PB(含)0.180.13大于1PB0.150.11日峰值带宽日峰值带宽阶梯原价格(元/Mbps/日)调整后价格(元/Mbps/日)0~100Mbit/s(含)0.60.53100~500Mbit/s(含)0.590.52500Mbit/s~5Gbit/s(含)0.580.515~20Gbit/s(含)0.560.5大于20Gbit/s0.540.49视频存储空间存储阶梯调整后价格(元/GB/月)调整前价格(元/GB/月)0~50 GB(含)00大于50 GB0.0990.1512点播CDN流量包CDN流量包规格调整后价格(元)调整前价格(元)500GB951201TB1902285TB950108010TB1900216050TB90009600200TB22890277001PB105000115700视频存储包存储包规格调整后价格(元)原价格(元)100GB81.00无500GB405.00720.001TB828.001,440.005TB4,104.00无20TB16,425.00无100TB81,288.00无具体价格请在新价格生效后参考产品的计费详情页。如您有任何问题,可随时通过工单或者服务热线(950808)与我们联系。感谢您对华为云的支持!感谢您对华为云的支持!
-
场景说明使用防盗链机制可以控制播放行为,避免非授权用户通过播放URL下载或播放点播视频,但无法阻止恶意的付费用户将视频下载到本地后进行二次分发。为了有效防止视频泄露和盗链问题,华为云视频点播提供了对HLS视频内容进行加密的能力。加密后的视频,即使恶意用户下载也无法分发给其他人观看。HLS加密涉及到业务侧的密钥服务和Token生成服务的搭建,所以本方案主要适用于能自行搭建一套完整的鉴权及密钥管理服务的业务侧。实现原理华为云视频点播提供的HLS加密使用的HLS规范中的通用加密方案,通过指定的AES-128加密算法来加密每一个TS,并在生成的m3u8文件中描述播放器如何解密TS文件的方法。支持所有的HLS播放器,您可以选择华为云提供的视频点播播放器或者开源播放器。本方案中,点播服务集成了华为云的KMS,向HLS加密提供密钥。加密流程业务侧将视频上传到点播服务(VOD)后,使用转码功能对上传的视频进行HLS加密。点播服务收到加密请求后,向KMS请求加密密钥,并将获取的密钥ID和密钥密文存储在点播服务中。点播服务向媒体处理服务请求HLS加密,媒体处理服务通过转码功能将对应的视频进行加密。转码加密后生成的m3u8文件带有“#EXT-X-KEY”标签,该标签包含了“METHOD”和“URI”属性,其中“URI”即为业务侧搭建的密钥管理服务的地址,示例如下所示。#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加密后,点播服务通过CDN将加密的HLS视频文件进行加速分发。解密流程终端用户登录播放器终端,业务侧会对终端用户进行身份校验,校验通过后,会为播放终端分配一个Token,并将带Token播放地址返回给播放器端。若转码加密后的HLS视频播放地址为:https://1280.cdn-vod.huaweicloud.com/input/test.m3u8,则播放器终端获取的播放地址为:https://1280.cdn-vod.huaweicloud.com/input/{token}/test.m3u8播放器终端通过带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=0x80a3ff24ccd788042ca7f2237e74c59d #EXTINF:5.000000, 6aee80009c4ca6970f508d6334194794_1_1920X1080_3000_0_0.ts #EXTINF:5.000000, 6aee80009c4ca6970f508d6334194794_1_1920X1080_3000_0_1.ts #EXT-X-ENDLIST播放终端解析返回的m3u8文件,得到EXT-X-KEY标签中的“URI”内容,向“URI”请求密钥。业务侧的密钥管理服务收到请求后,先验证Token的合法性,若Token合法,则通过调用点播服务的API查询密钥。密钥管理服务可以选择将查询到的密钥缓存在本地,当下次有其它播放终端请求时,可以直接返回,无需每次都向点播服务获取。密钥管理服务将点播服务返回的密钥返回给播放终端。播放终端通过获取的密钥解密播放m3u8文件。准备工作若您需要使用HLS加密功能,并实现后续的解密播放功能,您需要做如下准备工作:搭建一个密钥管理服务,用于播放器播放HLS加密视频时向其获取解密密钥。由于点播服务不维护终端的身份信息,所以搭建的密钥管理服务需要有身份鉴定功能,对请求获取解密密钥的终端进行身份校验,仅向校验合法的终端返回解密密钥。其中返回密钥可参考返回密钥示例代码。搭建一个Token生成服务,当终端用户登录播放端时,Token生成服务在校验终端用户的合法性后,生成一个Token值,并将带Token播放地址返回给播放器端。生成的Token应该满足如下条件:Token为一字符串长度为32,可包含大写字母、小写字母、数字。保证为每个播放器终端的每一次登录分配一个唯一的Token,且具备时效性。加密步骤上传待加密的视频文件。若待加密的视频还未上传,可以通过服务端上传、客户端上传、控制台上传等方式上传到点播服务中。配置获取解密密钥URL。加密前,需要将搭建的密钥管理服务的地址配置到点播服务中。加密时,将把该地址写入转码生成的m3u8文件中。登录视频点播控制台,的左侧导航树中选择“全局设置 > 安全设置”,进入安全设置页面。单击“HLS加密设置”,在弹出框中输入搭建的密钥管理服务的URL。示例:https://domain-sample/encrypt/get-key?user={username}&pass={password}单击“确定”,完成配置。创建转码模板。HLS加密是通过转码来实现的,所以在转码前,需要创建开启加密的转码模板。在左侧导航树中选择“全局设置 > 转码设置”,进入转码设置页面。单击“自定义转码模板组”,在新建议转码模板页面配置相关参数。基本信息中“输出格式”选择“HLS”,打开“加密”开关,其它参数可以根据实际需求配置,具体可参考转码设置。单击“确定”,完成HLS转码模板的配置。视频加密。在左侧导航树中选择“音视频管理”,进入音视频管理页面。勾选需要HLS加密的视频,单击“转码”。在弹出框中选择步骤3中创建的转码模板,单击“确定”。视频开始转码,当转码状态为“转码成功”时表示转码完成,即HLS加密完成。验证加密播放视频加密完成后,我们可以直接在视频点播控制台验证加密播放。登录视频点播控制台,在左侧导航树中选择“音视频管理”,进入音视频管理页面。在已经加密的视频行单击“管理”,选择“播放地址”页签。在对应的HLS格式行单击,播放HLS视频。打开浏览器的开发者模式,可以看到控制台在预览播放时有自动通过配置的获取密钥URL去请求密钥,并解密播放。图1您也可以参考如上步骤先获取播放地址,然后通过视频云APP Demo验证HLS加密播放。返回密钥示例代码业务侧的密钥管理服务向播放终端返回密钥时,需要返回必要的响应头,如下所示:Access-Control-Allow-Origin (跨域访问):填写播放器实际站点,测试阶段可填写“*”,不能为空。如果播放器站点跟获取密钥的站点一样,则不涉及跨域,可不填写。建议始终填写。Content-Length(密钥长度): 固定为16。Content-Type (密钥数据类型):填写application/octet-stream。示例代码如下所示 :import org.apache.logging.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import javax.servlet.ServletRequest;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.validation.constraints.NotNull;@Controller@RequestMapping( value = {"/test"})public class TestGetKey { @RequestMapping( value = {"/{project_id}/asset/get_key"}, method = {RequestMethod.GET} ) @ResponseBody public byte[] getKey(@NotNull @PathVariable("project_id") String project_id, @NotNull @RequestParam(value = "asset_id",required = true) String asset_id, HttpServletResponse response) { QueryCipherRsp cipher = null; cipher = /*此处通过VOD API或SDK获取cipher*/; String key = cipher.getDk(); /*DK是经过了Base64编码的密钥明文*/ response.setHeader("Access-Control-Allow-Origin", "*"); /* 跨域放通,填写实际的站点或填写“*” */ response.setHeader("Content-Length", 16); response.setHeader("Content-Type", "application/octet-stream"); return Base64.decode(key); /*Base64解码,编解码代码请参考如下代码示例*/ }}其中“cipher ”可通过点播服务的查询密钥接口或服务端SDK查询获取。标准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,}; /** * 构造方法私有化,防止实例化。 */ 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 << (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]; } // 统计填充的等号个数 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; }}更多详情请参见:https://support.huaweicloud.com/vod/index.html
-
场景说明随着视频点播存储视频文件量的增加,设置视频封面不仅能提升展示的美观性,还能方便通过封面查找相关视频。同时,上传的视频封面也将会生成对应的封面地址,实现加速分发,可以直接将封面与视频文件一同引用到网页中。上传视频时,点播服务会默认截取视频的第一帧作为封面图片。您也可以通过上传图片或截图封面来更新视频的封面。上传封面:适用于需要通过封面表达视频的大概内容及重点的场景。在上传前,您需要提前线下设计一张JPG或PNG格式的封面图片。截图封面:适用于希望将视频中的某个瞬间画面来设置成封面的场景。无需要额外准备工作,您可以直接使用视频点播的截图功能生成。您可以通过以下三种方式来自定义视频封面:控制台设置视频封面调用API设置视频封面使用SDK设置视频封面控制台设置视频封面在视频点播控制台的音视频管理中上传封面图片。登录视频管理控制台,在左侧导航栏选择“音视频管理”,进入音视频管理页面。在需要上传封面的视频行单击“管理”,在“基本信息”页签单击“编辑”。单击添加框,上传本地的封面图片,上传完成后单击“保存”即可。在视频截图中,可以先对视频进行截图,然后选择某一张截图作为封面。支持截图的视频格式有FLV、MP4、TS、MOV、MXF、MPG、WMV、AVI、M4V、F4V和MPEG。登录视频管理控制台,在左侧导航栏选择“视频处理 > 视频截图”,进入视频截图页面。勾选需要截图的视频,单击“截图”,在弹出的截图设置框中设置截图参数。按时间间隔:根据设置的时间间隔,从视频首帧开始截图,以最后一帧截图结束,最大间隔不能超过12秒。可选择是否将首帧截图作为视频封面。指定时间点:根据设置指定时间从视频中截取图片,最多可设置10个时间点。可选择是否将某张截图作为视频封面。单击“确定”,视频开始截图。截图完成后,单击“详情”,可以在详情页面中选择某一张截图作为封面。调用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,然后调用设置封面接口修改截图封面。使用SDK设置视频封面视频点播提供了JAVA和GO两个版本的服务端SDK,对API接口进行了封装,您可以在SDK开发者中心下载对应SDK,然后进行集成开发。视频上传时设置封面JAVA SDK提供了上传、OBS转存、OBS托管、URL拉取四种媒资上传方法,可以在对应的方法中上传本地图片设置封面,或者截图设置封面。GO SDK暂只提供了上传和OBS转存两种视频上传方法,可以在对应的方法中上传本地图片设置封面,或者截图设置封面。视频更新时设置封面JAVA SDK和GO SDK支持在视频上传完成后,可以调用视频更新方法时上传本地图片,更新视频封面。视频处理时设置封面JAVA SDK和GO SDK支持在视频上传完成后,可以调用音视频方法时设置截图参数,选择某张截图作为视频封面。
-
尊敬的华为云客户:华为云对视频点播转封装功能进行价格调整,新价格于2019/04/27 00:00(北京时间)正式生效,生效后如果您使用转封装功能均按需计费,请您确保账户余额充足,避免欠费影响服务使用。具体价格详情如下:服务按需计费项调整前调整后视频点播转封装0元/分钟0.007元/分钟如您有任何问题,可随时通过工单或者服务热线(4000-955-988)与我们联系。感谢您对华为云的支持!https://www.huaweicloud.com/notice/2018/20190419115323993.html
-
Referer防盗链是通过添加Referer黑名单或白名单来过滤访问者的请求,但是,我们知道Referer内容是可以伪造,所以为了更有效的保护点播资源不被非法盗用,我们需要采用Key防盗链方式,华为视频点播云服务的Key防盗链提供了ABCD四种加密算法,您可以选择实际需求选择配置。如何配置视频点播的Referer防盗链呢?且看视频解说->更多指导请参见视频点播帮助中心:https://support.huaweicloud.com/usermanual-vod/vod010014.html【小肆说视】上期回顾2019年第1期 Demo APP带你体验视频云服务2019年第2期 视频解说转码模板配置 2019年第3期 视频解说上传视频2019年第4期 视频解说Referer防盗链配置【小肆说视】下期预告 2019年第5期 视频解说媒体转码服务
-
Referer防盗链是对HTTPS播放请求消息进行Referer参数校验,开发者可以设置域名或者IP地址为黑名单或者白名单,CDN节点将识别访问者的身份是否满足黑白名单设置,符合规则的请求可以访问点播的视频文件;如果不符合规则,则返回“403 Forbidden”的信息。如何配置视频点播的Referer防盗链呢?且看视频解说->更多指导请参见视频点播帮助中心:https://support.huaweicloud.com/usermanual-vod/vod010013.html【小肆说视】上期回顾2019年第1期 Demo APP带你体验视频云服务2019年第2期 视频解说转码模板配置 2019年第3期 视频解说上传视频【小肆说视】下期预告(视频点播)2019年第5期 视频解说Key防盗链配置
-
视频点播服务支持上传MP4,TS,MOV,MXF,MPG,FLV,WMV,AVI,M4V,F4V,MPEG (其中AVI,M4V,F4V,MPEG视频格式正在公测中)等格式的视频文件;支持MP3,OGG,WAV,WMA,APE,FLAC,AAC,AC3,MMF,AMR,M4A,M4R,WV,MP2等格式的音频文件。您还可以在上传时对上传的视频文件进行转码或添加水印。如何上传各种格式的音视频?且看视频解说->更多指导请参见视频点播帮助中心:https://support.huaweicloud.com/usermanual-vod/zh-cn_topic_0128969730.html【小肆说视】上期回顾2019年第1期 Demo APP带你体验视频云服务2019年第2期 视频解说转码模板配置 【小肆说视】下期预告(视频点播)2019年第4期 视频解说Referer防盗链配置2019年第5期 视频解说Key防盗链配置
-
下载phpdemo算是跑起来了,现在就要考虑租户系统如自身验证token的问题了。1、先介绍下我的代码目录2、文件执行的时序图和流程图2、代码demotest.php<?php function curl_request($url,$post='',$cookie='', $returnCookie=0){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_AUTOREFERER, 1); curl_setopt($curl, CURLOPT_REFERER, "http://XXX"); if($post) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post)); } if($cookie) { curl_setopt($curl, CURLOPT_COOKIE, $cookie); } curl_setopt($curl, CURLOPT_HEADER, $returnCookie); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); if (curl_errno($curl)) { return curl_error($curl); } curl_close($curl); if($returnCookie){ list($header, $body) = explode("\r\n\r\n", $data, 2); preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches); $info['cookie'] = substr($matches[1][0], 1); $info['content'] = $body; return $info; }else{ return $data; } } if(empty($_GET['token'])){ die('您非法访问'); } $param=array( 'token'=>$_GET['token'] ); $result=curl_request("http:/xxxxxx/ckparams.php",$param); if (!empty($result)){ $vodRsp = json_decode($result,false); $status=$vodRsp->status; $code=$vodRsp->code; if($code!=='1001'){ echo "非法访问".$code; } }else{ echo '请求参数错误'; die; } $urlToken=$status; ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="chrome=1,ie=edge"> <!--[if lt IE 9]> <script src="http://media-cache.huaweicloud.com/video/hwplayer/0.0.6/lib/video-js-5.20.5/ie8/videojs-ie8.min.js?ttl=82052934"> </script> <![endif]--> <script src="http://media-cache.huaweicloud.com/video/hwplayer/0.0.6/dist/hwplayer.js?ttl=82052934"></script> </head> <body> <video controls id="test" width="480" height="300" class="video-js vjs-default-skin vjs-big-play-centered"> </video> <script> hwplayerloaded(function () { var player = new HWPlayer("test",{ width: 480, height: 300, controls: true },function(){ alert(1111); }); player.src( { src:'https://613.cdn-vod.huaweicloud.com/asset/65252102f1de7c4011c969dc803f2e58/play_video/<?php echo $urlToken;?>/index.m3u8', type: "application/x-mpegURL" } ); player.play(); }); </script> </body> getkey.php <?php function convertUrlQuery($query) { $queryParts = explode('&', $query); $params = array(); foreach ($queryParts as $param) { $item = explode('=', $param); $params[$item[0]] = $item[1]; } return $params; } function getToken(){ $url ='https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $url = parse_url($url); $param_arr =convertUrlQuery($url['query']); return $param_arr['token']; } function curl_request($url,$post='',$cookie='', $returnCookie=0){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_AUTOREFERER, 1); curl_setopt($curl, CURLOPT_REFERER, "http://XXX"); if($post) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post)); } if($cookie) { curl_setopt($curl, CURLOPT_COOKIE, $cookie); } curl_setopt($curl, CURLOPT_HEADER, $returnCookie); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); if (curl_errno($curl)) { return curl_error($curl); } curl_close($curl); if($returnCookie){ list($header, $body) = explode("\r\n\r\n", $data, 2); preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches); $info['cookie'] = substr($matches[1][0], 1); $info['content'] = $body; return $info; }else{ return $data; } } $keyTokenCheck=getToken(); //file_put_contents("token.txt",$keyTokenCheck); if(empty($keyTokenCheck)){ die; } $param=array( 'token'=>$keyTokenCheck ); $result=curl_request("http://xxxxxx/ckplaytoken.php",$param); if(!empty($result)){ $rs=json_decode($result,false); $code=$rs->code; $status=$rs->status; if($code!=='1001'){ die; }else{ $key=file_get_contents("key.map"); if($key){ echo $key; }else{ /** * 查询媒资密钥 */ require './cloudvod/vod/service/AssetService.php'; require './cloudvod/vod/model/QueryAssetCiphersReq.php'; $req = new QueryAssetCiphersReq(); $req ->setAssetId('34345345345'); $rsp = ""; try { $rsp = AssetService::QueryAssetCiphers($req); $rspp=json_decode($rsp->getBody()); $finalKey=base64_decode($rspp->dk); file_put_contents("key.map",$finalKey); echo $finalKey; } catch (Exception $e) { echo $e; } } } } ckparams.php <?php function checkAccessToken(){ //查询传过来的token是否在表中存在,且为0,表明已经合法 //userid、accessPageToken、playUrlToken,status,playStatus 0,1主要核对表中的token的status状态0不对,1正确, return true; } if(checkAccessToken()){ $result=array( 'code'=>'1001', //这了自己改 'status'=>md5('234567') ); }else{ $result=array( 'code'=>'1002', 'status'=>"访问非法.." ); } //将md5的id加固定456字符串存入playUrlToken中 //更改这个token对应的status,最后改变status位1,表明此次完毕 echo json_encode($result); ?> ckplaytoken.php <?php //将传过来的32位token,在表中查找,存在且为0,表示合法 $result=array( 'code'=>'1001' ); //返回之前将playStatus改为1 echo json_encode($result); ?>3、坑和期间可能出现的问题、待续
-
尊敬的华为云客户:华为云对视频直播截图功能、视频点播截图和标准音频转码功能、媒体转码截图功能进行价格调整,新价格于2019/01/15 00:00(北京时间)正式生效,生效后如果您使用截图、标准音频转码功能均按需计费,请您确保账户余额充足,避免欠费影响服务使用。具体价格详情如下:服务按需计费项调整前调整后视频直播截图0元/千张0.1元/千张视频点播截图0元/千张0.1元/千张视频点播标准音频转码时长0元/分钟0.0056元/分钟媒体转码截图0元/千张0.1元/千张如您有任何问题,欢迎您拨打华为云服务热线:4000-955-988。感谢您对华为云的支持!
-
背景:由于公司近期有视频点播的需求,且要求视频不能被盗链和下载,因此看了华为云视频服务中的文档后,觉得适合我们的需求。于是我看了所有的文档与相应的文档,包括java的sdk和php的sdk代码,经过一天的摸索,终于在前端页面看到了我要播放的视频。总体来说大致是这样几个步骤:1、全局设置选项里面设置转码模板,记得打开加密和视频格式HLS,其他随便选择。2、视频点播控制台上传视频,具体步骤参考相关官方文档。3、在视频管理选项里面点击转码,打开查看详情,此时请记住HLS的播放地址结尾为m3u8。4、全局设置-》安全设置-》HLS加密,填入一个自己服务器能访问的地址,功能是调用华为云点播接口,接口返回的数据为json格式,可以用json_decode转为数组,然后用base64.decode数组里面的明文值,这个值用echo输出,return没试过。5、视频管理-》选择视频的详情-》查看网页演示代码,将代码复制黏贴到自己的网站目录下。6、在网页的html中的js代码player.src后面地址改写成这样http://{domain}/asset/{asset_id}/play_video/{token}/index.m3u8,其中token为32位,前期跑demo的时候可以随便写一个。7、网页打开浏览既可以观看。总结:1、token只是用于客户端与自己服务器之间的合法性访问。2、华为云文档上说的秘钥说了一大堆,结果所有的工作都在web页面引入华为指定的js时已经完成了,无需关注。3、在设计上,秘钥接口不要频繁请求,官方文档里推荐把秘钥存入缓存,可以判断缓存里时候有秘钥,有的话直接返回,没有的就请求接口存入缓存;另外,秘钥的核对是华为云自动进行的,在播放视频时引入的华为云js会自动核验。因此,可以这样设计代码,以mvc为例:1、播放器页面的控制器生成token存入缓存中,并把token渲染在页面上的其他地方,播放器的播放地址此次的url中不包括token的字符串。2、播放器播放按钮点击,将在页面中的token上传到自己的服务器检验是否有效,如验证成功,将token拼接至url里,动态覆盖播放器的播放地址进行播放请求。3、代码见下一篇。
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
回顾中 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签