本文主要介绍OSS Media-C SDK的使用场景。

注意 请先了解客户端服务端的相关操作。

上传视频文件到OSS

前言章节中介绍了OSS Media-C SDK可以方便地用于网络摄像头等设备。

使用OSS Media-C SDK将网络摄像机拍摄的视频上传到OSS,步骤如下。
说明 网络摄像机对应OSS Media-C SDK的客户端(client)部分,应用服务器对应OSS Media-C SDK的服务端(server)部分。
  1. 网络摄像机向应用服务器请求获取上传视频到OSS的权限。
  2. 应用服务器收到请求后,通过OSS Media-C SDK的get_token接口,向阿里云请求一个在特定时间内有效、只有上传权限的token。
  3. 阿里云接收到应用服务器的获取token请求后,通过检查用户的配置,颁发一个临时token(包括临时access key id、临时access key secret和临时sts token),然后发送给应用服务器。该临时token只有上传OSS的权限,且仅在特定时间内有效。
  4. 应用服务器收到临时token后,将其转发给请求获取token的网络摄像机。
  5. 网络摄像机获取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。
  • 关于使用RAM、STS的更多信息,请参考RAM和STS指南