場景
在上兩節分別介紹了用戶端和服務端的相關操作,接下來我們介紹如何將用戶端和服務端連接起來使用,如果您還沒有閱讀前兩節,強烈建議先閱讀前兩節,然後再閱讀本節。
視頻監控
在前言裡面,介紹了可以方便的用於網路攝影機等裝置,這裡,會詳細介紹一下如何使用。
流程
角色包括三個,網路攝像機,應用伺服器,阿里雲Object Storage Service服務(OSS),網路攝像機內部使用OSS MEDIA C SDK的client部分,應用伺服器內部使用OSS MEDIA C SDK的server部分。
當網路攝像機拍攝了一段視頻,需要上傳到OSS。流程如下:
- 首先,網路攝像機嚮應用伺服器發送網路請求:要求獲取一個上傳視頻到OSS的授權。
- 應用伺服器收到請求後,通過檢查覺得可以給網路攝像機上傳的許可權,就通過OSS MEDIA C SDK的get_token介面,向阿里雲請求一個在特定有效期間有效,只有上傳許可權的token。
- 阿里雲接收到應用伺服器的獲取token請求後,通過檢查使用者的配置,如果允許,就頒發一個臨時token(包括臨時access key id,臨時access key secret和臨時sts token):只有上傳OSS的許可權,且在特定時間內有效,然後發送給應用伺服器。
- 應用伺服器收到臨時token後,轉寄給剛才要token的網路攝像機。
- 網路攝像機獲取到token後,就可以通過OSS MEDIA C SDK client部分的oss_media_write接 口上傳視頻檔案到OSS了。
- 還可以在應用伺服器上使用C SDK的server部分或者JAVA, C#,Go,Python,Php,Ruby等SDK實現一個HTTP服務,這樣其他人就可以在網頁上查看,管理各個視頻檔案。
範例程式碼
下面是一個簡單模擬用戶端和服務端操作的樣本程式:
char* global_temp_access_key_id = NULL;
char* global_temp_access_key_secret = NULL;
char* global_temp_token = NULL;
/* 授權函數 */
static void auth_func(oss_media_file_t *file) {
file->endpoint = "your endpoint";
file->is_cname = 0;
file->access_key_id = global_temp_access_key_id;
file->access_key_secret = global_temp_access_key_secret;
file->token = global_temp_token;
/* 本次授權的有效時間 */
file->expiration = time(NULL) + 300;
}
/* 模擬服務端發送token給用戶端 */
static void send_token_to_client(oss_media_token_t token) {
global_temp_access_key_id = token.tmpAccessKeyId;
global_temp_access_key_secret = token.tmpAccessKeySecret;
global_temp_token = token.securityToken;
}
void get_and_use_token() {
oss_media_token_t token;
/* 服務端邏輯:從阿里雲獲取到臨時token後發送給用戶端 */
{
int ret;
char *policy = NULL;
oss_media_config_t config;
policy = "{\n"
"\"Statement\": [\n"
"{"
"\"Action\": \"oss:*\",\n"
"\"Effect\": \"Allow\",\n"
"\"Resource\": \"*\"\n"
"}\n"
"],\n"
"\"Version\": \"1\"\n"
"}\n";
init_media_config(&config);
/* 從阿里雲請求一個臨時授權token */
ret = oss_media_get_token_from_policy(&config, policy,
17 * 60, &token);
if (ret != 0) {
printf ("Get token failed.");
return;
}
/* 模擬將臨時token發送給用戶端 */
send_token_to_client(token);
}
/* 用戶端邏輯:從服務端獲取到臨時token後,使用臨時token操作檔案 */
{
int ret;
int64_t write_size = 0;
oss_media_file_t *file = NULL;
char *content = NULL;
char *bucket_name;
char *object_key;
oss_media_file_stat_t stat;
content = "hello oss media file\n";
bucket_name = "<your bucket name>";
object_key = "key";
/* 開啟檔案 */
file = oss_media_file_open(bucket_name, object_key, "w", auth_func);
if (file != NULL) {
printf ("open file failed.");
return;
}
/* 寫檔案 */
write_size = oss_media_file_write(file, content, strlen(content));
if (write_size != strlen(content)) {
printf ("write file failed.");
return;
}
/* 關閉檔案釋放資源 */
oss_media_file_close(file);
}
}
提示: