本文通過示例詳細介紹如何使用服務端上傳SDK(C/C++語言)將各類媒體文件上傳至點播存儲。
整體說明
從內部邏輯角度看,C/C++上傳SDK遵循點播服務端SDK的通用流程。詳情請參見上傳流程。從操作角度看,使用C/C++上傳SDK的基礎流程如下:
完成前提條件。請參見前提條件。
集成C/C++上傳SDK。請參見集成C/C++上傳SDK。
實現上傳邏輯(主要是上傳信息配置)。
音視頻上傳請參見場景一:上傳音視頻。
圖片上傳請參見場景二:上傳圖片。
輔助媒資上傳請參見場景三:上傳輔助媒資。
前提條件
您已經開通了視頻點播服務。開通步驟請參見開通視頻點播服務。
您已經完成上傳相關的系統配置,包括啟用目標存儲地域的存儲地址和配置回調。操作指引請參見管理存儲Bucket及回調設置。
您已準備好用于調用點播服務的賬號。為避免阿里云賬號AccessKey泄露帶來的安全風險,推薦您創建RAM用戶并授予其VOD相關權限。然后使用RAM用戶的AK對(AccessKey ID和AccessKey Secret)訪問點播服務。操作指引請參見創建RAM用戶并授權。
已配置環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_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 | 第三方編譯安裝工具 |
|
|
libcurl | 解決網絡連接等問題 |
|
|
libuuid | 生成uuid | 安裝示例:
| 不涉及 |
apr | 不涉及 | 安裝示例:
|
|
apr-util | 解決內存管理以及跨平臺問題 | 安裝示例:
|
|
minixml | 解析請求返回的xml | 安裝示例:
|
|
jsoncpp | 解析請求返回的JSON | 安裝示例:
|
|
OSS SDK | 由于上傳SDK依賴OSS,需要下載并安裝OSS SDK | 不涉及 | 下載地址和安裝步驟,請參見OSS SDK安裝。 重要 有部分OSS依賴庫已經在前面步驟進行安裝,已經安裝的不需要再次進行重復安裝。 |
C/C++上傳SDK | 上傳文件 | 不涉及 | 下載地址:上傳SDK 安裝示例:
|
更新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 | 上傳參數結構體,包含如下參數:
|
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函數。
M3U8文件
場景二:上傳圖片
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());
}