視頻點播支持將第三方平臺的視頻資源遷移到視頻點播,也支持阿里云賬號間的視頻資源遷移。本文介紹上述資源的遷移方法。
遷移場景及方法
視頻點播提供了多種方式進行資源遷移,支持將第三方資源(存儲于個人網站、云端的視頻等第三方數據資源)、同賬號或跨賬號下的OSS資源及點播資源遷移到視頻點播中。
資源遷移成功之后,資源將會在視頻點播中生成新的視頻ID、播放地址、封面地址等視頻信息,您需要自行關聯遷移前后的視頻資源關系。
遷移場景 | 遷移方法 | 遷移工具 |
第三方資源,遷移到視頻點播 |
| |
同阿里云賬號下的OSS資源,遷移到視頻點播 |
| |
跨阿里云賬號下的OSS資源,遷移到視頻點播 |
| |
跨阿里云賬號下的點播資源,遷移到視頻點播 |
|
準備工作
URL批量拉取上傳(推薦)
使用場景
如果需要遷移的文件沒有存儲在本地服務器或終端,需要通過公網訪問URL地址進行資源訪問遷移時,推薦您使用URL批量拉取的方式進行上傳。該方式的優勢在于能夠快速上傳大量文件,同時上傳過程采用內網上傳方式,節省上傳流量。
使用限制
URL批量拉取上傳目前僅支持在華東2(上海)和新加坡地域使用,其他地域的用戶建議您使用其他方式進行資源遷移。
注意事項
URL批量拉取上傳是異步任務,非實時,不保證時效性,一般提交后會在數小時、甚至數天內完成遷移上傳。如果對時效性要求較高,建議使用上傳SDK上傳。
同一個媒體文件URL,每次提交上傳任務都會在點播中產生一個新的媒體資源(即產生新的媒體ID)。
遷移流程
操作步驟
集成視頻點播服務端SDK。
本文以集成Java SDK為例完成后續操作,更多語言的使用,請參見服務端SDK。
準備需要遷移的資源。
說明用戶需要準備所有遷移文件的下載地址,需要注意下載地址如果存在鑒權,盡量保證鑒權時間夠長,避免下載時文件下載地址失效。
文件的下載地址必須是包含文件擴展名的完整路徑,例如:
https://****.mp4
。
通過點播服務端SDK調用UploadMediaByURL - URL批量拉取上傳接口完成批量上傳。
以下提供Java語言的調用示例,更多語言的調用示例,請參見URL批量拉取上傳。
您也可以通過OpenAPI開發者門戶在線調試。
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()); } } }
獲取上傳結果。
方式一:事件通知
視頻點播支持HTTP回調和MNS回調兩種方式的事件通知,通過提前配置事件通知,當媒體文件處理完成(如上傳完成、轉碼完成等)后,視頻點播服務會根據您配置的回調方式及時通知您。配置詳情請參見事件通知。
URL批量拉取上傳的事件類型為URL上傳視頻完成。您可以從接收到的回調結果中獲取到上傳任務的狀態等信息。
上傳成功回調示例
{ "Status": "success", "EventTime": "2017-03-20T07:49:17Z", "EventType": "UploadByURLComplete", "VideoId": "43q9fjdun3f****", "JobId": "4c815bjs83j1****", "SourceURL ": "http://example.aliyundoc.com/27ffc438-164d55217ef-0005-6884-51a-1****.mp4", "Size":"123456" }
上傳失敗回調示例
{ "Status": "fail", "EventTime": "2017-03-20T07:49:17Z", "EventType": "UploadByURLComplete", "ErrorCode ": "URLInvalidError ", "ErrorMessage ": "download video failed by the url, please check it", "JobId": "4c815bjsued****" , "SourceURL ": "http://example.aliyundoc.com/27ffc438-164d55217ef-0005-6884-51a-1****.mp4", }
方式二:調用API查詢
調用GetURLUploadInfos - 獲取URL上傳信息接口來查詢指定URL拉取上傳任務的執行狀態等信息。
自行下載文件并搭建上傳服務上傳
當您的服務地域不支持使用URL批量拉取方式上傳或您對上傳實時性要求較高時,您可以自行下載文件并使用視頻點播提供的上傳SDK進行上傳。如果您把上傳服務部署在ECS上,根據您的ECS地域的不同可以選擇內網上傳和公網上傳兩種方式進行資源遷移。
內網下載內網上傳
使用場景
當您的上傳服務所在ECS與視頻源文件在同一個地域時,可以通過ECS內網,將同賬號或跨賬號下的OSS資源遷移到視頻點播中,或將跨賬號下的視頻點播資源遷移到視頻點播中。
遷移流程
前提條件
您的上傳服務所在的ECS與視頻源文件必須在同一個地域。
操作步驟
準備需要遷移的OSS資源或視頻點播資源的內網地址并保存。
說明需要注意資源文件地址如果存在鑒權,盡量保證鑒權時間夠長,避免下載時文件下載地址失效。
點播資源
調用視頻點播服務端GetMezzanineInfo - 獲取源文件信息接口獲取文件OSS地址,請務必將請求參數
OutputType
的值設為oss
。將獲取到的OSS地址修改為內網地址,修改方法為在OSS地域后增加
-internal
。
OSS資源
可以通過列舉文件,得到object列表,獲取到資源的源文件地址并保存。
將獲取到的OSS地址修改為內網地址,修改方法為在OSS地域后增加
-internal
。
修改前后的地址示例如下:
獲取的OSS回源地址
修改后的內網地址
outin-67870fd5b29****98a3900163e1c35d5.oss-cn-shanghai.aliyuncs.com/customerTrans/2a13b91506f9158f****7317f4a9d4c9/30f24681-1718d5c6237-**4bd.mp4
outin-67870fd5b29****98a3900163e1c35d5.oss-cn-shanghai-internal.aliyuncs.com/customerTrans/2a13b91506f9158f****7317f4a9d4c9/30f24681-1718d5c6237-**4bd.mp4
更多獲取OSS資源的內網訪問地址的信息,請參見ECS實例通過OSS內網地址訪問OSS資源。
搭建上傳服務。
說明將上傳服務部署在與點播OSS Bucket(中國內地默認上海)同地域的ECS。按照此方式部署后,使用上傳SDK上傳時指定參數
regionId
為上述地域,上傳過程會自動走內網。代碼示例請參考上傳服務搭建及代碼示例。推薦使用視頻點播上傳SDK完成遷移。
執行步驟2搭建的上傳代碼,上傳視頻至視頻點播。
使用修改后的內網地址作為文件地址傳入上傳接口進行上傳。
公網下載公網上傳
使用場景
當您未將上傳服務部署在ECS上或上傳服務所在ECS與視頻源文件不在同一個地域時,您可以選擇使用公網下載公網上傳方式進行資源遷移。
遷移流程
操作步驟
準備需要遷移的資源的源文件地址并保存。
說明需要注意資源文件地址如果存在鑒權,盡量保證鑒權時間夠長,避免下載時文件下載地址失效。
資源文件的地址必須是包含文件擴展名的完整路徑,例如:
https://****.mp4
。
點播資源
調用點播SearchMedia - 搜索媒體信息接口篩選出要遷移的視頻VideoId。
調用GetMezzanineInfo - 獲取源文件信息接口獲取所有需要遷移視頻的源文件地址并保存。
OSS資源
可以通過列舉文件,得到object列表,獲取到資源的源文件地址并保存。
第三方資源(存儲于個人網站、云端的視頻等第三方數據資源)
請自行準備所有遷移文件的下載地址,您可以根據自身的數據處理習慣保存遷移文件下載地址。
搭建上傳服務。
代碼示例請參考上傳服務搭建及代碼示例。推薦使用視頻點播上傳SDK完成遷移。
說明需要整理遷移前后資源關系的用戶,上傳程序應當記錄源文件地址和上傳后VideoId的關聯,如:在上傳時打印日志形式記錄、上傳時源文件地址寫入視頻媒資信息記錄等,具體如何記錄依賴于用戶場景。如果使用URL批量拉取,該接口同步返回信息中有對應上傳源文件地址,有需求可以合理使用。
執行步驟2搭建的上傳代碼,上傳視頻至視頻點播。
不需要修改源文件地址,直接將源文件地址作為文件地址傳入上傳接口進行上傳。
(可選)整理點播資源關系。
順利完成數據遷移,如有整理資源的需求,請根據上傳時記錄的遷移源文件地址和上傳到點播后VideoId之間的對應關系進行整理。
將OSS自有Bucket添加到視頻點播并注冊資源
使用場景
適用于資源存儲在同賬號下的OSS Bucket時,無需二次上傳,直接通過將OSS自有Bucket添加到視頻點播中后并注冊資源來達到遷移資源的目的。
使用限制
目前僅支持將標準存儲類型的OSS Bucket添加到視頻點播中。
每個服務地域下最多僅支持添加10個OSS自有Bucket。
操作步驟
將需要遷移資源的OSS自有Bucket添加到視頻點播中。
詳細的操作步驟及參數解釋,請參見添加OSS自有Bucket。
通過接口將OSS中的資源注冊到視頻點播中。
使用OSS的API/SDK,列舉bucket下的所有文件,得到object列表。詳情請參見列舉文件。
調用RegisterMedia - 注冊媒資信息接口注冊媒資文件生成音/視頻ID,其中,
RegisterMetadatas
中的FileURL
參數為OSS列舉文件得到的object的完整路徑,即必須加上OSS域名地址,例如:https://oss-cn-hangzhou.aliyuncs.com/video/example.mp4
上傳服務搭建及代碼示例
無論是第三方資源還是阿里云賬號間資源遷移,都需要下載原視頻再通過上傳工具上傳到視頻點播。視頻點播提供上傳SDK及服務端接口兩種上傳工具。您的上傳服務可通過上傳SDK或服務端接口實現。使用上傳SDK為同步上傳,更具實效性,故推薦使用。使用服務端接口較為繁瑣,故不推薦。
搭建上傳服務步驟
上傳SDK代碼示例(推薦)
以下代碼僅以Java上傳SDK為例展示。更多語言的上傳SDK及操作示例,請參考上傳SDK。
import com.aliyun.vod.upload.impl.UploadVideoImpl;
import com.aliyun.vod.upload.req.UploadStreamRequest;
import com.aliyun.vod.upload.resp.UploadStreamResponse;
import java.io.*;
import java.net.URL;
/**
* 使用上傳SDK進行視頻文件上傳
*/
public class UploadStreamDemo {
/**
* 流式上傳接口
*
* @param accessKeyId
* @param accessKeySecret
* @param title
* @param fileName
* @param inputStream
*/
private static void testUploadStream(String accessKeyId, String accessKeySecret, String title, String fileName, InputStream inputStream) {
UploadStreamRequest request = new UploadStreamRequest(accessKeyId, accessKeySecret, title, fileName, inputStream);
/* 自定義消息回調設置,參數說明請參見基本數據類型 */
//request.setUserData(""{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackURL\":\"http://example.aliyundoc.com\"}}"");
/* 視頻分類ID(可選) */
//request.setCateId(0);
/* 視頻標簽,多個用逗號分隔(可選) */
//request.setTags("標簽1,標簽2");
/* 視頻描述(可選) */
//request.setDescription("視頻描述");
/* 封面圖片(可選),如http://****.example.com/image_01.jpg*/
//request.setCoverURL("<Your CoverURL>");
/* 模板組ID(可選) */
//request.setTemplateGroupId("8c4792cbc8694e****fd5330e56a33d");
/* 工作流ID(可選) */
//request.setWorkflowId("d4430d07361f****1339577859b0177b");
/* 存儲區域(可選) */
//request.setStorageLocation("outin-20170323****266-5sejdln9o.oss-cn-shanghai.aliyuncs.com");
/* 點播服務接入點 */
request.setApiRegionId("cn-shanghai");
/* ECS部署區域*/
// request.setEcsRegionId("cn-shanghai");
UploadVideoImpl uploader = new UploadVideoImpl();
UploadStreamResponse response = uploader.uploadStream(request);
System.out.print("RequestId=" + response.getRequestId() + "\n"); //請求視頻點播服務的請求ID
if (response.isSuccess()) {
System.out.print("VideoId=" + response.getVideoId() + "\n");
} else { //如果設置回調URL無效,不影響視頻上傳,可以返回VideoId同時會返回錯誤碼。其他情況上傳失敗時,VideoId為空,此時需要根據返回錯誤碼分析具體錯誤原因
System.out.print("VideoId=" + response.getVideoId() + "\n");
System.out.print("ErrorCode=" + response.getCode() + "\n");
System.out.print("ErrorMessage=" + response.getMessage() + "\n");
}
}
public static void main(String[] args) {
/**
* 用戶可自行添加url數據源,并傳入視頻媒資信息,上傳視頻資源
*/
InputStream inputStream = null;
//您的視頻地址。如http://example.aliyundoc.com/video/****.mp4
String url = "<Your File URL>";
try {
inputStream = new URL(url).openStream();
} catch (IOException e) {
e.printStackTrace();
}
// 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。
// 強烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
// 本示例通過從環境變量中讀取AccessKey,來實現API訪問的身份驗證。運行代碼示例前,請配置環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
//以下參數中的AccessKey ID, AccessKey Secret為提前準備好的AccessKey信息。<Your Video Title>為視頻標題。<Your Video with File Extension>為含文件擴展名的視頻,如video-1.mp4。
testUploadStream(accessKeyId, accessKeySecret, "<Your Video Title>", "<Your Video with File Extension>", inputStream);
}
}
服務端API代碼示例(不推薦)
集成服務端SDK并進行上傳,需要開發者自行實現所有上傳邏輯,包括在點播服務獲取上傳地址和憑證、Base64解碼上傳憑證和地址、以及調用OSS能力完成上傳。此方式較為繁瑣且出錯率較高,因此不推薦使用。完整的上傳邏輯請參見通過視頻點播API上傳媒資文件。