整體說明
說明 建議在PHP中構建BS(Browser/Server)架構進行開發。
從內部邏輯角度看,PHP上傳SDK遵循點播服務端SDK的通用流程。詳情請參見上傳流程。從操作角度看,使用PHP上傳SDK的基礎流程如下:
完成前提條件。請參見前提條件。
整合PHP上傳SDK。請參見整合PHP上傳SDK。
實現上傳邏輯(主要是上傳資訊配置)。
PHP上傳SDK預設服務存取點為cn-shanghai(上海), 若需要上傳媒體檔案到其他地區,可以通過AliyunVodUploader在初始化時指定地區,點播支援的服務存取點,請參見服務存取點。
以指定上傳地區為cn-beijing(北京)為例,配置樣本如下:
$apiRegionId = 'cn-beijing'; //上傳目的地區域region
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret, $apiRegionId);
前提條件
您已經開通了ApsaraVideo for VOD服務。開通步驟請參見開通ApsaraVideo for VOD服務。
您已經完成上傳相關的系統配置,包括啟用目標儲存地區的儲存地址和配置回調。操作指引請參見管理儲存Bucket及回調設定。
您已準備好用於調用點播服務的帳號。為避免阿里雲帳號AccessKey泄露帶來的安全風險,推薦您建立RAM使用者並授予其VOD相關許可權。然後使用RAM使用者的AK對(AccessKey ID和AccessKey Secret)訪問點播服務。操作指引請參見建立RAM使用者並授權。
已配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具體操作,請參見在Linux、macOS和Windows系統配置環境變數。
(可選)如需使用STS臨時授權方式(阿里雲Security Token Service)訪問點播服務,請為RAM使用者建立角色並授予角色VOD相關許可權。操作指引請參見擷取STS Token。
整合PHP上傳SDK
下載 SDK及demo樣本。
解壓VodUploadSDK-PHP_1.0.3.zip,將VodUploadSDK-PHP_1.0.3目錄下的voduploadsdk複製到您的專案中。
PHP上傳SDK目錄說明
/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/voduploadsdk/uploader
UploadVideoRequest.php
UploadImageRequest.php
UploadAttachedMediaRequest.php
AliyunVodUploader.php
目錄 | 說明 |
__construct | 可設定上傳的AccessKey以及ApsaraVideo for VOD中心和訪問網域名稱。請參見AccessKey和點播地區標識。 |
uploadLocalVideo | 上傳本地視頻的介面。 |
uploadWebVideo | 上傳網路視頻的介面。 |
uploadLocalImage | 上傳本地圖片。 |
uploadWebImage | 上傳網狀圖片。 |
uploadLocalAttachedMedia | 上傳本地輔助媒資檔案。 |
uploadWebAttachedMedia | 上傳網路輔助媒資檔案。 |
uploadLocalM3u8 | 上傳本地m3u8檔案。 |
uploadWebM3u8 | 上傳網路m3u8檔案。 |
parseM3u8File | 解析m3u8索引檔案得到分區地址清單。 |
setEcsRegionId | 設定上傳指令碼部署的ECS地區(如果有),如果與ApsaraVideo for VOD儲存同一地區會自動啟用內網上傳。 |
setEnableSSL | 是否啟用SSL(網路請求使用HTTPS),預設不啟用,以避免相關擴充未安裝或配置異常時無法使用。 |
uploadProgressCallback | 上傳進度回呼函數,可重寫。詳見下方方法簽名與重寫樣本。 |
uploadProgressCallback 方法簽名
public function uploadProgressCallback($mediaId, $consumedBytes, $totalBytes)
$mediaId:媒體 ID。
$consumedBytes:已上傳的位元組數。
$totalBytes:檔案總位元組數。
上傳進度百分比的計算方式為:100 * ($consumedBytes / $totalBytes)。計算前請判斷 $totalBytes 是否為 0,避免除零錯誤。
繼承 AliyunVodUploader 並重寫該方法,可以實現自訂的上傳進度展示,樣本如下:
class MyAliyunVodUploader extends AliyunVodUploader {
public function uploadProgressCallback($mediaId, $consumedBytes, $totalBytes) {
if ($totalBytes > 0) {
$rate = 100 * (floatval($consumedBytes) / floatval($totalBytes));
} else {
$rate = 0;
}
echo round($rate, 1) . "%
";
flush();
}
}
AliyunVodUtils.php
目錄 | 說明 |
AliyunVodUtils | 工具類,提供截取字串、擷取副檔名、擷取檔案名稱等靜態函數。 |
AliyunVodLog | 實現簡單列印的日誌類,logSwitch為日誌開關。 |
AliyunVodDownloader | 實現下載網路檔案。 |
AliyunVodReportUpload | 實現上傳進度彙報。 |
AliyunVodError | 定義錯誤碼。 |
/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/voduploadsdk
aliyun-php-sdk-core:上傳SDK依賴的基礎類,封裝了阿里雲API簽名和HTTP請求等。
aliyun-php-sdk-vod:ApsaraVideo for VOD的服務端介面SDK,封裝了ApsaraVideo for VODAPI的請求。
aliyun-php-sdk-oss:上傳SDK依賴的OSS類,封裝了OSS上傳等操作。
/VodUploadSDK-PHP_1.0.3.zip解壓目錄/VodUploadSDK-PHP_1.0.3/samples
uploadVideo.php:上傳視頻的範例程式碼。
uploadImage.php:上傳圖片的範例程式碼。
uploadAttachedMedia.php:上傳輔助媒資的範例程式碼。
情境一:上傳音視頻
普通音視頻
展開查看範例程式碼
<?php
/**
* Created by Aliyun ApsaraVideo VOD.
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
//測試上傳本地視頻
function testUploadLocalVideo($accessKeyId, $accessKeySecret, $filePath)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($filePath, 'testUploadLocalVideo via PHP-SDK');
// CateId為媒資分類ID,可通過點播控制台**組態管理**>**媒資管理配置**>**分類管理**頁面查看,或通過AddCategory介面建立。詳情請參見[管理媒資分類](https://www.alibabacloud.com/help/zh/vod/user-guide/manage-video-categories)。
$uploadVideoRequest->setCateId(<您的分類ID>);
//CoverURL樣本:http://example.com/example****.jpg
//$uploadVideoRequest->setCoverURL("<your CoverURL>");
//$uploadVideoRequest->setTags('test1,test2');
//$uploadVideoRequest->setStorageLocation('outin-xx.oss-cn-beijing.aliyuncs.com');
$uploadVideoRequest->setTemplateGroupId('your-template-group-id');
$userData = array(
//Callback樣本:https://demo.aliyundoc.com/ProcessMessageCallback
"MessageCallback"=>array("CallbackURL"=>"<your callback URL>"),
"Extend"=>array("localId"=>"xxx", "test"=>"www")
);
$uploadVideoRequest->setUserData(json_encode($userData));
$res = $uploader->uploadLocalVideo($uploadVideoRequest);
print_r($res);
} catch (Exception $e) {
printf("testUploadLocalVideo Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
$e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
}
}
// 測試上傳網路視頻
function testUploadWebVideo($accessKeyId, $accessKeySecret, $fileURL)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($fileURL, 'testUploadWebVideo via PHP-SDK');
$res = $uploader->uploadWebVideo($uploadVideoRequest);
print_r($res);
} catch (Exception $e) {
printf("testUploadWebVideo Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
$e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
}
}
#### 執行測試代碼 ####
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$localFilePath = '/opt/video/sample.mp4';
// testUploadLocalVideo($accessKeyId, $accessKeySecret, $localFilePath);
// webFileURL樣本:http://example-bucket-****.cn-shanghai.aliyuncs.com/b55b904bc612463b812990b7c8cc****/daa30814c0c340cf8199926f78aa****-a0bc05ba62c3e95cc672e88b8281****-ld.mp4?auth_key=1608774986-0-0-c56acd302bea0c331370d8ed6865****
$webFileURL = '<your webFileURL>';
testUploadWebVideo($accessKeyId, $accessKeySecret, $webFileURL);
uploadLocalVideo支援通過setTemplateGroupId()在上傳時指定轉碼模板組ID。指定後視頻上傳完成即自動轉碼,無需調用SubmitTranscodeJobs介面。轉碼模板組ID可在VOD控制台 > 組態管理 > ApsaraVideo for Media Processing配置 > 轉碼模板組頁面查看。
M3U8視頻檔案
部分程式碼範例如下所示:
展開查看範例程式碼
<?php
/**
* Created by Aliyun ApsaraVideo VOD.
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
// 測試上傳本地m3u8視頻
function testUploadLocalM3u8($accessKeyId, $accessKeySecret, $m3u8FilePath)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($m3u8FilePath, 'testUploadLocalM3u8 via PHP-SDK');
// 調用介面解析m3u8的分區地址清單,如果解析結果不準確,請自行拼接地址清單(預設分區檔案和m3u8檔案位於同一目錄)
$sliceFiles = $uploader->parseM3u8File($m3u8FilePath);
//print_r($sliceFiles);
$res = $uploader->uploadLocalM3u8($uploadVideoRequest, $sliceFiles);
print_r($res);
} catch (Exception $e) {
printf("testUploadLocalM3u8 Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
$e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
}
}
// 測試上傳網路m3u8視頻
function testUploadWebM3u8($accessKeyId, $accessKeySecret, $m3u8FileUrl)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($m3u8FileUrl, 'testUploadWebM3u8 via PHP-SDK');
// 調用介面解析m3u8的分區地址清單,如果解析結果不準確,請自行拼接地址清單(預設分區檔案和m3u8檔案位於同一目錄)
$sliceFileUrls = $uploader->parseM3u8File($m3u8FileUrl);
//print_r($sliceFileUrls);
$res = $uploader->uploadWebM3u8($uploadVideoRequest, $sliceFileUrls);
print_r($res);
} catch (Exception $e) {
printf("testUploadWebM3u8 Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
$e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
}
}
#### 執行測試代碼 ####
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$localM3u8FilePath = '/opt/video/m3u8/sample.m3u8';
//testUploadLocalM3u8($accessKeyId, $accessKeySecret, $localM3u8FilePath);
//webM3u8FileURL樣本:http://example-bucket-****.cn-shanghai.aliyuncs.com/b55b904bc612463b812990b7c8cc****/daa30814c0c340cf8199926f78aa****-195a25af366b5edae324c47e99a0****-ld.m3u8?auth_key=1608775606-0-0-9fb038deaecd009dadd86721c585****
$webM3u8FileURL = '<your webM3u8FileURL>';
//testUploadWebM3u8($accessKeyId, $accessKeySecret, $webM3u8FileURL);
上傳加速
當您需要上傳較大檔案(GB、TB層級)或進行跨地區上傳(比如在中國內地將視頻上傳到新加坡儲存地區的儲存地址)時,您可以啟用上傳加速功能。詳情請參見媒體上傳概述。開通後需要您在上傳配置中的UserData對象(若沒有需要建立)增加相應的key-value值AccelerateConfig。樣本如下:
$userData = array(
"AccelerateConfig"=>array("Type"=>"oss","Domain"=>"****Bucket.oss-accelerate.aliyuncs.com"),
);
$uploadVideoRequest->setUserData(json_encode($userData));
參數描述
名稱 | 類型 | 說明 |
Type | string | 開啟上傳加速的類型(僅支援oss)。 |
Domain | string | 使用者bucket的加速地址(預設為https)。
說明 使用開通後分配的一個加速地址,例如:vod-*******.oss-accelerate.aliyuncs.com。 |
批量上傳多視頻
uploadLocalVideo 和 uploadWebVideo 每次調用僅支援上傳單個視頻檔案,不支援單次批量上傳多個視頻。如果需要上傳多個視頻,可以調用 UploadMediaByUrl 介面批量上傳。
UploadMediaByUrl 適用於待上傳檔案已具備公網訪問地址的情境,一次調用即可提交多個媒體 URL。若上傳的是本地檔案,則需在 PHP 側迴圈調用 uploadLocalVideo,為每個檔案單獨建立 UploadVideoRequest 對象,並對每次調用做異常捕獲,避免單個檔案上傳失敗中斷整批上傳。
上傳網路視頻時同理,將迴圈體內的 UploadVideoRequest 替換為網路視頻對應的請求對象並調用 uploadWebVideo 即可。
在控制台上傳頁面批量上傳視頻時,系統同樣是逐個處理每個檔案。若檔案較大或需要批量上傳,建議使用 PC 用戶端工具。
情境二:上傳圖片
展開查看範例程式碼
<?php
/**
* Created by Aliyun ApsaraVideo VoD.
* User: https://www.aliyun.com/product/vod
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
// 測試上傳本地圖片
function testUploadLocalImage($accessKeyId, $accessKeySecret, $filePath)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadImageRequest = new UploadImageRequest($filePath, 'testUploadLocalImage via PHP-SDK');
$uploadImageRequest->setCateId(1000009458);
$res = $uploader->uploadLocalImage($uploadImageRequest);
print_r($res);
} catch (Exception $e) {
printf("testUploadLocalImage Failed, ErrorMessage: %s\n", $e->getMessage());
}
}
// 測試上傳網狀圖片
function testUploadWebImage($accessKeyId, $accessKeySecret, $fileURL)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadImageRequest = new UploadImageRequest($fileURL, 'testUploadWebImage via PHP-SDK');
$uploadImageRequest->setCateId(1000009458);
$res = $uploader->uploadWebImage($uploadImageRequest);
print_r($res);
} catch (Exception $e) {
printf("testUploadWebImage Failed, ErrorMessage: %s\n", $e->getMessage());
}
}
#### 執行測試代碼 ####
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$localFilePath = '/opt/image/test-image.jpg';
//testUploadLocalImage($accessKeyId, $accessKeySecret, $localFilePath);
$webFileURL = 'http://vod-download.cn-shanghai.aliyuncs.com/retina/pic/20180208/496AE240-54AE-4CC8-8578-3EEC8F38****.gif';
testUploadWebImage($accessKeyId, $accessKeySecret, $webFileURL);
情境三:上傳輔助媒資檔案
部分程式碼範例如下所示:
展開查看範例程式碼
<?php
/**
* Created by Aliyun ApsaraVideo VoD.
* User: https://www.aliyun.com/product/vod
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
// 測試上傳本地輔助媒資檔案
function testUploadLocalAttachedMedia($accessKeyId, $accessKeySecret, $filePath)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadAttachedRequest = new UploadAttachedMediaRequest($filePath, 'watermark',
'testUploadLocalAttachedMedia via PHP-SDK');
//$uploadAttachedRequest->setCateId(100000****);
$res = $uploader->uploadLocalAttachedMedia($uploadAttachedRequest);
print_r($res);
} catch (Exception $e) {
printf("testUploadLocalAttachedMedia Failed, ErrorMessage: %s\n", $e->getMessage());
}
}
// 測試上傳網路輔助媒資檔案
function testUploadWebAttachedMedia($accessKeyId, $accessKeySecret, $fileURL)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadAttachedRequest = new UploadAttachedMediaRequest($fileURL, 'watermark',
'testUploadWebAttachedMedia via PHP-SDK');
//$uploadAttachedRequest->setCateId(100000****);
$res = $uploader->uploadWebAttachedMedia($uploadAttachedRequest);
print_r($res);
} catch (Exception $e) {
printf("testUploadWebAttachedMedia Failed, ErrorMessage: %s\n", $e->getMessage());
}
}
#### 執行測試代碼 ####
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$localFilePath = '/opt/image/test.png';
//testUploadLocalAttachedMedia($accessKeyId, $accessKeySecret, $localFilePath);
$webFileURL = 'http://vod-download.cn-shanghai.aliyuncs.com/retina/pic/20180208/496AE240-54AE-4CC8-8578-3EEC8F38****.gif';
testUploadWebAttachedMedia($accessKeyId, $accessKeySecret, $webFileURL);