视频点播支持将第三方平台的视频资源迁移到视频点播,也支持阿里云账号间的视频资源迁移。本文介绍上述资源的迁移方法。

迁移目标及方法

视频点播支持以下视频资源的迁移:

  • 第三方资源:将存储于个人网站、云端的视频等数据资源迁移到视频点播。
  • 跨阿里云账号资源:将视频点播OSS Bucket中的视频迁移到另一个账号中的OSS Bucket中。跨账号迁移视频后,会生成新的视频ID、播放地址、封面地址等视频信息。

资源迁移的方法、工具及流程如下:

迁移目标 迁移方法 迁移工具 迁移流程
第三方资源 公网下载公网上传
  • 视频点播上传SDK(推荐)
  • 视频点播服务端API
正常迁移
  1. 准备待迁移资源下载地址。
  2. 搭建上传服务(上传SDK或服务端API)。
  3. 上传视频资源。
  4. (可选)整理资源关系。
跨阿里云账号资源 通过ECS内网上传
重要 适用本方法的前提条件如下:
  • 用户的视频源文件存储在OSS中。
  • 用户的点播账号和OSS账号为同一阿里云账号。
  • 用户的ECS与视频源文件在一个地域。
  • 视频点播上传SDK(推荐)
  • 视频点播服务端API
ECS上传
  1. 获取视频资源地址并修改为OSS内网地址。
  2. 搭建上传服务(上传SDK或服务端API)。
  3. 上传视频资源。
跨阿里云账号资源 公网上传
  • 视频点播上传SDK(推荐)
  • 视频点播服务端API
  1. 从视频点播获取视频资源地址。
  2. 搭建上传服务(上传SDK或服务端API)。
  3. 上传视频资源。

准备工作

迁移第三方资源

第三方资源指存储于个人网站、云端的视频资源。请参考以下步骤将第三方资源迁移到阿里云视频点播:

  1. 准备需要迁移的资源,用户可以根据自身的数据处理习惯保存迁移文件下载地址。
    说明 用户需要准备所有迁移文件的下载地址,需要注意下载地址如果存在鉴权,尽量保证鉴权时间够长,避免下载时文件下载地址失效。
  2. 搭建上传服务。
    代码示例请参考上传服务搭建及代码示例。推荐使用视频点播上传SDK完成迁移。
    说明 需要整理迁移前后资源关系的用户,上传程序应当记录源文件地址和上传后VideoId的关联,如:在上传时打印日志形式记录、上传时源文件地址写入视频媒资信息记录等,具体如何记录依赖于用户场景。如果使用URL批量拉取,该接口同步返回信息中有对应上传源文件地址,有需求可以合理使用。
  3. 执行步骤2搭建的上传代码,上传视频至视频点播。
  4. (可选)整理点播资源关系。

    顺利完成数据迁移,如有整理资源的需求,请根据上传时记录的迁移源文件地址和上传到点播后VideoId之间的对应关系进行整理。

迁移跨账号资源(公网上传)

如果您希望在更多地区复制视频点播解决方案的场景,可将现有视频点播存储的内容迁移到不同的账号。使用公网上传的迁移步骤如下:

说明 本文以调用接口获取源文件地址为例介绍迁移步骤。您也可以通过视频点播控制台获取源文件地址,详细操作请参见媒资数据导出
  1. 调用点播搜索媒体信息接口筛选出要迁移的视频VideoId。
  2. 将步骤1获取的VideoId作为入参,调用获取源文件信息接口获取所有需要迁移视频的源文件地址并保存。
    说明 如果用户需要使用转码流作为迁移源文件下载地址,可使用点播服务,更多操作,请参见媒资管理
  3. 搭建上传服务。

    代码示例请参考上传服务搭建及代码示例。推荐使用视频点播上传SDK完成迁移。

  4. 执行步骤3搭建的上传代码,上传视频至视频点播。

迁移跨账号资源(内网上传)

如果您希望在更多地区复制视频点播解决方案的场景,可将现有视频点播存储在OSS的内容迁移到不同的账号。迁移过程中可使用内网上传,但使用内网上传必须满足以下前提条件:
  • 用户的视频源文件存储在OSS中。
  • 用户的点播账号和OSS账号为同一阿里云账号。
  • 用户的ECS与视频源文件在一个地域。

如上述条件均满足,可参考以下步骤完成迁移:

  1. 调用视频点播服务端获取源文件信息接口获取文件OSS地址。
    说明 将请求参数OutputType的值设为oss
  2. 将获取到的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资源的信息,请参考通过OSS内网地址访问OSS资源

  3. 搭建上传服务。
    说明 针对跨阿里云账号迁移的场景,如需通过内网上传,建议您将上传服务部署在与点播OSS Bucket(中国内地默认上海)同地域的ECS。按照此方式部署后,使用上传SDK上传时指定参数regionId为上述地域,上传过程会自动走内网。

    代码示例请参考上传服务搭建及代码示例。推荐使用视频点播上传SDK完成迁移。

  4. 执行步骤3搭建的上传代码,上传视频至视频点播。

上传服务搭建及代码示例

无论是第三方资源还是阿里云账号间资源迁移,都需要下载原视频再通过上传工具上传到视频点播。视频点播提供上传SDK及服务端接口两种上传工具。您的上传服务可通过上传SDK或服务端接口实现。使用上传SDK为同步上传,更具实效性,故推荐使用。使用服务端接口为异步上传,实时性相对较差。

搭建上传服务步骤

  1. 集成上传SDK或服务端SDK。

    根据您使用的语言,集成上传SDK请参考上传SDK,集成服务端SDK请参考服务端SDK

  2. 编写上传服务代码。如何编写请参考下述代码示例。

上传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 ID, AccessKey Secret提前准备好的AccessKey信息。<Your Video Title>为视频标题。<Your Video with File Extension>为含文件扩展名的视频,如video-1.mp4。
        testUploadStream("<AccessKey Id>", "<AccessKey Secret>", "<Your Video Title>", "<Your Video with File Extension>", inputStream);
    }
}

服务端API代码示例(不推荐)

视频点播的URL拉取上传接口支持将迁移资源文件下载地址逐个传入,执行完成上传任务提交也可以根据个人需求在上传时传入视频的媒资信息,如:标题、分类、描述等。但上传过程为异步,故一般不推荐使用。

示例代码如下:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
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异步批量拉取
 * 使用前建议阅读该接口文档,了解其优势及缺陷
 * 请参见URL拉取上传
 */
public class UploadMediaByURLDemo {
    public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
        String regionId = "cn-shanghai";  // 点播服务接入区域
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);
        return client;
    }

    /**
     * URL批量拉取上传
     * @param client 发送请求客户端
     * @return UploadMediaByURLResponse URL批量拉取上传响应数据
     * @throws Exception
     */
    public static UploadMediaByURLResponse uploadMediaByURL(DefaultAcsClient client,String url) throws Exception{
        UploadMediaByURLRequest request = new UploadMediaByURLRequest();
        //String url = "http://xxxx.mp4";
        String encodeUrl = URLEncoder.encode(url, "UTF-8");
        request.setUploadURLs(encodeUrl);

        //上传视频元数据信息,为JSON字符串
        JSONObject uploadMetadata = new JSONObject();
        uploadMetadata.put("SourceUrl", encodeUrl);
        uploadMetadata.put("Title", "upload by url sample");
        JSONArray uploadMetadataList = new JSONArray();
        uploadMetadataList.add(uploadMetadata);
        request.setUploadMetadatas(uploadMetadataList.toJSONString());
        JSONObject userData = new JSONObject();
        
    //回调信息设置,点播控制台勾选视频上传能完成事件,视频成功上传后会发送通知消息到该URL
        JSONObject messageCallback = new JSONObject();
        messageCallback.put("CallbackURL", "<Your Callback URL>");//用户接受回调消息的URL, 如http://example.com/callback****
        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) throws ClientException {
        DefaultAcsClient client = initVodClient("<Your AccessKeyId>", "<Your AccessKeySecret>");
        UploadMediaByURLResponse response = new UploadMediaByURLResponse();
        try { 
    //此处用户可修改成读取,事前准备的迁移资源文本
            response = uploadMediaByURL(client,"<Your File URL>");//文件中的上传地址,如http://example.aliyundoc.com.****.mp4
            System.out.print("UploadJobs = " + JSON.toJSONString(response.getUploadJobs()) + "\n");
        } catch (Exception e) {
            System.out.print("ErrorMessage = " + e.getLocalizedMessage());
        }
        System.out.print("RequestId = " + response.getRequestId() + "\n");
    }
}