点播资源迁移

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

迁移场景及方法

视频点播提供了多种方式进行资源迁移,支持将第三方资源(存储于个人网站、云端的视频等第三方数据资源)、同账号或跨账号下的OSS资源及点播资源迁移到视频点播中。

资源迁移成功之后,资源将会在视频点播中生成新的视频ID、播放地址、封面地址等视频信息,您需要自行关联迁移前后的视频资源关系。

迁移场景

迁移方法

迁移工具

第三方资源,迁移到视频点播

  • URL批量拉取(推荐)

  • 视频点播上传SDK

  • 视频点播服务端API

同阿里云账号下的OSS资源,迁移到视频点播

  • URL批量拉取(推荐)

  • 视频点播上传SDK

  • 视频点播服务端API

跨阿里云账号下的OSS资源,迁移到视频点播

  • URL批量拉取(推荐)

  • 视频点播上传SDK

  • 视频点播服务端API

跨阿里云账号下的点播资源,迁移到视频点播

  • URL批量拉取(推荐)

  • 视频点播上传SDK

  • 视频点播服务端API

准备工作

URL批量拉取上传(推荐)

使用场景

如果需要迁移的文件没有存储在本地服务器或终端,需要通过公网访问URL地址进行资源访问迁移时,推荐您使用URL批量拉取的方式进行上传。该方式的优势在于能够快速上传大量文件,同时上传过程采用内网上传方式,节省上传流量。

使用限制

URL批量拉取上传目前仅支持在华东2(上海)新加坡地域使用,其他地域的用户建议您使用其他方式进行资源迁移。

注意事项

  • URL批量拉取上传是异步任务,非实时,不保证时效性,一般提交后会在数小时、甚至数天内完成迁移上传。如果对时效性要求较高,建议使用上传SDK上传。

  • 同一个媒体文件URL,每次提交上传任务都会在点播中产生一个新的媒体资源(即产生新的媒体ID)。

迁移流程点播资源迁移-URL..png

操作步骤

  1. 集成视频点播服务端SDK。

    本文以集成Java SDK为例完成后续操作,更多语言的使用,请参见服务端SDK

    下载Java SDK请参见服务端SDK,安装Java SDK请参见安装

  2. 准备需要迁移的资源。

    说明
    • 用户需要准备所有迁移文件的下载地址,需要注意下载地址如果存在鉴权,尽量保证鉴权时间够长,避免下载时文件下载地址失效。

    • 文件的下载地址必须是包含文件扩展名的完整路径,例如:https://****.mp4

  3. 通过点播服务端SDK调用UploadMediaByURL - URL批量拉取上传接口完成批量上传。

    以下提供Java语言的调用示例,更多语言的调用示例,请参见URL批量拉取上传

    您也可以通过OpenAPI开发者门户在线调试。

    展开查看Java示例代码

    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());
            }
        }
    
    }
  4. 获取上传结果。

    方式一:事件通知

    视频点播支持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资源迁移到视频点播中,或将跨账号下的视频点播资源迁移到视频点播中。

迁移流程点播资源迁移-内网..png

前提条件

您的上传服务所在的ECS与视频源文件必须在同一个地域。

操作步骤

  1. 准备需要迁移的OSS资源或视频点播资源的内网地址并保存。

    说明

    需要注意资源文件地址如果存在鉴权,尽量保证鉴权时间够长,避免下载时文件下载地址失效。

    • 点播资源

      1. 调用视频点播服务端GetMezzanineInfo - 获取源文件信息接口获取文件OSS地址,请务必将请求参数OutputType的值设为oss

      2. 将获取到的OSS地址修改为内网地址,修改方法为在OSS地域后增加-internal

    • OSS资源

      1. 可以通过列举文件,得到object列表,获取到资源的源文件地址并保存。

      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资源的内网访问地址的信息,请参见ECS实例通过OSS内网地址访问OSS资源

  2. 搭建上传服务。

    说明

    将上传服务部署在与点播OSS Bucket(中国内地默认上海)同地域的ECS。按照此方式部署后,使用上传SDK上传时指定参数regionId为上述地域,上传过程会自动走内网。

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

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

    使用修改后的内网地址作为文件地址传入上传接口进行上传。

公网下载公网上传

使用场景

当您未将上传服务部署在ECS上或上传服务所在ECS与视频源文件不在同一个地域时,您可以选择使用公网下载公网上传方式进行资源迁移。

迁移流程点播资源迁移-公网..png

操作步骤

  1. 准备需要迁移的资源的源文件地址并保存。

    说明
    • 需要注意资源文件地址如果存在鉴权,尽量保证鉴权时间够长,避免下载时文件下载地址失效。

    • 资源文件的地址必须是包含文件扩展名的完整路径,例如:https://****.mp4

    • 点播资源

      1. 调用点播SearchMedia - 搜索媒体信息接口筛选出要迁移的视频VideoId。

      2. 调用GetMezzanineInfo - 获取源文件信息接口获取所有需要迁移视频的源文件地址并保存。

        说明
        • 此处以调用接口获取源文件地址为例介绍迁移步骤。您也可以通过视频点播控制台获取源文件地址,详细操作请参见媒资数据导出

        • 如果您需要使用转码流作为迁移源文件下载地址,可使用点播服务,更多操作,请参见媒资管理

    • OSS资源

      可以通过列举文件,得到object列表,获取到资源的源文件地址并保存。

    • 第三方资源(存储于个人网站、云端的视频等第三方数据资源)

      请自行准备所有迁移文件的下载地址,您可以根据自身的数据处理习惯保存迁移文件下载地址。

  2. 搭建上传服务。

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

    说明

    需要整理迁移前后资源关系的用户,上传程序应当记录源文件地址和上传后VideoId的关联,如:在上传时打印日志形式记录、上传时源文件地址写入视频媒资信息记录等,具体如何记录依赖于用户场景。如果使用URL批量拉取,该接口同步返回信息中有对应上传源文件地址,有需求可以合理使用。

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

    不需要修改源文件地址,直接将源文件地址作为文件地址传入上传接口进行上传。

  4. (可选)整理点播资源关系。

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

将OSS自有Bucket添加到视频点播并注册资源

使用场景

适用于资源存储在同账号下的OSS Bucket时,无需二次上传,直接通过将OSS自有Bucket添加到视频点播中后并注册资源来达到迁移资源的目的。

使用限制

  • 目前仅支持将标准存储类型的OSS Bucket添加到视频点播中。

  • 每个服务地域下最多仅支持添加10个OSS自有Bucket。

操作步骤

  1. 将需要迁移资源的OSS自有Bucket添加到视频点播中。

    详细的操作步骤及参数解释,请参见添加OSS自有Bucket

  2. 通过接口将OSS中的资源注册到视频点播中。

    1. 使用OSS的API/SDK,列举bucket下的所有文件,得到object列表。详情请参见列举文件

    2. 调用RegisterMedia - 注册媒资信息接口注册媒资文件生成音/视频ID,其中,RegisterMetadatas中的FileURL参数为OSS列举文件得到的object的完整路径,即必须加上OSS域名地址,例如:

      https://oss-cn-hangzhou.aliyuncs.com/video/example.mp4

上传服务搭建及代码示例

无论是第三方资源还是阿里云账号间资源迁移,都需要下载原视频再通过上传工具上传到视频点播。视频点播提供上传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拥有所有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上传媒资文件