媒体处理

本文提供了Node.js SDK媒体处理模块相关功能的API调用示例,包含提交转码作业(HLS标准加密、普通)、提交截图作业、查询截图数据、导播台视频预处理。

初始化客户端

使用前请先初始化客户端,请参见初始化

提交转码作业-普通

调用SubmitTranscodeJobs接口,完成提交转码作业-普通功能。

接口参数和返回字段请参见SubmitTranscodeJobs。调用示例如下:

说明

此示例代码为普通转码(不加密)。阿里云视频加密方案请参见阿里云视频加密

// 调用样例
var client = initVodClient('<Your AccessKeyId>','<Your AccessKeySecret>');

/**
 * 构建覆盖参数,目前只支持图片水印文件地址、文字水印的内容覆盖;如不使用可忽略
 * 需要替换的水印信息对应水印ID必须是关联在指定的转码模板ID上(即TranscodeTemplateId)
 * 不支持通过媒体处理接口去增加一个没有关联上的水印
 */
var overrideParams = {
    Watermarks: [{
        //此处填写转码模板中关联的需要替换的图片水印模板ID
        WatermarkId: 'WatermarkId1',
        //需要替换成对应图片水印文件的OSS地址,水印文件存储源站需要和视频存储源站一致
        FileUrl: 'https://192.168.0.0/16/watermarks/sample.png'
    },{
        //模板上面关联需要替换内容的文字水印ID
        WatermarkId: 'WatermarkId2',
        //需要替换成对应的内容
        Content: '用户ID:6****'
    }]
};

client.request("SubmitTranscodeJobs", {
    VideoId: '34a6ca54f5c140eece85a289****',
    TemplateGroupId: 'e8aa925a9798c630d30cd7****',
    OverrideParams: JSON.stringify(overrideParams)
}, {}).then(function (response) {
    if (response.TranscodeJobs && response.TranscodeJobs.TranscodeJob && response.TranscodeJobs.TranscodeJob.length > 0){
        for(var i=0; i<response.TranscodeJobs.TranscodeJob.length; i++){
            console.log('JobId = ' + response.TranscodeJobs.TranscodeJob[i].JobId);
        }
    }
    console.log('RequestId = ' + response.RequestId);
}).catch(function (response) {
    console.log('ErrorCode = ' + response.data.Code);
    console.log('ErrorMessage = ' + response.data.Message);
    console.log('RequestId = ' + response.data.RequestId);
});

提交转码作业-HLS标准加密

调用SubmitTranscodeJobs接口,完成提交转码作业-HLS标准加密功能。

接口参数和返回字段请参见SubmitTranscodeJobs。调用示例如下:

说明

此示例代码为使用HLS标准加密提交转码作业的示例。

// 调用样例
var client = initVodClient('<Your AccessKeyId>','<Your AccessKeySecret>');

/**
 * 提交媒体处理作业
 */
function submitTranscodeJobs(overrideParams, encryptConfig) {
    var paras = {
        VideoId: '34a6ca54f5c140eece85a289****',
        TemplateGroupId: 'e8aa925a9798c630d30cd7****'
    };
    // 覆盖参数,暂只支持水印部分参数替换(只有需要替换水印相关信息才需要传递)
    if (!overrideParams){
        paras.OverrideParams = JSON.stringify(overrideParams);
    }
    // HLS标准加密配置(只有标准加密才需要传递)
    if (!encryptConfig){
        paras.EncryptConfig = JSON.stringify(encryptConfig);
    }

    client.request("SubmitTranscodeJobs", paras, {}).then(function (response) {
        console.log(response);
        if (response.TranscodeJobs && response.TranscodeJobs.TranscodeJob && response.TranscodeJobs.TranscodeJob.length > 0){
            for(var i=0; i<response.TranscodeJobs.TranscodeJob.length; i++){
                console.log('JobId = ' + response.TranscodeJobs.TranscodeJob[i].JobId);
            }
        }
        console.log('RequestId = ' + response.RequestId);
    }).catch(function (response) {
        console.log('ErrorCode = ' + response.data.Code);
        console.log('ErrorMessage = ' + response.data.Message);
        console.log('RequestId = ' + response.data.RequestId);
    });
}

/**
 * 生成加密需要的密钥,response中包含密文密钥和明文密钥,用户只需要将密文密钥传递给点播即可
 * 注意:KeySpec 必须传递AES_128,且不能设置NumberOfBytes
 */
client.request("GenerateDataKey", {
    KeyId: 'KeyId',   // 点播提供生成密钥的service key,在用户的密钥管理服务中可看到描述为vod的加密key
    KeySpec: 'AES_128'
}, {}).then(function (response) {
    console.log('GenerateDataKey RequestId = ' + response.RequestId);
    var encryptConfig = {
        // 解密接口地址,该参数需要将每次生成的密文密钥与接口URL拼接生成,表示每个视频的解密的密文密钥都不一样
        // 至于Ciphertext这个解密接口参数的名称,用户可自行制定,这里只作为参考参数名称
        DecryptKeyUri: 'http://decrypt.demo.com/decrypt?Ciphertext=' + response.CiphertextBlob,
        // 密钥服务的类型,目前只支持KMS
        KeyServiceType: 'KMS',
        // 密文密钥
        CipherText: response.CiphertextBlob
    };

    /**
     * 构建覆盖参数,目前只支持图片水印文件地址、文字水印的内容覆盖;如不使用可忽略
     * 需要替换的水印信息对应水印ID必须是关联在指定的转码模板ID上(即TranscodeTemplateId)
     * 不支持通过媒体处理接口去增加一个没有关联上的水印
     */
    var overrideParams = {
        Watermarks: [{
            //模板上面关联需要替换的水印文件图片水印ID
            WatermarkId: 'WatermarkId1',
            //需要替换成对应图片水印文件的OSS地址,水印文件存储源站需要和视频存储源站一致
            FileUrl: 'https://sample.oss-cn-shanghai.aliyuncs.com/watermarks/sample.png'
        },{
            //模板上面关联需要替换内容的文字水印ID
            WatermarkId: 'WatermarkId2',
            //需要替换成对应的内容
            Content: '用户ID:6****'
        }]
    };

    submitTranscodeJobs(overrideParams, encryptConfig);
}).catch(function (response) {
    console.log('GenerateDataKey ErrorCode = ' + response.data.Code);
    console.log('GenerateDataKey ErrorMessage = ' + response.data.Message);
    console.log('GenerateDataKey RequestId = ' + response.data.RequestId);
});

提交截图作业

调用SubmitSnapshotJob接口,完成提交截图作业功能。

接口参数和返回字段请参见SubmitSnapshotJob。调用示例如下:

说明

创建截图模板详细请参见截图模板

// 调用样例
var client = initVodClient('<Your AccessKeyId>','<Your AccessKeySecret>');

var spriteSnapshotConfig = {
    CellWidth: '120',
    CellHeight: '68',
    Columns: '3',
    Lines: '10',
    Padding: '20',
    Margin: '50',
    //保留雪碧图原始图
    KeepCellPic: 'keep',
    Color: 'tomato'
};
client.request("SubmitSnapshotJob", {
    VideoId: '52b440eabcc8ae1cbffc85****',  // 需要截图的视频ID
    SnapshotTemplateId: '1111e6b8baadf589cbffc58****',  // 截图模板ID
    //如果设置了SnapshotTemplateId,会忽略下面参数
    Count: 50,
    SpecifiedOffsetTime: 0,
    Interval: 1,
    Width: '200',
    Height: '200',
    SpriteSnapshotConfig: JSON.stringify(spriteSnapshotConfig)
}, {}).then(function (response) {
    if (response.SnapshotJob){
        //任务ID
        console.log('JobId = ' + response.SnapshotJob.JobId);
    }
    console.log('RequestId = ' + response.RequestId);
}).catch(function (response) {
    console.log('ErrorCode = ' + response.data.Code);
    console.log('ErrorMessage = ' + response.data.Message);
    console.log('RequestId = ' + response.data.RequestId);
});

查询截图数据

调用ListSnapshots接口,完成查询截图数据功能。

接口参数和返回字段请参见ListSnapshots。调用示例如下:

// 调用样例
var client = initVodClient('<Your AccessKeyId>','<Your AccessKeySecret>');

client.request("ListSnapshots", {
    VideoId: '1111121b52b440eabcc8ae1cbff58****',  //视频ID
    SnapshotType: 'CoverSnapshot',  //截图类型
    PageNo: '1',
    PageSize: '20'
}, {}).then(function (response) {
    if (response.MediaSnapshot && response.MediaSnapshot.Snapshots && response.MediaSnapshot.Snapshots.Snapshot){
        for (var i=0; i<response.MediaSnapshot.Snapshots.Snapshot.length; i++){
            //截图地址
            console.log('Url = ' + response.MediaSnapshot.Snapshots.Snapshot[i].Url);
        }
    }
    console.log('RequestId = ' + response.RequestId);
}).catch(function (response) {
    console.log('ErrorCode = ' + response.data.Code);
    console.log('ErrorMessage = ' + response.data.Message);
    console.log('RequestId = ' + response.data.RequestId);
});

导播台视频预处理

调用SubmitPreprocessJobs接口,完成导播台视频预处理功能。

接口参数和返回字段请参见SubmitPreprocessJobs。调用示例如下:

// 调用样例
var client = initVodClient('<Your AccessKeyId>','<Your AccessKeySecret>');

client.request("SubmitPreprocessJobs", {
    VideoId: '111111192e8e48c1ad51f237c54****',  //视频ID
    PreprocessType: 'PreprocessType'
}, {}).then(function (response) {
    if (response.PreprocessJobs && response.PreprocessJobs.PreprocessJob && response.PreprocessJobs.PreprocessJob.length > 0){
        for (var i=0; i<response.PreprocessJobs.PreprocessJob.length; i++){
            //任务ID
            console.log('JobId = ' + response.PreprocessJobs.PreprocessJob[i].JobId);
        }
    }
    console.log('RequestId = ' + response.RequestId);
}).catch(function (response) {
    console.log('ErrorCode = ' + response.data.Code);
    console.log('ErrorMessage = ' + response.data.Message);
    console.log('RequestId = ' + response.data.RequestId);
});