全部产品
云市场

PHP上传SDK

更新时间:2019-02-12 20:37:04

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安装

环境要求

  • PHP 5.3+,可通过php -v命令查看当前的PHP版本。若未安装,请到 PHP官网 下载合适的版本安装。
  • 确认已安装并启用相应扩展:php-mbstring、php_curl
  • 支持 Linux/Unix/Mac/Windows 多平台

安装SDK

访问下载页 服务端上传SDK下载,选择PHP版本下载。解压后拷贝 VodUploadSDK-PHP 目录下的 voduploadsdk 即可使用,samples 目录为示例代码。

更新SDK

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

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

使用说明

SDK结构

结构图

上传SDK下的文档结构(VodUploadSDK-PHP目录)如下:

  1. VodUploadSDK-PHP
  2. └───voduploadsdk
  3. ChangeLog.txt
  4. Autoloader.php
  5. └───uploader
  6. UploadVideoRequest.php
  7. UploadImageRequest.php
  8. UploadAttachedMediaRequest.php
  9. AliyunVodUploader.php
  10. AliyunVodUtils.php
  11. └───aliyun-php-sdk-core
  12. └───aliyun-php-sdk-oss
  13. └───aliyun-php-sdk-vod
  14. └───samples
  15. uploadVideo.php
  16. uploadImage.php
  17. uploadAttachedMedia.php

辅助文件

  • ChangeLog.txt 版本发布记录,首行即为当前SDK的版本号和发布日期。
  • Autoloader.php 类文件加载器,使用SDK时只需require此文件即可。

主体代码

  • UploadVideoRequest.php

  • UploadImageRequest.php

  • UploadAttachedMediaRequest.php

  • AliyunVodUploader.php,主要是AliyunVodUploader类

    • __construct,构造函数,可设置上传的 AccessKey点播接入区域
    • uploadLocalVideo,上传本地视频的接口。
    • uploadWebVideo,上传网络视频的接口。
    • uploadLocalImage,上传本地图片。
    • uploadWebImage,上传网络图片。
    • uploadLocalAttachedMedia,上传本地辅助媒资文件。
    • uploadWebAttachedMedia,上传网络辅助媒资文件。
    • uploadLocalM3u8,上传本地m3u8视频。
    • uploadWebM3u8,上传网络m3u8视频。
    • parseM3u8File,解析m3u8索引文件得到分片地址列表。
    • setEcsRegionId,设置上传脚本部署的ECS区域(如有),如与点播存储同一区域会自动启用内网上传。
    • setEnableSSL,是否启用SSL(网络请求使用HTTPS),默认不启用,以避免相关扩展未安装或配置异常时无法使用。
    • uploadProgressCallback,上传进度回调函数,可重写。
  • AliyunVodUtils.php

    • AliyunVodUtils,工具类,提供截取字符串、获取扩展名、获取文件名等静态函数。
    • AliyunVodLog,实现简单打印的日志类,$logSwitch为日志开关。
    • AliyunVodDownloader,实现下载网络文件。
    • AliyunVodReportUpload,实现上传进度汇报。
    • AliyunVodError,定义错误码。

依赖包

  • aliyun-php-sdk-core,上传SDK依赖的基础类,封装了阿里云API签名和HTTP请求等。
  • aliyun-php-sdk-vod,点播的服务端接口SDK,封装了点播API的请求。
  • aliyun-php-sdk-oss,上传SDK依赖的OSS类,封装了OSS上传等操作。

samples

  • uploadVideo.php,上传视频的示例代码。
  • uploadImage.php,上传图片的示例代码。
  • uploadAttachedMedia.php,上传辅助媒资的示例代码。

使用示例

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

  1. <?php
  2. /**
  3. * Created by Aliyun ApsaraVideo VoD.
  4. * User: https://www.aliyun.com/product/vod
  5. * API document: https://www.alibabacloud.com/help/zh/doc-detail/55407.htm
  6. */
  7. require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
  8. date_default_timezone_set('PRC');
  9. // 测试上传本地视频
  10. function testUploadLocalVideo($accessKeyId, $accessKeySecret, $filePath)
  11. {
  12. try {
  13. $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
  14. $uploadVideoRequest = new UploadVideoRequest($filePath, 'testUploadLocalVideo via PHP-SDK');
  15. //$uploadVideoRequest->setCateId(1);
  16. //$uploadVideoRequest->setCoverURL("http://xxxx.jpg");
  17. //$uploadVideoRequest->setTags('test1,test2');
  18. //$uploadVideoRequest->setStorageLocation('outin-xx.oss-cn-beijing.aliyuncs.com');
  19. //$uploadVideoRequest->setTemplateGroupId('6ae347b0140181ad371d197ebe289326');
  20. $userData = array(
  21. "MessageCallback"=>array("CallbackURL"=>"https://demo.sample.com/ProcessMessageCallback"),
  22. "Extend"=>array("localId"=>"xxx", "test"=>"www")
  23. );
  24. $uploadVideoRequest->setUserData(json_encode($userData));
  25. $res = $uploader->uploadLocalVideo($uploadVideoRequest);
  26. print_r($res);
  27. } catch (Exception $e) {
  28. printf("testUploadLocalVideo Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
  29. $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
  30. }
  31. }
  32. // 测试上传网络视频
  33. function testUploadWebVideo($accessKeyId, $accessKeySecret, $fileURL)
  34. {
  35. try {
  36. $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
  37. $uploadVideoRequest = new UploadVideoRequest($fileURL, 'testUploadWebVideo via PHP-SDK');
  38. $res = $uploader->uploadWebVideo($uploadVideoRequest);
  39. print_r($res);
  40. } catch (Exception $e) {
  41. printf("testUploadWebVideo Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
  42. $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
  43. }
  44. }
  45. // 测试上传本地m3u8视频
  46. function testUploadLocalM3u8($accessKeyId, $accessKeySecret, $m3u8FilePath)
  47. {
  48. try {
  49. $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
  50. $uploadVideoRequest = new UploadVideoRequest($m3u8FilePath, 'testUploadLocalM3u8 via PHP-SDK');
  51. // 调用接口解析m3u8的分片地址列表,如果解析结果不准确,请自行拼接地址列表(默认分片文件和m3u8文件位于同一目录)
  52. $sliceFiles = $uploader->parseM3u8File($m3u8FilePath);
  53. //print_r($sliceFiles);
  54. $res = $uploader->uploadLocalM3u8($uploadVideoRequest, $sliceFiles);
  55. print_r($res);
  56. } catch (Exception $e) {
  57. printf("testUploadLocalM3u8 Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
  58. $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
  59. }
  60. }
  61. // 测试上传网络m3u8视频
  62. function testUploadWebM3u8($accessKeyId, $accessKeySecret, $m3u8FileUrl)
  63. {
  64. try {
  65. $uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
  66. $uploadVideoRequest = new UploadVideoRequest($m3u8FileUrl, 'testUploadWebM3u8 via PHP-SDK');
  67. // 调用接口解析m3u8的分片地址列表,如果解析结果不准确,请自行拼接地址列表(默认分片文件和m3u8文件位于同一目录)
  68. $sliceFileUrls = $uploader->parseM3u8File($m3u8FileUrl);
  69. //print_r($sliceFileUrls);
  70. $res = $uploader->uploadWebM3u8($uploadVideoRequest, $sliceFileUrls);
  71. print_r($res);
  72. } catch (Exception $e) {
  73. printf("testUploadWebM3u8 Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
  74. $e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
  75. }
  76. }
  77. #### 执行测试代码 ####
  78. $accessKeyId = '<AccessKeyId>';
  79. $accessKeySecret = '<AccessKeySecret>';
  80. //$localFilePath = 'C:\test\sample.mp4';
  81. $localFilePath = '/opt/video/sample.mp4';
  82. //testUploadLocalVideo($accessKeyId, $accessKeySecret, $localFilePath);
  83. $webFileURL = 'http://vod-test1.cn-shanghai.aliyuncs.com/b55b904bc612463b812990b7c8cc95c8/daa30814c0c340cf8199926f78aa5c0e-a0bc05ba62c3e95cc672e88b828148c9-ld.mp4?auth_key=1608774986-0-0-c56acd302bea0c331370d8ed686502fe';
  84. testUploadWebVideo($accessKeyId, $accessKeySecret, $webFileURL);
  85. $localM3u8FilePath = '/opt/video/m3u8/sample.m3u8';
  86. //testUploadLocalM3u8($accessKeyId, $accessKeySecret, $localM3u8FilePath);
  87. $webM3u8FileURL = 'http://vod-test1.cn-shanghai.aliyuncs.com/b55b904bc612463b812990b7c8cc95c8/daa30814c0c340cf8199926f78aa5c0e-195a25af366b5edae324c47e99a03f04-ld.m3u8?auth_key=1608775606-0-0-9fb038deaecd009dadd86721c5855629';
  88. //testUploadWebM3u8($accessKeyId, $accessKeySecret, $webM3u8FileURL);

更多示例代码请参考解压后 VodUploadSDK-PHP 目录下的 samples 目录。

常见问题

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

  • 如何获知上传进度?
    AliyunVodUploader类的uploadProgressCallback接口接收上传进度回调,可获取上传的媒体ID(视频ID)、已上传大小、总大小等信息,可重写此函数实现自己的上传进度回调。

  • 如何关闭日志打印?
    AliyunVodUtils.php文件的AliyunVodLog类,$logSwitch为日志打印开关,更改为false即可关闭日志打印。

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

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

  • 支持Windows下执行吗?
    本SDK支持Linux/Unix/Mac/Windows等多种平台,但都需要安装PHP及相应扩展(如php-mbstring等)。

  • 遇到连接不上怎么处理?
    请先确认连接外网是否有问题,可 ping vod.cn-shanghai.aliyuncs.com 看看是否能连接阿里云点播服务器,如连接有问题可确认您的网络配置,如是否允许连接外网。其次,确认是否开启了SSL,如果使用了HTTPS请求,可能相应扩展(如php_openssl)没有正确安装,或配置有问题。