当文件没有存储在本地且支持通过公网URL访问时,您可使用视频点播封装好的接口拉取上传。该方式可以免去先将文件下载到本地后再上传到点播的过程,适用于离线搬站场景。
功能说明
URL批量拉取上传是异步任务,非实时,不保证时效性,一般提交后会在数小时、甚至数天内完成迁移上传。如果对时效性要求较高,建议使用上传SDK上传文件、或者使用OSS SDK上传文件。
同一个媒体文件 URL,每次提交上传任务都会在点播中产生一个新的媒体资源(即产生新的媒体 ID)。
URL批量拉取上传支持的上传格式,请参见支持的媒体格式。
单个文件超过20GB时,将导致上传失败,请使用其他上传方式。
通过控制台上传
控制台场景下,目前仅华东2(上海)地域支持通过URL拉取方式上传音视频,其他地域暂不支持该方式上传。
登录视频点播控制台。
在点播控制台左侧导航栏的媒资库区域,单击音/视频。
单击上传音/视频。
单击添加音/视频。
添加上传文件,配置转码,单击开始上传。
选择URL拉取方式时,若URL中不包含文件扩展名,为提高拉取成功率,请填写扩展名。由于网络或资源所在服务地域的原因,您的拉取任务可能失败,请调整网络或资源的服务地域后重新尝试拉取。
通过API方式上传
推荐集成点播服务端SDK,调用点播的UploadMediaByURL - URL批量拉取上传接口提交任务。该接口目前仅支持华东 2(上海)、华北 2(北京)、华南 1(深圳)、新加坡、美国(硅谷)地域。
前提条件
您已经开通了视频点播服务。开通步骤请参见开通视频点播服务。
您已经完成上传相关的系统配置,包括启用目标存储地域的存储地址和配置回调。操作指引请参见管理存储Bucket及回调设置。
您已准备好用于调用点播服务的账号。为避免阿里云账号AccessKey泄露带来的安全风险,推荐您创建RAM用户并授予其VOD相关权限。然后使用RAM用户的AK对(AccessKey ID和AccessKey Secret)访问点播服务。操作指引请参见创建RAM用户并授权。
已配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具体操作,请参见在Linux、macOS和Windows系统配置环境变量。
重要阿里云账号的AccessKey拥有所有API的访问权限,建议您使用RAM用户的AccessKey进行API访问或日常运维。
强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
(可选)如需使用STS临时授权方式(阿里云Security Token Service)访问点播服务,请为RAM用户创建角色并授予角色VOD相关权限。操作指引请参见获取STS Token。
示例代码
其他语言示例请直接参考UploadMediaByURL的SDK示例。
V1.0 SDK
步骤一、安装依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.16.32</version>
</dependency>
步骤二、示例代码
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.AlibabaCloudCredentials;
import com.aliyuncs.auth.EnvironmentVariableCredentialsProvider;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.UploadMediaByURLRequest;
import com.aliyuncs.vod.model.v20170321.UploadMediaByURLResponse;
import java.net.URLEncoder;
/**
* URL批量拉取上传功能示例
*
*/
public class AudioOrVideoUploadByUrl {
/**
* 读取AccessKey信息
*/
public static DefaultAcsClient initVodClient() throws ClientException {
// 点播服务接入地域
String regionId = "cn-shanghai";
// 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
// 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
// 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
DefaultProfile profile = DefaultProfile.getProfile(regionId, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
/**
* URL批量拉取上传
*
* @param client 发送请求客户端
* @return UploadMediaByURLResponse URL批量拉取上传响应数据
* @throws Exception
*/
public static UploadMediaByURLResponse uploadMediaByURL(DefaultAcsClient client) throws Exception {
UploadMediaByURLRequest request = new UploadMediaByURLRequest();
String url = "http://video_01.mp4";
String encodeUrl = URLEncoder.encode(url, "UTF-8");
//视频源文件URL
request.setUploadURLs(encodeUrl);
//上传视频元数据信息
JSONObject uploadMetadata = new JSONObject();
//需要上传的视频源文件URL,与UploadURLs里的URL匹配才能生效
uploadMetadata.put("SourceUrl", encodeUrl);
//视频标题
uploadMetadata.put("Title", "upload by url sample");
JSONArray uploadMetadataList = new JSONArray();
uploadMetadataList.add(uploadMetadata);
request.setUploadMetadatas(uploadMetadataList.toJSONString());
//UserData,用户自定义设置参数,用户需要单独回调URL及数据透传时设置(非必须)
JSONObject userData = new JSONObject();
//UserData回调部分设置
//消息回调设置,指定时以此为准,否则以全局设置的事件通知为准
JSONObject messageCallback = new JSONObject();
//设置回调地址
messageCallback.put("CallbackURL", "http://192.168.0.0/16");
//设置回调类型,默认为http
messageCallback.put("CallbackType", "http");
userData.put("MessageCallback", messageCallback.toJSONString());
JSONObject extend = new JSONObject();
extend.put("MyId", "user-defined-id");
userData.put("Extend", extend.toJSONString());
request.setUserData(userData.toJSONString());
return client.getAcsResponse(request);
}
/**
* 请求示例
*/
public static void main(String[] argv) {
try {
DefaultAcsClient client = initVodClient();
UploadMediaByURLResponse response = uploadMediaByURL(client);
System.out.print("UploadJobs = " + JSON.toJSONString(response.getUploadJobs()) + "\n");
System.out.print("RequestId = " + response.getRequestId() + "\n");
} catch (Exception e) {
System.out.print("ErrorMessage = " + e.getLocalizedMessage());
}
}
}
V2.0 SDK
步骤一、安装依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>vod20170321</artifactId>
<version>3.6.4</version>
</dependency>
步骤二、示例代码
工程代码建议使用更安全的无AK方式,凭据配置方式请参见管理访问凭据。
package com.aliyun.sample;
import com.aliyun.tea.*;
public class UploadMediaByURL {
/**
* <b>description</b> :
* <p>使用凭据初始化账号Client</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.vod20170321.Client createClient() throws Exception {
com.aliyun.credentials.Client credential = new com.aliyun.credentials.Client();
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
.setCredential(credential);
// Endpoint 请参考 https://api.aliyun.com/product/vod
config.endpoint = "vod.cn-shanghai.aliyuncs.com";
return new com.aliyun.vod20170321.Client(config);
}
public static void main(String[] args_) throws Exception {
com.aliyun.vod20170321.Client client = Sample.createClient();
com.aliyun.vod20170321.models.UploadMediaByURLRequest uploadMediaByURLRequest = new com.aliyun.vod20170321.models.UploadMediaByURLRequest()
.setUploadURLs("http://cloud.video.taobao.com/play/u/3897629815/p/1/e/6/t/1/301659704826.mp4");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
com.aliyun.vod20170321.models.UploadMediaByURLResponse response = client.uploadMediaByURLWithOptions(uploadMediaByURLRequest, runtime);
com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(response));
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}