视频点播 VOD
视频点播 VOD
- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 快速入门
- 用户指南
- 最佳实践
- API参考
- 服务端SDK
-
常见问题
- 高频常见问题
- 产品咨询
-
购买计费
- 视频点播提供了哪些套餐包?如何使用?
- 如何查看点播套餐包的使用详情?
- 点播CDN流量包是什么?对计费模式是否有限制?
- 套餐包是否可以续费以及重复购买?
- 购买套餐包是否有地域限制?
- 购买的媒体处理服务的转码套餐包,能在视频点播的转码功能中使用吗?
- 购买了转码套餐包,为什么没有抵扣转码时长?
- 为什么充值后还是提示欠费?
- 购买了套餐包,为什么账户提示欠费?
- 日峰值带宽是如何计算的?如何计费的?
- 购买了H.265的转码套餐包,是否可以变更为H.264规格的?
- 购买的套餐包还未使用,是否可以申请退款?
- 按流量计费和按带宽计费有什么区别?
- 点播的CDN流量包是否可以和CDN的流量包通用?
- 点播套餐包过期了怎么办?
- 转码套餐包中的已使用时长是如何计算的?
- 账户欠费资源的保留期有多久?
- 点播服务不使用的情况下是否需要退订?
- 点播的视频流量是如何计费的?
- 视频转码一进多出是如何计费的?
- URL拉取是如何收费的?
- 如何计算点播CDN加速流量?
- 使用工作流是如何计费的?
- 通过同一终端ID重复观看某个视频,是否会重复计费?
- 音视频审核是否计费?
- 账单中产品为“点播录制”的费用项收取的是什么费用?
- 为什么流量包中的流量使用量与数据分析中的流量显示存在差别?
- 为什么CDN加速域名没有业务,却产生了流量费用?
- 权限管理
- 域名管理
- 消息订阅
-
上传问题
- 视频点播支持上传哪些格式的音视频文件?
- 视频点播有哪些音视频上传方式?
- 是否支持压缩上传视频文件?
- 单个视频文件大小的上传是否有限制?
- 视频点播对视频存储是否有限制?
- 视频文件名最大命名长度是多少?
- 视频上传时间过长怎么办?
- 为什么上传音视频后,无法获取到音视频的时长?
- 点播控制台是否支持断点续传?
- 如何避免上传重复文件?
- 视频点播的本地上传的存储和费用是什么样的?
- 为什么视频上传后,在控制台找不到了?
- 通过控制台上传,页面自动退出登录导致上传失败
- 音视频上传后,多久可以播放?
- 上传一个视频文件需要多久?
- 为什么无法上传媒资?
- 为什么在控制台上传封面后不显示?
- 点播视频是否支持微信小程序上传?
- 点播上传视频是否需要上传封面?
-
音视频处理问题
- 如何在本地查看视频详细信息?
- 如何为视频增加字幕?
- 如何在点播控制台导出全部音视频信息?
- 为什么在控制台的视频截图中无法看到所有上传的视频文件?
- 音视频管理中的时长是指转码时长还是片源时长?
- 视频点播是否有内置系统模板?
- 音视频转码支持哪些输入格式?
- 音视频转码支持哪些输出格式?
- 如何将视频转码成多种分辨率格式?
- 是否支持同时对一个视频使用多个转码模板进行转码?
- 转码成HLS格式,生成的索引文件是否会产生费用?
- 为什么转码输出的视频分辨率与转码模板设置的不一致?
- 为什么转码有时很快有时很慢呢?
- 视频转码输入分辨率是否支持8K?
- 转码会导致音视频文件的大小产生变化吗?
- 为什么删除媒资失败?
- 转码模板设置了三路输出,为什么实际只有两路输出?
- 点播服务是否支持转码回调?
- 为什么视频转码/切片后,时长与播放器中看到的时长不一致?
- CDN预热为什么会失败?
- 为什么无法删除水印模板?
- 如何实现对上传音视频进行先审后发?
-
播放问题
- 视频播放效果是否有地域上的区别?
- DASH、HLS和MP4格式有什么播放体验区别?
- 如何获取音视频文件的播放URL?
- 如何在移动端播放点播音视频?
- 视频点播控制台预览播放支持哪些格式?
- 复制HLS流播放URL到浏览器中无法播放
- 播放HLS格式视频卡顿怎么办?
- 上传的原始视频预览失败怎么办?
- 视频播放URL是否支持生成二维码?
- 视频上传后必须转码才能播放吗?
- 使用自有域名,为什么视频播放失败?
- 不购买转码套餐包,视频能播放吗?
- 为什么HLS加密视频播放失败?
- 点播服务是否对同时在线观看人数有限制?
- 为什么访问播放地址返回403?
- 可以使用自有播放器播放上传到点播的音视频吗?
- 点播服务生成的播放地址中可以替换成自有的域名?
- HLS加密视频播放模糊不清?
- 为什么无法获取已转码视频的播放地址?
- 为什么播放转码视频出现卡顿?
- key防盗链配置后,转码的m3u8格式的视频为什么播放不了?
- 使用HLS加密的视频二次转码后为什么无法播放?
- 为什么视频在电脑浏览器中可以正常播放,而手机端却无法播放?
-
API&SDK使用
- 如何获取临时AK/SK/securityToken?
- 为什么调用查询媒资信息接口返回的媒资时长为0?
- 调用点播API时返回“租户ID校验失败,请检查”
- 调用API删除媒资时返回“The throttling threshold has been reached”
- 调用CDN预热接口,返回成功是指预热成功吗?
- 密钥查询接口的调用频率超过100次/分钟怎么办?
- 处理媒资时,为什么提示“当前媒资或资源状态不支持该操作”?
- 服务端SDK有哪些版本?
- 为什么调用"查询指定媒资的详细信息"接口时,返回结果中的“source_path”和“output_path”参数为空?
- 调用SDK或API上传视频过程中取消上传,如何删除已经上传的分段视频?
- 调用api上传视频文件后,为什么无法获取封面?
- 如何设置AK/SK和securitytoken的有效期?
- 调用API上传水印图片后,为什么在控制台上无法预览?
- 安全类问题
- 统计分析
- 故障排除
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
SDK开发说明
V3版本SDK对点播服务提供的所有API进行了封装,您可以通过点播API Explorer调试接口。同时在代码示例处,会生成各种语言的demo供您参考。您也可以使用“SDK代码示例调试”,直接调试代码。
图1 API Explorer

媒资上传
当您需要使用服务端SDK上传本地媒资时,可参考《视频点播 API参考》中的应用示例1或应用示例2进行操作。其中,应用示例中对应的“创建媒资:上传方式”和“确认媒资上传”步骤,可参考SDK中的创建媒资:上传方式和确认媒资上传方法。在PUT媒资文件时,您可以使用HTTP PUT方式,将媒资文件PUT到对应的URL中即可。
生成鉴权URL
若您使用SDK时需要生成鉴权URL,可在点播控制台中使用Key防盗链算法生成,也可以参考以下Demo生成。
package AuthUrlDemo; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; class AuthUrlDemo { // url是未带加密信息的原始播放url, key是在点播控制台配置的Key值 // 加密算法A public static String createAuthInfoUrlByAlgorithmA(String url, String key) { try { checkParam(url, key); long timestamp = Instant.now().getEpochSecond(); String randUid = UUID.randomUUID().toString().replaceAll("-", ""); String uid = "0"; String tmpRandKey = timestamp + "-" + randUid + "-" + uid; URL originUrl = new URL(url); String string2Md5 = originUrl.getPath() + "-" + tmpRandKey + "-" + key; String md5Hash = DigestUtils.md5Hex(string2Md5.getBytes(StandardCharsets.UTF_8)); String authInfo = "auth_key=" + tmpRandKey + "-" + md5Hash; return StringUtils.isEmpty(originUrl.getQuery()) ? url + "?" + authInfo : url + "&" + authInfo; } catch (Exception e) { e.printStackTrace(); } return null; } // 加密算法B public static String createAuthInfoUrlByAlgorithmB(String url, String key) { try { checkParam(url, key); URL originUrl = new URL(url); String filePath = originUrl.getPath(); String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); String str2Md5 = key + dateStr + filePath; String md5sum = DigestUtils.md5Hex(str2Md5.getBytes(StandardCharsets.UTF_8)); return originUrl.getProtocol() + "://" + originUrl.getHost() + "/" + dateStr + "/" + md5sum + originUrl.getFile(); } catch (Exception e) { e.printStackTrace(); } return null; } // 加密算法C public static String createAuthInfoUrlByAlgorithmC(String url, String key) { try { checkParam(url, key); URL originUrl = new URL(url); String filePath = originUrl.getPath(); String hexTime = Long.toHexString(Instant.now().getEpochSecond()).toUpperCase(Locale.ENGLISH); String str2Md5 = key + filePath + hexTime; String md5Hash = DigestUtils.md5Hex(str2Md5.getBytes(StandardCharsets.UTF_8)); return originUrl.getProtocol() + "://" + originUrl.getHost() + "/" + md5Hash + "/" + hexTime + originUrl.getFile(); } catch (Exception e) { e.printStackTrace(); } return null; } // 加密算法D public static String createAuthInfoUrlByAlgorithmD(String url, String key) { try { checkParam(url, key); URL originUrl = new URL(url); String urlPath = originUrl.getPath(); String pathInUrl = urlPath.substring(0, urlPath.lastIndexOf("/") + 1); String data = encodeUrl(pathInUrl) + "$" + getUtcTime("yyyyMMddHHmmss"); String encryptInfo = aesCbcEncrypt(data, key, true); String authInfoStr = "auth_info=" + URLEncoder.encode(encryptInfo, "UTF-8"); return urlPath + "?" + authInfoStr; } catch (Exception e) { e.printStackTrace(); } return null; } private static void checkParam(String url, String key) { if (StringUtils.isAnyEmpty(url, key)) { throw new IllegalArgumentException("url or key is illegal"); } } private static String aesCbcEncrypt(String data, String key, boolean hasPoint) throws Exception { checkParam(data, key); byte[] realKey = get128BitKey(key); SecureRandom secureRand = new SecureRandom(); byte[] ivBytes = new byte[16]; secureRand.nextBytes(ivBytes); if (hasPoint) { return aesCbcEncrypt(data, ivBytes, realKey) + "." + bytesToHexString(ivBytes); } else { return aesCbcEncrypt(data, ivBytes, realKey) + bytesToHexString(ivBytes); } } private static String aesCbcEncrypt(String data, byte[] ivBytes, byte[] key) throws Exception { SecretKeySpec sk = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); if (ivBytes != null) { cipher.init(Cipher.ENCRYPT_MODE, sk, new IvParameterSpec(ivBytes)); } else { cipher.init(Cipher.ENCRYPT_MODE, sk); } return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes("UTF-8"))); } private static byte[] get128BitKey(String key) { byte[] result = null; if (key != null) { result = new byte[16]; byte[] origin = key.getBytes(); if (origin.length > 16) { System.arraycopy(origin, 0, result, 0, 16); } else { System.arraycopy(origin, 0, result, 0, origin.length); } } return result; } private static String encodeUrl(String str) { try { if (StringUtils.isNotEmpty(str)) { StringBuilder encodeStr = new StringBuilder(32); String[] tmpArray = str.split("/"); for (int i = 0; i < tmpArray.length; i++) { encodeStr.append(URLEncoder.encode(tmpArray[i], "UTF8")).append("/"); } return encodeStr.toString(); } } catch (Exception e) { throw new RuntimeException(String.format("Encode fail %s", e.getMessage())); } return str; } private static String getUtcTime(String dateTimePattern) { SimpleDateFormat foo = new SimpleDateFormat(dateTimePattern); java.util.Calendar cal = java.util.Calendar.getInstance(); int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET); int dstOffset = cal.get(java.util.Calendar.DST_OFFSET); cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset)); String time = foo.format(new Date(cal.getTimeInMillis())); return time; } private static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if ((src == null) || (src.length <= 0)) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } }