全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
对象存储 OSS

使用场景

更新时间:2017-08-21 11:17:51

场景

在上两节分别介绍了客户端服务端的相关操作,接下来我们介绍如何将客户端和服务端连接起来使用,如果您还没有阅读前两节,强烈建议先阅读前两节,然后再阅读本节。

视频监控

在前言里面,介绍了可以方便的用于网络摄像头等设备,这里,会详细介绍一下如何使用。

流程

流程图

角色包括三个,网络摄像机,应用服务器,阿里云对象存储服务(OSS),网络摄像机内部使用OSS MEDIA C SDK的client部分,应用服务器内部使用OSS MEDIA C SDK的server部分。

当网络摄像机拍摄了一段视频,需要上传到OSS。流程如下:

  1. 首先,网络摄像机向应用服务器发送网络请求:要求获取一个上传视频到OSS的授权。
  2. 应用服务器收到请求后,通过检查觉得可以给网络摄像机上传的权限,就通过OSS MEDIA C SDK的get_token接口,向阿里云请求一个在特定有效期有效的,只有上传权限的token。
  3. 阿里云接收到应用服务器的获取token请求后,通过检查用户的配置,如果允许,就颁发一个临时token(包括临时access key id,临时access key secret和临时sts token):只有上传OSS的权限,且在特定时间内有效,然后发送给应用服务器。
  4. 应用服务器收到临时token后,转发给刚才要token的网络摄像机。
  5. 网络摄像机获取到token后,就可以通过OSS MEDIA C SDK client部分的oss_media_write接 口上传视频文件到OSS了。
  6. 还可以在应用服务器上使用C SDK的server部分或者JAVA, C#,Go,Python,Php,Ruby等SDK实现一个HTTP服务,这样其他人就可以在网页上查看,管理各个视频文件。

示例代码

下面是一个简单模拟客户端和服务端操作的示例程序:

  1. char* global_temp_access_key_id = NULL;
  2. char* global_temp_access_key_secret = NULL;
  3. char* global_temp_token = NULL;
  4. /* 授权函数 */
  5. static void auth_func(oss_media_file_t *file) {
  6. file->endpoint = "your endpoint";
  7. file->is_cname = 0;
  8. file->access_key_id = global_temp_access_key_id;
  9. file->access_key_secret = global_temp_access_key_secret;
  10. file->token = global_temp_token;
  11. /* 本次授权的有效时间 */
  12. file->expiration = time(NULL) + 300;
  13. }
  14. /* 模拟服务端发送token给客户端 */
  15. static void send_token_to_client(oss_media_token_t token) {
  16. global_temp_access_key_id = token.tmpAccessKeyId;
  17. global_temp_access_key_secret = token.tmpAccessKeySecret;
  18. global_temp_token = token.securityToken;
  19. }
  20. void get_and_use_token() {
  21. oss_media_token_t token;
  22. /* 服务端逻辑:从阿里云获取到临时token后发送给客户端 */
  23. {
  24. int ret;
  25. char *policy = NULL;
  26. oss_media_config_t config;
  27. policy = "{\n"
  28. "\"Statement\": [\n"
  29. "{"
  30. "\"Action\": \"oss:*\",\n"
  31. "\"Effect\": \"Allow\",\n"
  32. "\"Resource\": \"*\"\n"
  33. "}\n"
  34. "],\n"
  35. "\"Version\": \"1\"\n"
  36. "}\n";
  37. init_media_config(&config);
  38. /* 从阿里云请求一个临时授权token */
  39. ret = oss_media_get_token_from_policy(&config, policy,
  40. 17 * 60, &token);
  41. if (ret != 0) {
  42. printf ("Get token failed.");
  43. return;
  44. }
  45. /* 模拟将临时token发送给客户端 */
  46. send_token_to_client(token);
  47. }
  48. /* 客户端逻辑:从服务端获取到临时token后,使用临时token操作文件 */
  49. {
  50. int ret;
  51. int64_t write_size = 0;
  52. oss_media_file_t *file = NULL;
  53. char *content = NULL;
  54. char *bucket_name;
  55. char *object_key;
  56. oss_media_file_stat_t stat;
  57. content = "hello oss media file\n";
  58. bucket_name = "<your bucket name>";
  59. object_key = "key";
  60. /* 打开文件 */
  61. file = oss_media_file_open(bucket_name, object_key, "w", auth_func);
  62. if (file != NULL) {
  63. printf ("open file failed.");
  64. return;
  65. }
  66. /* 写文件 */
  67. write_size = oss_media_file_write(file, content, strlen(content));
  68. if (write_size != strlen(content)) {
  69. printf ("write file failed.");
  70. return;
  71. }
  72. /* 关闭文件释放资源 */
  73. oss_media_file_close(file);
  74. }
  75. }

提示:

  • Policy可以从阿里云访问控制RAM > 角色管理 > 点击某个角色 > 基本信息下面的方框中获取。
  • 如果不需要精准控制权限,可以使用更简单的oss_media_get_token接口,其中path参数可以是”/*”, mode参数可以是”rwa”。
  • 更详细的RAM、STS使用可以参考RAM和STS指南
本文导读目录