本文主要介绍OSS Media-C SDK的使用场景。
上传视频文件到OSS
在前言章节中介绍了OSS Media-C SDK可以方便地用于网络摄像头等设备。
使用OSS Media-C SDK将网络摄像机拍摄的视频上传到OSS,步骤如下。
说明 网络摄像机对应OSS Media-C SDK的客户端(client)部分,应用服务器对应OSS Media-C SDK的服务端(server)部分。
- 网络摄像机向应用服务器请求获取上传视频到OSS的权限。
- 应用服务器收到请求后,通过OSS Media-C SDK的get_token接口,向阿里云请求一个在特定时间内有效、只有上传权限的Token。
- 阿里云接收到应用服务器的获取token请求后,通过检查用户的配置,颁发一个临时Token(包括临时AccessKey ID、临时AccessKey Secret和临时STS Token),然后发送给应用服务器。该临时Token只有上传OSS的权限,且仅在特定时间内有效。
- 应用服务器收到临时Token后,将其转发给请求获取Token的网络摄像机。
- 网络摄像机获取Token后,通过OSS Media-C SDK Client部分的oss_media_write接口将视频文件上传到OSS。
说明 您还可以在应用服务器中使用OSS Media-C SDK的server部分,或者通过Java、Go、Python、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); } }
说明
- Policy可以从阿里云的RAM角色管理的任意RAM角色下的策略内容中获取。
- 如果不需要精准控制权限,可以使用更简单的oss_media_get_token接口,其中path参数可以是/*,mode参数可以是rwa。