使用Python SDK上傳文件
本文通過示例詳細(xì)介紹如何使用服務(wù)端上傳SDK(Python語言)將各類媒體文件上傳至點(diǎn)播存儲。
整體說明
從內(nèi)部邏輯角度看,Python上傳SDK遵循點(diǎn)播服務(wù)端SDK的通用流程。詳情請參見上傳流程。從操作角度看,使用Python上傳SDK的基礎(chǔ)流程如下:
完成前提條件。具體操作請參見前提條件。
集成Python上傳SDK。具體操作請參見集成Python上傳SDK。
實(shí)現(xiàn)上傳邏輯(主要是上傳信息配置)。
音視頻上傳請參見場景一:上傳音視頻。
圖片上傳請參見場景二:上傳圖片。
輔助媒資上傳請參見場景三:上傳輔助媒資。
Python上傳SDK默認(rèn)服務(wù)接入點(diǎn)為
cn-shanghai
(上海), 若需要上傳媒體文件到其他區(qū)域,可以通過AliyunVodUploader.py
中的ApiRegion
來指定區(qū)域,點(diǎn)播支持的服務(wù)接入點(diǎn),請參見服務(wù)接入點(diǎn)。以指定上傳區(qū)域?yàn)?code data-tag="code" class="code" code-type="xCode">cn-beijing(北京)為例,配置示例如下:
self.setApiRegion('cn-beijing')
前提條件
您已經(jīng)開通了視頻點(diǎn)播服務(wù)。開通步驟請參見開通視頻點(diǎn)播服務(wù)。
您已經(jīng)完成上傳相關(guān)的系統(tǒng)配置,包括啟用目標(biāo)存儲地域的存儲地址和配置回調(diào)。操作指引請參見管理存儲Bucket及回調(diào)設(shè)置。
您已準(zhǔn)備好用于調(diào)用點(diǎn)播服務(wù)的賬號。為避免阿里云賬號AccessKey泄露帶來的安全風(fēng)險(xiǎn),推薦您創(chuàng)建RAM用戶并授予其VOD相關(guān)權(quán)限。然后使用RAM用戶的AK對(AccessKey ID和AccessKey Secret)訪問點(diǎn)播服務(wù)。操作指引請參見創(chuàng)建RAM用戶并授權(quán)。
已配置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具體操作,請參見在Linux、macOS和Windows系統(tǒng)配置環(huán)境變量。
重要阿里云賬號的AccessKey擁有所有API的訪問權(quán)限,建議您使用RAM用戶的AccessKey進(jìn)行API訪問或日常運(yùn)維。
強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號下所有資源的安全。
(可選)如需使用STS臨時授權(quán)方式(阿里云Security Token Service)訪問點(diǎn)播服務(wù),請為RAM用戶創(chuàng)建角色并授予角色VOD相關(guān)權(quán)限。操作指引請參見使用STS臨時授權(quán)方案上傳視頻。
說明STS臨時授權(quán)方式的適用場景請參見憑證方式與STS方式對比。
集成Python上傳SDK
上傳SDK目錄詳細(xì)介紹請參見下文目錄說明。
本文以普通用戶執(zhí)行操作為例進(jìn)行說明。
執(zhí)行以下命令安裝依賴包。
sudo pip install aliyun-python-sdk-core
sudo pip install aliyun-python-sdk-vod
sudo pip install oss2
說明如果使用的是 Python 3.x,請將sudo pip install aliyun-python-sdk-core修改為sudo pip install aliyun-python-sdk-core-v3。如果同時安裝了不同版本,可使用pip3命令。如果集成遇到問題,請參見常見問題排查。
下載Python上傳SDK及示例代碼VodUploadSDK-Python_1.3.*.zip,更多信息,請參見上傳SDK。
說明此處以SDK1.3.1版本舉例說明。其他版本請根據(jù)實(shí)際情況操作。
解壓VodUploadSDK-Python_1.3.*.zip,將VodUploadSDK-Python_1.3.*目錄下的voduploadsdk復(fù)制到本地項(xiàng)目工程目錄下(推薦),或復(fù)制到site-packages目錄下。
更新Python上傳SDK
若發(fā)現(xiàn)新的接口或已有接口新的功能在當(dāng)前SDK沒有,可將SDK更新到最新版。
執(zhí)行以下命令更新依賴包。
sudo pip install --upgrade aliyun-python-sdk-vod
sudo pip install --upgrade oss2
下載最新的Python上傳SDK覆蓋到本地SDK文件。更多信息,請參見SDK下載。
說明您可以打開voduploadsdk目錄下的ChangeLog.txt文件查看當(dāng)前SDK的版本號和發(fā)布日期。
Python上傳SDK目錄說明
voduploadsdk目錄
AliyunVodUtils.py
目錄
說明
AliyunVodLog
上傳SDK的日志類,基于logging實(shí)現(xiàn)。
AliyunVodUtils
上傳SDK的工具類。
AliyunVodException
上傳SDK的異常類,做統(tǒng)一的異常處理,外部捕獲此異常即可。
UploadVideoRequest.py
目錄
說明
UploadVideoRequest
上傳視頻的請求類,字段請參見獲取音視頻上傳地址和憑證。
UploadImageRequest.py
目錄
說明
UploadImageRequest
上傳圖片的請求類,字段請參見獲取圖片上傳地址和憑證。
UploadAttachedMediaRequest.py
目錄
說明
UploadAttachedMediaRequest
上傳輔助媒資的請求類,字段請參見獲取輔助媒資上傳地址和憑證。
AliyunVodUploader.py
目錄
說明
uploadLocalVideo
上傳本地視頻的接口。
uploadWebVideo
上傳網(wǎng)絡(luò)視頻的接口。
uploadLocalM3u8
上傳本地m3u8視頻。
uploadWebM3u8
上傳網(wǎng)絡(luò)m3u8視頻。
uploadImage
上傳本地或網(wǎng)絡(luò)圖片文件。
uploadAttachedMedia
上傳本地或網(wǎng)絡(luò)輔助媒資文件。
parseWebM3u8
解析網(wǎng)絡(luò)m3u8文件的分片信息。
parseLocalM3u8
解析本地m3u8文件的分片信息。
setApiRegion
設(shè)置VoD的接入地址。默認(rèn)為cn-shanghai(上海),海外支持ap-southeast-1(新加坡)等區(qū)域。詳情請參見點(diǎn)播地域標(biāo)識。
setMultipartUpload
設(shè)置分片上傳的閾值、分片大小。
uploadProgressCallback
上傳進(jìn)度回調(diào)函數(shù),可重寫。
setEnableCrc
上傳時是否啟用CRC校驗(yàn),默認(rèn)開啟。
ChangeLog.txt:版本發(fā)布記錄,首行即為當(dāng)前SDK的版本號和發(fā)布日期。
samples目錄
uploadVideo.py:上傳視頻的示例代碼。
uploadImage.py:上傳圖片的示例代碼。
uploadAttachedMedia.py:上傳輔助媒資文件的示例代碼。
場景一:上傳音視頻
普通文件上傳
音視頻上傳目前支持以下類型文件上傳:
上傳本地文件,使用分片上傳,最大支持48.8 TB的單個文件,不支持?jǐn)帱c(diǎn)續(xù)傳。請參見示例代碼中的testUploadLocalVideo函數(shù)。
上傳網(wǎng)絡(luò)文件,可指定文件URL進(jìn)行上傳,最大支持48.8 TB的單個文件。該上傳方式需要先將網(wǎng)絡(luò)文件下載到本地磁盤,再進(jìn)行上傳,所以要保證本地磁盤有充足的空間。請參見testUploadWebVideo函數(shù)。
# -*- coding: UTF-8 -*-
from voduploadsdk.AliyunVodUtils import *
from voduploadsdk.AliyunVodUploader import AliyunVodUploader
from voduploadsdk.UploadVideoRequest import UploadVideoRequest
# 測試上傳本地音視頻
def testUploadLocalVideo(accessKeyId, accessKeySecret, filePath, storageLocation=None):
try:
# 可以指定上傳腳本部署的ECS區(qū)域。如果ECS區(qū)域和視頻點(diǎn)播存儲區(qū)域相同,則自動使用內(nèi)網(wǎng)上傳,上傳更快且更省公網(wǎng)流量。
# ecsRegionId ="cn-shanghai"
# uploader = AliyunVodUploader(accessKeyId, accessKeySecret, ecsRegionId)
# 不指定上傳腳本部署的ECS區(qū)域。
uploader = AliyunVodUploader(accessKeyId, accessKeySecret)
uploadVideoRequest = UploadVideoRequest(filePath, 'exampleTitle')
# 可以設(shè)置視頻封面,如果是本地或網(wǎng)絡(luò)圖片可使用UploadImageRequest上傳圖片到視頻點(diǎn)播,獲取到ImageURL
#ImageURL示例:https://example.com/sample-****.jpg
#uploadVideoRequest.setCoverURL('<your Image URL>')
# 標(biāo)簽
#uploadVideoRequest.setTags('tag1,tag2')
if storageLocation:
uploadVideoRequest.setStorageLocation(storageLocation)
videoId = uploader.uploadLocalVideo(uploadVideoRequest)
print("file: %s, videoId: %s" % (uploadVideoRequest.filePath, videoId))
except AliyunVodException as e:
print(e)
# 測試上傳網(wǎng)絡(luò)音視頻
def testUploadWebVideo(accessKeyId, accessKeySecret, fileUrl, storageLocation=None):
try:
uploader = AliyunVodUploader(accessKeyId, accessKeySecret)
uploadVideoRequest = UploadVideoRequest(fileUrl, 'exampleTitle')
uploadVideoRequest.setTags('tag1,tag2')
if storageLocation:
uploadVideoRequest.setStorageLocation(storageLocation)
videoId = uploader.uploadWebVideo(uploadVideoRequest)
print("file: %s, videoId: %s" % (uploadVideoRequest.filePath, videoId))
except AliyunVodException as e:
print(e)
#### 執(zhí)行測試代碼 ####
# 阿里云賬號AccessKey擁有所有API的訪問權(quán)限,建議您使用RAM用戶進(jìn)行API訪問或日常運(yùn)維。
# 強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號下所有資源的安全。
# 本示例通過從環(huán)境變量中讀取AccessKey,來實(shí)現(xiàn)API訪問的身份驗(yàn)證。運(yùn)行代碼示例前,請配置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeyId = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
accessKeySecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
localFilePath = '/opt/video/sample-****.mp4'
testUploadLocalVideo(accessKeyId, accessKeySecret, localFilePath)
# fileURL示例:http://video.developer.aliyundoc.com/video/sample-****.mp4
fileUrl = '<your file URL>'
#testUploadWebVideo(accessKeyId, accessKeySecret, fileUrl)
M3U8文件上傳
# -*- coding: UTF-8 -*-
from voduploadsdk.AliyunVodUtils import *
from voduploadsdk.AliyunVodUploader import AliyunVodUploader
from voduploadsdk.UploadVideoRequest import UploadVideoRequest
# 測試上傳m3u8本地視頻
def testUploadLocalM3u8(accessKeyId, accessKeySecret, m3u8LocalFile):
try:
uploader = AliyunVodUploader(accessKeyId, accessKeySecret)
uploadVideoRequest = UploadVideoRequest(m3u8LocalFile, 'exampleTitle')
# uploadVideoRequest.setTemplateGroupId('<TemplateGroupId>')
# 分片文件和m3u8文件位于同一目錄,SDK會自動解析上傳
videoId = uploader.uploadLocalM3u8(uploadVideoRequest)
print("file: %s, videoId: %s" % (uploadVideoRequest.filePath, videoId))
except AliyunVodException as e:
print(e)
# 測試上傳m3u8網(wǎng)絡(luò)視頻
def testUploadWebM3u8(accessKeyId, accessKeySecret, m3u8FileUrl):
try:
uploader = AliyunVodUploader(accessKeyId, accessKeySecret)
uploadVideoRequest = UploadVideoRequest(m3u8FileUrl, 'exampleTitle')
# 解析分片文件地址(適用于分片地址和m3u8文件簽名相同或無簽名的情況,其他情況需要您自行解析)
sliceFileUrls = uploader.parseWebM3u8(m3u8FileUrl)
videoId = uploader.uploadWebM3u8(uploadVideoRequest, sliceFileUrls)
print("file: %s, videoId: %s" % (uploadVideoRequest.filePath, videoId))
except AliyunVodException as e:
print(e)
#### 執(zhí)行測試代碼 ####
# 阿里云賬號AccessKey擁有所有API的訪問權(quán)限,建議您使用RAM用戶進(jìn)行API訪問或日常運(yùn)維。
# 強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號下所有資源的安全。
# 本示例通過從環(huán)境變量中讀取AccessKey,來實(shí)現(xiàn)API訪問的身份驗(yàn)證。運(yùn)行代碼示例前,請配置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeyId = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
accessKeySecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
m3u8LocalFile = '/opt/video/m3u8/example_01.m3u8'
#testUploadLocalM3u8(accessKeyId, accessKeySecret, m3u8LocalFile)
m3u8FileUrl = 'http://sample.oss.aliyuncs.com/video/m3u8/example****.m3u8'
#testUploadWebM3u8(accessKeyId, accessKeySecret, m3u8FileUrl)
場景二:上傳圖片
場景三:上傳輔助媒資
# -*- coding: UTF-8 -*-
from voduploadsdk.AliyunVodUtils import *
from voduploadsdk.AliyunVodUploader import AliyunVodUploader
from voduploadsdk.UploadAttachedMediaRequest import UploadAttachedMediaRequest
# 測試上傳本地輔助媒資(水印、字幕等文件)
def testUploadLocalAttachedMedia(accessKeyId, accessKeySecret, filePath):
try:
uploader = AliyunVodUploader(accessKeyId, accessKeySecret)
uploadAttachedRequest = UploadAttachedMediaRequest(filePath, 'watermark')
uploadAttachedRequest.setTitle('exampleTitle')
media = uploader.uploadAttachedMedia(uploadAttachedRequest, True)
print(media)
except AliyunVodException as e:
print(e)
# 測試上傳網(wǎng)絡(luò)輔助媒資(水印、字幕等文件)
def testUploadWebAttachedMedia(accessKeyId, accessKeySecret, fileUrl):
try:
uploader = AliyunVodUploader(accessKeyId, accessKeySecret)
uploadAttachedRequest = UploadAttachedMediaRequest(fileUrl, 'watermark')
uploadAttachedRequest.setTitle('exampletitle')
media = uploader.uploadAttachedMedia(uploadAttachedRequest, False)
print(media)
except AliyunVodException as e:
print(e)
#### 執(zhí)行測試代碼 ####
# 阿里云賬號AccessKey擁有所有API的訪問權(quán)限,建議您使用RAM用戶進(jìn)行API訪問或日常運(yùn)維。
# 強(qiáng)烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號下所有資源的安全。
# 本示例通過從環(huán)境變量中讀取AccessKey,來實(shí)現(xiàn)API訪問的身份驗(yàn)證。運(yùn)行代碼示例前,請配置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeyId = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
accessKeySecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
localFilePath = '/opt/image/sample.png'
#testUploadLocalAttachedMedia(accessKeyId, accessKeySecret, localFilePath)
fileUrl = 'http://vod-download.cn-shanghai.aliyuncs.com/retina/pic/20180208/496AE240-54AE-4CC8-8578-3EEC8F38****.gif'
testUploadWebAttachedMedia(accessKeyId, accessKeySecret, fileUrl)
常見問題
使用示例代碼上傳網(wǎng)絡(luò)視頻流時,如果報(bào)ERROR:root:Download fail: [Errno 2] No such file or directory
錯誤,解決辦法為:在voduploadsdk同級目錄下手動創(chuàng)建dlfiles文件夾。