全部产品
云市场

C/C++上传SDK

更新时间:2019-06-12 12:23:20

SDK介绍

简介

点播服务(VoD)基于对象存储(OSS)构建,开通VoD时会自动分配独立的系统Bucket,以存储各种媒体文件,包括上传的视频、音频、图片等源文件,以及转码后的输出文件、截图和封面等等,并作为点播加速域名的源站。使用VoD上传SDK能方便、快速实现媒体文件的上传。支持的文件格式参考 媒体上传文件支持

功能介绍

使用此上传SDK可实现以下功能:

主要功能

  1. 可上传各种媒体文件到点播:视频(含音频)、图片、辅助媒资(如水印、字幕文件)。
  2. 上传本地媒体文件到点播,默认使用分片上传,最大支持48.8TB的单个文件;暂不支持断点续传。
  3. 上传网络媒体文件到点播,最大支持48.8TB的单个文件,会先下载到本地临时目录再上传;暂不支持断点续传。
  4. 上传M3U8视频,同时提供解析M3U8索引文件得到分片地址列表的接口;也可自行指定分片文件地址。

其它功能

  1. 上传进度条功能,支持默认进度回调和自定义进度回调。
  2. 可指定上传脚本部署的ECS区域,如果和点播存储区域相同,则自动使用内网上传,上传更快且更省公网流量。
  3. 可指定点播中心和存储区域,便于海外上传。
  4. 支持上传时设置元数据(标题等),以及StorageLocation、UserData、转码模板等。

SDK安装

环境要求

  • 点播C/C++上传SDK与C/C++服务端SDK统一,具体环境准备、SDK安装及初始化等可参考C/C++SDK使用指南

安装SDK

访问下载页 服务端上传SDK下载,选择C/C++版本下载,并按照上述方式进行安装。

更新SDK

若发现新的接口或已有接口新的功能在当前SDK没有,可更新到最新版:下载最新的 C/C++版上传SDK,解压后覆盖现有文件。

解压后aliyun-c-sdk-vod目录下的 ChangeLog.txt 为发版记录,首行即为当前SDK的版本号和发布日期。

使用说明

SDK结构

辅助文件

  • ChangeLog.txt 版本发布记录,首行即为当前SDK的版本号和发布日期。

头文件

  • upload.h
    • 上传功能头文件,包含基础上传结构体、上传参数以及上传函数等。

基础结构体

  • CreateUploadVideoRequest

  • CreateUploadImageRequest

  • CreateUploadAttachedMediaRequest

  • UploadOptions

    • UploadOptions,上传参数结构体,包含如下参数:
      • void (*uploadProgressCallback) (int64_t, int64_t),用于实现自定义上传进度回调,如果不设置则使用默认,设置为NULL则不进行回调。
      • ecsRegionId,设置上传脚本部署的ECS区域(如有),如与点播存储同一区域会自动启用内网上传。
      • multipartUploadLimit,分片上传阈值,单位字节,默认为10MB(只对视频上传有效)。
      • multipartUploadOnceSize,分片大小,单位字节,默认为10MB(只对视频上传有效)。
      • tmpDir 本地临时存储地址,只对网络上传方式生效。

上传函数

  • uploadLocalVideo,上传本地视频的接口。
  • uploadWebVideo,上传网络视频的接口。
  • uploadLocalImage,上传本地图片。
  • uploadWebImage,上传网络图片。
  • uploadLocalAttachedMedia,上传本地辅助媒资文件。
  • uploadWebAttachedMedia,上传网络辅助媒资文件。
  • uploadLocalM3u8,上传本地m3u8视频。
  • uploadWebM3u8,上传网络m3u8视频。

samples

  • UploadVideo.cpp,上传视频的示例代码。
  • UploadImage.cpp,上传图片的示例代码。
  • UploadAttachedMedia.cpp,上传辅助媒资的示例代码。

使用示例

以上传本地视频和网络视频文件为例:

  1. void testCallback(int64_t consumed_bytes, int64_t total_bytes)
  2. {
  3. printf("total :%ld, %ld\n", consumed_bytes, total_bytes);
  4. }
  5. // 测试上传本地视频
  6. VodApiResponse testUploadLocalVideo(VodCredential authInfo) {
  7. CreateUploadVideoRequest request;
  8. request.fileName = "testLocal.mp4";
  9. request.title = "testUploadLocalVideo";
  10. request.cateId = "1";
  11. request.coverURL = "http://xxxx.jpg";
  12. request.tags = "test1,test2";
  13. request.templateGroupId = "6ae347b0140181ad371d197ebe289326";
  14. requests.torageLocation. = "outin-xx.oss-cn-beijing.aliyuncs.com";
  15. Json::Value userData;
  16. Json::Value callbackUrl;
  17. callbackUrl["CallbackURL"] = "https://demo.sample.com/ProcessMessageCallback";
  18. userData["MessageCallback"] = callbackUrl;
  19. Json::Value extend;
  20. extend["localId"] = "xxx";
  21. extend["test"] = "www";
  22. userData["Extend"] = extend;
  23. request.userData = userData.toStyledString();
  24. UploadOptions uploadOptions;
  25. //设置上传脚本部署的ECS区域(如有),如与点播存储同一区域会自动启用内网上传
  26. //uploadOptions.ecsRegionId = "cn-shanghai";
  27. //设置自定义回调函数,否则设置为默认,设置为NULL不回调
  28. //uploadOptions.uploadProgressCallback = testCallback;
  29. //uploadOptions.multipartUploadLimit = 20*1024*1024;//设置分片上传阈值
  30. //uploadOptions.multipartUploadOnceSize = 10*1024*1024;//设置分片上传分片大小
  31. VodApiResponse result = uploadLocalVideo(authInfo, request, "./test.mp4", uploadOptions);
  32. return result;
  33. }
  34. // 测试上传网络视频
  35. VodApiResponse testUploadWebVideo(VodCredential authInfo) {
  36. CreateUploadVideoRequest request;
  37. request.fileName = "testWeb.mp4";
  38. request.title = "testUploadWebVideo";
  39. UploadOptions uploadOptions;
  40. //设置上传脚本部署的ECS区域(如有),如与点播存储同一区域会自动启用内网上传
  41. //uploadOptions.ecsRegionId = "cn-shanghai";
  42. //设置自定义回调函数,否则设置为默认,设置为NULL不回调
  43. //uploadOptions.uploadProgressCallback = testCallback;
  44. //uploadOptions.multipartUploadLimit = 20*1024*1024;//设置分片上传阈值
  45. //uploadOptions.multipartUploadOnceSize = 10*1024*1024;//设置分片上传分片大小
  46. //设置下载临时目录,默认为/tmp/
  47. //uploadOptions.tmpDir = "/tmp/";
  48. VodApiResponse result = uploadWebVideo(authInfo, request, "<Your Download Url>", uploadOptions);
  49. return result;
  50. }
  51. // 测试上传本地m3u8视频
  52. VodApiResponse testUploadLocalM3u8(VodCredential authInfo) {
  53. CreateUploadVideoRequest request;
  54. request.fileName = "testLocal.m3u8";
  55. request.title = "testUploadLocalM3u8";
  56. list<string> tsList;
  57. //注意:如果不添加则会自动解析
  58. //tsList.push_back("/tmp/1.ts");
  59. UploadOptions uploadOptions;
  60. VodApiResponse result = uploadLocalM3u8(authInfo, request, "./test.m3u8", tsList, uploadOptions);
  61. return result;
  62. }
  63. // 测试上传网络m3u8视频
  64. VodApiResponse testUploadWebM3u8(VodCredential authInfo) {
  65. CreateUploadVideoRequest request;
  66. request.fileName = "testWeb.m3u8";
  67. request.title = "testUploadWebM3u8";
  68. list<string> tsList;
  69. //注意:如果不添加则会自动解析
  70. //tsList.push_back("<Ts1 Download Url>");
  71. //tsList.push_back("<Ts2 Download Url>");
  72. UploadOptions uploadOptions;
  73. VodApiResponse result = uploadWebM3u8(authInfo, request, "<Your M3u8 Download Url>", tsList, uploadOptions);
  74. return result;
  75. }
  76. #### 调用测试代码 ####
  77. VodCredential initVodClient(std::string accessKeyId, std::string accessKeySecret) {
  78. VodCredential authInfo;
  79. authInfo.accessKeyId = accessKeyId;
  80. authInfo.accessKeySecret = accessKeySecret;
  81. authInfo.regionId = "cn-shanghai";
  82. return authInfo;
  83. }
  84. int main(int argc, char * argv[]) {
  85. VodCredential authInfo = initVodClient("<Your AccessKeyId>", "<Your AccessKeySecret>");
  86. VodApiResponse response;
  87. response = testUploadLocalVideo(authInfo);
  88. //response = testUploadWebVideo(authInfo);
  89. //response = testUploadLocalM3u8(authInfo);
  90. //response = testUploadWebM3u8(authInfo);
  91. printf("httpCode: %d, result: %s\n", response.httpCode, response.result.c_str());
  92. }

更多示例代码请参考解压后 aliyun-c-sdk-vod 目录下的 samples 目录。

常见问题

  • 如何实现内网上传?
    在点播控制台 存储管理 查看 媒资存储区域,将上传脚本部署在对应区域的ECS上,然后在初始化AliyunVodUploader类实例后,调用setEcsRegionId接口设置对应区域,如:cn-shanghai等。

  • 如何获知上传进度?
    UploadOptions中的uploadProgressCallback函数指针指向回调函数地址,可获取已上传大小、总大小等信息,可重新赋值该成员实现自己的上传进度回调。

  • 上传是同步还是异步?
    本SDK上传时都为同步,会阻塞相应进程或线程,如要实现异步,建议使用单独线程上传。

  • 支持断点续传吗?
    暂时不支持断点续传,重新上传时会创建新的视频(或图片等);后续版本会支持,时间待定。

  • 遇到连接不上怎么处理?
    请先确认连接外网是否有问题,可 ping vod.cn-shanghai.aliyuncs.com 看看是否能连接阿里云点播服务器,如连接有问题可确认您的网络配置,如是否允许连接外网