使用C/C++ SDK上传文件

本文通过示例详细介绍如何使用服务端上传SDK(C/C++语言)将各类媒体文件上传至点播存储。

整体说明

从内部逻辑角度看,C/C++上传SDK遵循点播服务端SDK的通用流程。详情请参见上传流程。从操作角度看,使用C/C++上传SDK的基础流程如下:

  1. 完成前提条件。请参见前提条件

  2. 集成C/C++上传SDK。请参见集成C/C++上传SDK

  3. 实现上传逻辑(主要是上传信息配置)。

前提条件

  • 您已经开通了视频点播服务。开通步骤请参见开通视频点播服务

  • 您已经完成上传相关的系统配置,包括启用目标存储地域的存储地址和配置回调。操作指引请参见管理存储Bucket回调设置

  • 您已准备好用于调用点播服务的账号。为避免阿里云账号AccessKey泄露带来的安全风险,推荐您创建RAM用户并授予其VOD相关权限。然后使用RAM用户的AK对(AccessKey ID和AccessKey Secret)访问点播服务。操作指引请参见创建RAM用户并授权

  • 已配置环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET。具体操作,请参见在Linux、macOS和Windows系统配置环境变量

    重要
    • 阿里云账号的AccessKey拥有所有API的访问权限,建议您使用RAM用户的AccessKey进行API访问或日常运维。

    • 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

  • (可选)如需使用STS临时授权方式(阿里云Security Token Service)访问点播服务,请为RAM用户创建角色并授予角色VOD相关权限。操作指引请参见使用STS临时授权方案上传视频

    说明

    STS临时授权方式的适用场景请参见凭证方式与STS方式对比

集成C/C++上传SDK

说明
  • 视频点播服务端C/C++上传SDK仅支持Linux环境。

  • 此处以SDK1.0.0版本举例说明。其他版本请根据实际情况操作。

  • 上传SDK及示例代码解压后的目录详细信息,请参见下文目录说明

  • 本文以普通用户执行操作为例进行安装命令说明。

使用视频点播服务端C/C++上传SDK,您必须要安装的软件包及其用途、安装示例请参见下述表格。

软件包

作用

yum安装示例

网上下载安装示例

CMake

第三方编译安装工具

  • 版本:建议使用2.6.0及以上版本。

  • 安装示例:

    sudo yum install cmake
  • 下载地址:CMake

  • 安装示例:

    ./configure
    make
    make install

libcurl

解决网络连接等问题

  • 版本:建议使用7.29.0 及以上版本。

  • 安装示例:

    sudo yum install libcurl-devel
  • 下载地址:libcurl

  • 安装示例:

    ./configure
    make
    make install

libuuid

生成uuid

安装示例:

sudo yum install libuuid-devel

不涉及

apr

不涉及

安装示例:

sudo yum install apr-devel
  • 下载地址:apr

  • 安装示例:

    ./configure
    make
    make install

apr-util

解决内存管理以及跨平台问题

安装示例:

sudo yum install apr-util
  • 下载地址:apr-util

  • 安装示例:

    // 安装时需要指定--with-apr选项。
    ./configure --with-apr=/your/apr/install/path
    make
    make install

minixml

解析请求返回的xml

安装示例:

sudo yum install mxml mxml-devel
  • 下载地址:minixml

  • 安装示例:

    ./configure
    make
    make install

jsoncpp

解析请求返回的JSON

安装示例:

sudo yum install jsoncpp-devel
  • 下载地址:jsoncpp

  • 安装示例:

    ./configure
    make
    make install

OSS SDK

由于上传SDK依赖OSS,需要下载并安装OSS SDK

不涉及

下载地址和安装步骤,请参见OSS SDK安装

重要

有部分OSS依赖库已经在前面步骤进行安装,已经安装的不需要再次进行重复安装。

C/C++上传SDK

上传文件

不涉及

下载地址:上传SDK

安装示例:

cmake .
make
make install

更新C/C++上传SDK

若发现新的接口或已有接口新的功能在当前SDK没有,请下载最新的C/C++上传SDK覆盖到本地SDK文件。更多信息,请参见上传SDK

说明

您可以打开aliyun-c-sdk-vod目录下的ChangeLog.txt文件查看当前SDK的版本号和发布日期。

C/C++上传SDK目录说明

/VodSDK-C_1.0.0.gz解压目录/VodSDK-C_1.0.0/aliyun-c-sdk-vod/src/upload.h

目录

说明

CreateUploadVideoRequest

上传视频的请求类,字段请参见获取音视频上传地址和凭证

CreateUploadImageRequest

上传图片的请求类,字段请参见获取图片上传地址和凭证

CreateUploadAttachedMediaRequest

上传辅助媒资的请求类,字段请参见获取辅助媒资上传地址和凭证

UploadOptions

上传参数结构体,包含如下参数:

  • void (*uploadProgressCallback) (int64_t, int64_t):用于实现自定义上传进度回调,如果不设置则使用默认,设置为NULL则不进行回调。

  • ecsRegionId:设置上传脚本部署的ECS区域(如果有),如果与视频点播存储同一区域会自动启用内网上传。

  • multipartUploadLimit:分片上传阈值,单位字节,默认为10 MB(只对视频上传有效)。

  • multipartUploadOnceSize:分片大小,单位字节,默认为10 MB(只对视频上传有效)。

  • tmpDir:本地临时存储地址,只对网络上传方式生效。

uploadLocalVideo

上传本地视频。

uploadWebVideo

上传网络视频。

uploadLocalImage

上传本地图片。

uploadWebImage

上传网络图片。

uploadLocalAttachedMedia

上传本地辅助媒资文件。

uploadWebAttachedMedia

上传网络辅助媒资文件。

uploadLocalM3u8

上传本地m3u8视频。

uploadWebM3u8

上传网络m3u8视频。

/VodSDK-C_1.0.0.gz解压目录/VodSDK-C_1.0.0/aliyun-c-sdk-vod/samples

目录

说明

uploadVideo.cpp

上传视频的示例代码。

uploadImage.cpp

上传图片的示例代码。

uploadAttachedMedia.cpp

上传辅助媒资的示例代码。

场景一:上传音视频

普通音视频

音视频上传目前支持以下类型文件上传:

  • 上传本地文件,使用分片上传,最大支持48.8 TB的单个文件,不支持断点续传。请参见testUploadLocalVideo函数。

  • 上传网络文件,可指定文件URL进行上传,最大支持48.8 TB的单个文件。该上传方式需要先将网络文件下载到本地磁盘,再进行上传,所以要保证本地磁盘有充足的空间。请参见示例代码中的testUploadWebVideo函数。

展开查看示例代码

void testCallback(int64_t consumed_bytes, int64_t total_bytes)
{
    printf("total :%ld, %ld\n", consumed_bytes, total_bytes);
}
//测试上传本地视频
VodApiResponse testUploadLocalVideo(VodCredential authInfo) {
    CreateUploadVideoRequest request;
    //视频源文件名
    request.fileName = "test.mp4";
    //视频标题
    request.title = "testVideo****";
    //视频分类ID
    request.cateId = "1";
    //自定义视频封面的URL地址,coverURL示例:http://example.com/example-****.jpg
    request.coverURL = "<your cover URL>";
    //视频标签
    request.tags = "test1,test2";
    //转码模板组ID
    request.templateGroupId = "6ae347b0140181ad371d197ebe28****";
    //存储地址,storageLocation示例:example-bucket-****.oss-cn-shanghai.aliyuncs.com
    requests.storageLocation = "<your torageLocation>";
    Json::Value userData;
    Json::Value callbackUrl;
    //CallbackURL示例:https://example.aliyundoc.com/ProcessMessageCallback
    callbackUrl["CallbackURL"] = "<your callback URL>";
    userData["MessageCallback"] = callbackUrl;
    Json::Value extend;
    extend["localId"] = "xxx";
    extend["test"] = "www";
    userData["Extend"] = extend;
    request.userData = userData.toStyledString();
    UploadOptions uploadOptions;
    //设置上传脚本部署的ECS区域(如果有),如与视频点播存储同一区域会自动启用内网上传
    //uploadOptions.ecsRegionId = "cn-shanghai";
    //设置自定义回调函数,否则设置为默认,设置为NULL不回调
    //uploadOptions.uploadProgressCallback = testCallback;
    //uploadOptions.multipartUploadLimit = 20*1024*1024;//设置分片上传阈值
    //uploadOptions.multipartUploadOnceSize = 10*1024*1024;//设置分片上传分片大小
    VodApiResponse result = uploadLocalVideo(authInfo, request, "./test.mp4", uploadOptions);
    return result;
}
//测试上传网络视频
VodApiResponse testUploadWebVideo(VodCredential authInfo) {
    CreateUploadVideoRequest request;
    request.fileName = "testWeb****.mp4";
    request.title = "testUploadWebVideo****";
    UploadOptions uploadOptions;
    //设置上传脚本部署的ECS区域(如果有),如与视频点播存储同一区域会自动启用内网上传
    //uploadOptions.ecsRegionId = "cn-shanghai";
    //设置自定义回调函数,否则设置为默认,设置为NULL不回调
    //uploadOptions.uploadProgressCallback = testCallback;
    //uploadOptions.multipartUploadLimit = 20*1024*1024;//设置分片上传阈值
    //uploadOptions.multipartUploadOnceSize = 10*1024*1024;//设置分片上传分片大小
    //设置下载临时目录,默认为/tmp/
    //uploadOptions.tmpDir = "/tmp/";
    VodApiResponse result = uploadWebVideo(authInfo, request, "<Your Download Url>", uploadOptions);
    return result;
}

####  调用测试代码   ####
VodCredential initVodClient(std::string accessKeyId, std::string accessKeySecret) {
    VodCredential authInfo;
    authInfo.accessKeyId = accessKeyId;
    authInfo.accessKeySecret = accessKeySecret;
    authInfo.regionId = "cn-shanghai";
    return authInfo;
}
int main(int argc, char * argv[]) {
    // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
    // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
    // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    VodCredential authInfo = initVodClient(std:getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), std:getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    VodApiResponse response;
    response = testUploadLocalVideo(authInfo);
    //response = testUploadWebVideo(authInfo);
    //response = testUploadLocalM3u8(authInfo);
    //response = testUploadWebM3u8(authInfo);
    printf("httpCode: %d, result: %s\n", response.httpCode, response.result.c_str());
}

M3U8文件

展开查看示例代码

void testCallback(int64_t consumed_bytes, int64_t total_bytes)
{
    printf("total :%ld, %ld\n", consumed_bytes, total_bytes);
}
//测试上传本地m3u8视频
VodApiResponse testUploadLocalM3u8(VodCredential authInfo) {
    CreateUploadVideoRequest request;
    //视频源文件名
    request.fileName = "testLocal****.m3u8";
    //视频标题
    request.title = "testUploadLocalM3u8****";
    list<string> tsList;
    //注意:如果不添加则会自动解析
    //tsList.push_back("/tmp/1.ts");
    UploadOptions uploadOptions;
    VodApiResponse result = uploadLocalM3u8(authInfo, request, "./test****.m3u8", tsList, uploadOptions);
    return result;
}
//测试上传网络m3u8视频
VodApiResponse testUploadWebM3u8(VodCredential authInfo) {
    CreateUploadVideoRequest request;
    //视频源文件名
    request.fileName = "testWeb****.m3u8";
    //视频标题
    request.title = "testUploadWebM3u8****";
    list<string> tsList;
    //注意:如果不添加则会自动解析
    //tsList.push_back("<Ts1 Download Url>");
    //tsList.push_back("<Ts2 Download Url>");
    UploadOptions uploadOptions;
    VodApiResponse result = uploadWebM3u8(authInfo, request, "<Your M3u8 Download Url>", tsList, uploadOptions);
    return result;
}
####  调用测试代码   ####
VodCredential initVodClient(std::string accessKeyId, std::string accessKeySecret) {
    VodCredential authInfo;
    authInfo.accessKeyId = accessKeyId;
    authInfo.accessKeySecret = accessKeySecret;
    authInfo.regionId = "cn-shanghai";
    return authInfo;
}
int main(int argc, char * argv[]) {
    // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
    // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
    // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    VodCredential authInfo = initVodClient(std:getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), std:getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    VodApiResponse response;
    response = testUploadLocalVideo(authInfo);
    //response = testUploadWebVideo(authInfo);
    //response = testUploadLocalM3u8(authInfo);
    //response = testUploadWebM3u8(authInfo);
    printf("httpCode: %d, result: %s\n", response.httpCode, response.result.c_str());
}

场景二:上传图片

展开查看部分示例代码

void testCallback(int64_t consumed_bytes, int64_t total_bytes)
{
    printf("total :%ld, %ld\n", consumed_bytes, total_bytes);
}

VodApiResponse testUploadLocalImage(VodCredential authInfo)
{
    CreateUploadImageRequest request;
    //图片类型
    request.imageType = "default";
    //图片标题
    request.title = "testUploadLocalImage";
    UploadOptions uploadOptions;
    //设置上传脚本部署的ECS区域(如有),如与点播存储同一区域会自动启用内网上传
    //uploadOptions.ecsRegionId = "cn-shanghai";
    //设置自定义回调函数,否则设置为默认,设置为NULL不回调
    //uploadOptions.uploadProgressCallback = testCallback;
    VodApiResponse result = uploadLocalImage(authInfo, request, "./test.png", uploadOptions);
    return result;
}

VodApiResponse testUploadWebImage(VodCredential authInfo) {
    CreateUploadImageRequest request;
    request.imageType = "default";
    request.title = "testUploadWebImage";
    UploadOptions uploadOptions;
    //设置上传脚本部署的ECS区域(如有),如与点播存储同一区域会自动启用内网上传
    //uploadOptions.ecsRegionId = "cn-shanghai";
    //设置自定义回调函数,否则设置为默认,设置为NULL不回调
    //uploadOptions.uploadProgressCallback = testCallback;
    //设置下载临时目录,默认为/tmp/
    //uploadOptions.tmpDir = "/tmp/";
    VodApiResponse result = uploadWebImage(authInfo, request, "<Your Download Url>", uploadOptions);
    return result;
}

VodCredential initVodClient(std::string accessKeyId, std::string accessKeySecret) {
    VodCredential authInfo;
    authInfo.accessKeyId = accessKeyId;
    authInfo.accessKeySecret = accessKeySecret;
    authInfo.regionId = "cn-shanghai";
    return authInfo;
}

展开查看示例代码

int main(int argc, char * argv[]) {
    // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
    // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
    // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    VodCredential authInfo = initVodClient(std:getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), std:getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    VodApiResponse response;

    response = testUploadLocalImage(authInfo);
    //response = testUploadWebImage(authInfo);
    printf("httpCode: %d, result: %s\n", response.httpCode, response.result.c_str());
}

场景三:上传辅助媒资

展开查看部分示例代码

void testCallback(int64_t consumed_bytes, int64_t total_bytes)
{
    printf("total :%ld, %ld\n", consumed_bytes, total_bytes);
}

VodApiResponse testUploadLocalAttachedMedia(VodCredential authInfo)
{
    CreateUploadAttachedMediaRequest request;
    //业务类型
    request.businessType = "watermark";’
    //文件扩展名
    request.mediaExt = "png";
    //标题
    request.title = "testUploadLocalAttachedMedia";
    UploadOptions uploadOptions;
    //设置上传脚本部署的ECS区域(如有),如与点播存储同一区域会自动启用内网上传
    //uploadOptions.ecsRegionId = "cn-shanghai";
    //设置自定义回调函数,否则设置为默认,设置为NULL不回调
    //uploadOptions.uploadProgressCallback = testCallback;
    return uploadLocalAttachedMedia(authInfo, request, "./test.png", uploadOptions);
}

VodApiResponse testUploadWebAttachedMedia(VodCredential authInfo)
{
    CreateUploadAttachedMediaRequest request;
    //业务类型
    request.businessType = "watermark";
    //文件扩展名
    request.mediaExt = "png";
    //标题
    request.title = "testUploadWebAttachedMedia";
    UploadOptions uploadOptions;
    //设置上传脚本部署的ECS区域(如有),如与点播存储同一区域会自动启用内网上传
    //uploadOptions.ecsRegionId = "cn-shanghai";
    //设置自定义回调函数,否则设置为默认,设置为NULL不回调
    //uploadOptions.uploadProgressCallback = testCallback;
    //设置下载临时目录,默认为/tmp/
    //uploadOptions.tmpDir = "/tmp/";
    return uploadWebAttachedMedia(authInfo, request, "<Your Download Url>", uploadOptions);
}

VodCredential initVodClient(std::string accessKeyId, std::string accessKeySecret) {
    VodCredential authInfo;
    authInfo.accessKeyId = accessKeyId;
    authInfo.accessKeySecret = accessKeySecret;
    authInfo.regionId = "cn-shanghai";
    return authInfo;
}

展开查看部分示例代码

int main(int argc, char * argv[]) {
    // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
    // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
    // 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。运行代码示例前,请配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    VodCredential authInfo = initVodClient(std:getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), std:getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    VodApiResponse response;
    response = testUploadLocalAttachedMedia(authInfo);
    //response = testUploadWebAttachedMedia(authInfo);
    printf("httpCode: %d, result: %s\n", response.httpCode, response.result.c_str());
}

相关文档

媒体上传概述

STS SDK概览