全部產品
Search
文件中心

ApsaraVideo VOD:使用C/C++ SDK上傳檔案

更新時間:Jul 13, 2024

本文通過樣本詳細介紹如何使用服務端上傳SDK(C/C++語言)將各類媒體檔案上傳至點播儲存。

整體說明

從內部邏輯角度看,C/C++上傳SDK遵循點播服務端SDK的通用流程。詳情請參見上傳流程。從操作角度看,使用C/C++上傳SDK的基礎流程如下:

  1. 完成前提條件。請參見前提條件

  2. 整合C/C++上傳SDK。請參見整合C/C++上傳SDK

  3. 實現上傳邏輯(主要是上傳資訊配置)。

前提條件

  • 您已經開通了ApsaraVideo for VOD服務。開通步驟請參見開通ApsaraVideo for VOD服務

  • 您已經完成上傳相關的系統配置,包括啟用目標儲存地區的儲存地址和配置回調。操作指引請參見管理儲存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

說明
  • ApsaraVideo for VOD服務端C/C++上傳SDK僅支援Linux環境。

  • 此處以SDK1.0.0版本舉例說明。其他版本請根據實際情況操作。

  • 上傳SDK及範例程式碼解壓後的目錄詳細資料,請參見下文目錄說明

  • 本文以普通使用者執行操作為例進行安裝命令說明。

使用ApsaraVideo for VOD服務端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地區(如果有),如果與ApsaraVideo for VOD儲存同一地區會自動啟用內網上傳。

  • 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地區(如果有),如與ApsaraVideo for VOD儲存同一地區會自動啟用內網上傳
    //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地區(如果有),如與ApsaraVideo for VOD儲存同一地區會自動啟用內網上傳
    //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概覽