整體說明
從內部邏輯角度看,C/C++上傳SDK遵循點播服務端SDK的通用流程。詳情請參見上傳流程。從操作角度看,使用C/C++上傳SDK的基礎流程如下:
完成前提條件。請參見前提條件。
整合C/C++上傳SDK。請參見整合C/C++上傳SDK。
實現上傳邏輯(主要是上傳資訊配置)。
前提條件
您已經開通了ApsaraVideo for VOD服務。開通步驟請參見開通ApsaraVideo for VOD服務。
您已經完成上傳相關的系統配置,包括啟用目標儲存地區的儲存地址和配置回調。操作指引請參見管理儲存Bucket及回調設定。
您已準備好用於調用點播服務的帳號。為避免阿里雲帳號AccessKey泄露帶來的安全風險,推薦您建立RAM使用者並授予其VOD相關許可權。然後使用RAM使用者的AK對(AccessKey ID和AccessKey Secret)訪問點播服務。操作指引請參見建立RAM使用者並授權。
已配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具體操作,請參見在Linux、macOS和Windows系統配置環境變數。
(可選)如需使用STS臨時授權方式(阿里雲Security Token Service)訪問點播服務,請為RAM使用者建立角色並授予角色VOD相關許可權。操作指引請參見使用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
| |
libcurl | 解決網路連接等問題 | | |
libuuid | 產生uuid | 安裝樣本: sudo yum install libuuid-devel
| 不涉及 |
apr | 不涉及 | 安裝樣本: sudo yum install apr-devel
| |
apr-util | 解決記憶體管理以及跨平台問題 | 安裝樣本: sudo yum install apr-util
| |
minixml | 解析請求返回的xml | 安裝樣本: sudo yum install mxml mxml-devel
| |
jsoncpp | 解析請求返回的JSON | 安裝樣本: sudo yum install jsoncpp-devel
| |
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 | 上傳輔助媒資的範例程式碼。 |
情境一:上傳音視頻
普通音視頻
展開查看範例程式碼
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());
}