文件上傳是指將媒體文件(本地文件或網絡文件)從客戶端上傳至點播存儲。在iOS端上,文件上傳通過上傳實例(VODUploadClient)完成。本文介紹如何使用iOS端上傳SDK完成媒體上傳。
前提條件
您已經集成視頻點播提供的iOS上傳SDK。具體操作,請參見集成iOS SDK。
上傳流程
客戶端上傳SDK封裝了OSS上傳邏輯。在客戶端上傳媒體文件時,會直接將文件上傳到點播存儲(基于OSS),不會再經服務端進行中轉,故客戶端上傳必須進行鑒權,也就是需要您在應用服務器上部署授權服務以獲取上傳地址和憑證。目前客戶端上傳SDK支持兩種授權方式,兩種方式差異對比請參見憑證方式與STS方式對比,推薦使用憑證方式。
上傳地址和憑證方式上傳流程詳解
以集成點播服務端SDK獲取上傳地址和憑證為例,完整的上傳流程如下圖所示:
用戶在上傳應用服務器上部署授權服務(如集成點播服務端SDK)用于獲取上傳地址和憑證。
客戶端向上傳應用服務器發(fā)起請求獲取上傳地址和憑證。
上傳應用服務器向視頻點播服務發(fā)起請求獲取上傳地址和憑證。
點播服務返回上傳地址和憑證。
說明點播服務在下發(fā)上傳地址和憑證時還會自動創(chuàng)建媒資信息,即媒體ID(MediaId),用于媒資生命周期管理或媒體處理。
獲取音視頻上傳地址和憑證返回的
VideoId
即媒體ID。獲取圖片上傳地址和憑證返回的
ImageId
即媒體ID。獲取輔助媒資上傳地址和憑證返回的
MediaId
即媒體ID。請妥善保存媒體ID,作為媒資管理、音視頻播放、媒體處理等的輸入。
上傳應用服務器向客戶端下發(fā)上傳地址和憑證。
說明下發(fā)地址和憑證即可,無需Base64解碼。
客戶端使用上傳地址和憑證初始化上傳實例。
客戶端構造上傳參數發(fā)起上傳請求。
OSS服務返回上傳結果。
說明上傳結果也可以通過提前配置回調接收上傳相關事件來監(jiān)聽。
STS方式上傳流程詳解
如需使用STS臨時授權方式(阿里云Security Token Service)訪問點播服務,請為RAM用戶創(chuàng)建角色并授予角色VOD相關權限。操作指引請參見使用STS臨時授權方案上傳視頻。
使用STS方式上傳的完整的流程如下圖所示:
用戶在上傳應用服務器上部署授權服務(如集成阿里云STS SDK)用于獲取STS臨時Token。
客戶端向上傳應用服務器發(fā)起請求獲取STS臨時Token。
上傳應用服務器向阿里云STS服務發(fā)起請求獲取STS臨時Token。
阿里云STS服務返回上傳地址和憑證。
上傳應用服務器向客戶端下發(fā)STS臨時Token。
客戶端使用STS臨時Token初始化上傳實例。
客戶端構造請求發(fā)起上傳請求。
OSS服務返回上傳結果。
說明上傳結果也可以通過提前配置回調接收上傳相關事件來監(jiān)聽。
上傳文件
在iOS端上傳文件的基本操作步驟如下:
獲取上傳地址和憑證或STS臨時Token,用于上傳授權。
iOS上傳SDK支持以下兩種上傳授權方式,推薦使用憑證方式:
- 部署授權服務獲取上傳地址和憑證的操作指引請參見獲取上傳地址和憑證。
- 部署STS服務獲取STS臨時Token的操作指引請參見獲取STS臨時Token。
執(zhí)行結果
使用獲取到的上傳地址和憑證或STS臨時Token作為入參初始化上傳實例。
使用上傳憑證或STS臨時Token初始化上傳實例。
初始化上傳實例分為聲明初始化回調和初始化上傳實例兩步。
聲明
VODUploadClient
屬性,不能是局部變量。初始化上傳實例。請根據業(yè)務需求選擇用上傳地址和憑證方式或STS方式初始化上傳實例。
(推薦)上傳地址和憑證方式
說明上傳地址和憑證方式調用
init
方法初始化。使用獲取的上傳地址和憑證初始化時無需設置,在開始上傳后觸發(fā)的
OnUploadStartedListener
回調中調用setUploadAuthAndAddress: uploadAuth:uploadAddress:
方法進行設置。當token超時,會觸發(fā)
OnUploadTokenExpiredListener
回調,需要調用resumeWithAuth
方法,設置新的上傳憑證繼續(xù)上傳。
//創(chuàng)建VODUploadClient對象 self.uploader = [VODUploadClient new]; //weakself __weak typeof(self) weakSelf = self; //setup callback OnUploadFinishedListener FinishCallbackFunc = ^(UploadFileInfo* fileInfo, VodUploadResult* result){ NSLog(@"upload finished callback videoid:%@, imageurl:%@", result.videoId, result.imageUrl); }; OnUploadFailedListener FailedCallbackFunc = ^(UploadFileInfo* fileInfo, NSString *code, NSString* message){ NSLog(@"upload failed callback code = %@, error message = %@", code, message); }; OnUploadProgressListener ProgressCallbackFunc = ^(UploadFileInfo* fileInfo, long uploadedSize, long totalSize) { NSLog(@"upload progress callback uploadedSize : %li, totalSize : %li", uploadedSize, totalSize); }; OnUploadTokenExpiredListener TokenExpiredCallbackFunc = ^{ NSLog(@"upload token expired callback."); //token過期,設置新的上傳憑證,繼續(xù)上傳 [weakSelf.uploader resumeWithAuth:`new upload auth`]; }; OnUploadRertyListener RetryCallbackFunc = ^{ NSLog(@"upload retry begin callback."); }; OnUploadRertyResumeListener RetryResumeCallbackFunc = ^{ NSLog(@"upload retry end callback."); }; OnUploadStartedListener UploadStartedCallbackFunc = ^(UploadFileInfo* fileInfo) { NSLog(@"upload upload started callback."); //設置上傳地址和上傳憑證 [weakSelf.uploader setUploadAuthAndAddress:fileInfo uploadAuth:`upload auth` uploadAddress:`upload address`]; }; VODUploadListener *listener = [[VODUploadListener alloc] init]; listener.finish = FinishCallbackFunc; listener.failure = FailedCallbackFunc; listener.progress = ProgressCallbackFunc; listener.expire = TokenExpiredCallbackFunc; listener.retry = RetryCallbackFunc; listener.retryResume = RetryResumeCallbackFunc; listener.started = UploadStartedCallbackFunc; //init with upload address and upload auth [self.uploader init:listener];
STS方式初始化上傳實例
說明STS方式調用
init
方法初始化,通過接口setKeyId:accessKeySecret:secretToken:expireTime:listener:
傳入臨時STS憑證。當token過期時,觸發(fā)
OnUploadTokenExpiredListener
回調,需要調用resumeWithToken: accessKeySecret: secretToken: expireTime
方法,設置新的STS繼續(xù)上傳。
//創(chuàng)建VODUploadClient對象 self.uploader = [VODUploadClient new]; //weakself __weak typeof(self) weakSelf = self; //setup callback OnUploadFinishedListener FinishCallbackFunc = ^(UploadFileInfo* fileInfo, VodUploadResult* result){ NSLog(@"upload finished callback videoid:%@, imageurl:%@", result.videoId, result.imageUrl); }; OnUploadFailedListener FailedCallbackFunc = ^(UploadFileInfo* fileInfo, NSString *code, NSString* message){ NSLog(@"upload failed callback code = %@, error message = %@", code, message); }; OnUploadProgressListener ProgressCallbackFunc = ^(UploadFileInfo* fileInfo, long uploadedSize, long totalSize) { NSLog(@"upload progress callback uploadedSize : %li, totalSize : %li", uploadedSize, totalSize); }; OnUploadTokenExpiredListener TokenExpiredCallbackFunc = ^{ NSLog(@"upload token expired callback."); //token過期,設置新的STS,繼續(xù)上傳 [weakSelf.uploader resumeWithToken:`STS Key Id` accessKeySecret:`STS Key Secret` secretToken:`STS Secret Token` expireTime:`STS Expire Time`]; }; OnUploadRertyListener RetryCallbackFunc = ^{ NSLog(@"upload retry begin callback."); }; OnUploadRertyResumeListener RetryResumeCallbackFunc = ^{ NSLog(@"upload retry end callback."); }; OnUploadStartedListener UploadStartedCallbackFunc = ^(UploadFileInfo* fileInfo) { NSLog(@"upload upload started callback."); }; //init VODUploadListener *listener = [[VODUploadListener alloc] init]; listener.finish = FinishCallbackFunc; listener.failure = FailedCallbackFunc; listener.progress = ProgressCallbackFunc; listener.expire = TokenExpiredCallbackFunc; listener.retry = RetryCallbackFunc; listener.retryResume = RetryResumeCallbackFunc; listener.started = UploadStartedCallbackFunc; //set STS and listener [self.uploader setKeyId:`STS Key Id` accessKeySecret:`STS Key Secret` secretToken:STS Secret Token` expireTime:`STS Expire Time` listener:listener];
設置回調,用于接收上傳過程中關鍵節(jié)點的消息。
設置
VODUploadListener
對象,該對象是上傳狀態(tài)的回調類,需要設置下列回調方法:/** 上傳完成回調 @param fileInfo 上傳文件信息 @param result 上傳結果信息 */ typedef void (^OnUploadFinishedListener) (UploadFileInfo* fileInfo, VodUploadResult* result); /** 上傳失敗回調 @param fileInfo 上傳文件信息 @param code 錯誤碼 @param message 錯誤描述 */ typedef void (^OnUploadFailedListener) (UploadFileInfo* fileInfo, NSString *code, NSString * message); /** 上傳進度回調 @param fileInfo 上傳文件信息 @param uploadedSize 已上傳大小 @param totalSize 總大小 */ typedef void (^OnUploadProgressListener) (UploadFileInfo* fileInfo, long uploadedSize, long totalSize); /** token過期回調 上傳地址和憑證方式上傳需要調用resumeWithAuth:方法繼續(xù)上傳 STS方式上傳需要調用resumeWithToken:accessKeySecret:secretToken:expireTime:方法繼續(xù)上傳 */ typedef void (^OnUploadTokenExpiredListener) (); /** 上傳開始重試回調 */ typedef void (^OnUploadRertyListener) (); /** 上傳結束重試,繼續(xù)上傳回調 */ typedef void (^OnUploadRertyResumeListener) (); /** 開始上傳回調 上傳地址和憑證方式上傳需要調用setUploadAuthAndAddress:uploadAuth:uploadAddress:方法設置上傳地址和憑證 @param fileInfo 上傳文件信息 */ typedef void (^OnUploadStartedListener) (UploadFileInfo* fileInfo);
根據上傳的文件類型(音視頻或圖片)構造上傳參數。
說明音視頻和圖片的上傳參數略有差異。目前客戶端不支持上傳輔助媒資。
音視頻文件參數
構造添加音視頻文件到上傳列表的上傳請求函數。
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"視頻源文件的名稱" ofType:@"視頻源文件的格式,例如mp4"]; VodInfo *vodInfo = [[VodInfo alloc] init]; vodInfo.title = @"視頻上傳后的名稱"; vodInfo.desc =@"視頻上傳后的描述"; vodInfo.cateId = @(視頻的分類ID); vodInfo.tags = @"視頻標簽,例如sports"; [self.uploader addFile:filePath vodInfo:vodInfo];
VodInfo說明
//標題 @property (nonatomic, copy) NSString* title; //標簽 @property (nonatomic, copy) NSString* tags; //描述 @property (nonatomic, copy) NSString* desc; //分類ID @property (nonatomic, strong) NSNumber* cateId; //封面url(完整的URL https://) @property (nonatomic, copy) NSString* coverUrl;
添加文件后,SDK會將待上傳文件封裝為
UploadFileInfo
對象,具體結構如下://文件本地路徑 @property (nonatomic, copy) NSString* filePath; //endpoint @property (nonatomic, copy) NSString* endpoint; //bucket @property (nonatomic, copy) NSString* bucket; //object @property (nonatomic, copy) NSString* object; //VodInfo @property (nonatomic, strong) VodInfo* vodInfo;
說明如果需要對相冊內的視頻進行上傳,那么通過選擇器得到的選中視頻的絕對路徑,作為上傳的filepath進行上傳。
圖片文件參數
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"圖片源文件的名稱" ofType:@"圖片源文件的格式,例如jpg"]; VodInfo *imageInfo = [[VodInfo alloc] init]; imageInfo.title = @"圖片上傳后的名稱"; imageInfo.desc =@"圖片上傳后的描述"; imageInfo.cateId = @(圖片的分類ID); imageInfo.tags = @"圖片標簽,例如sports"; [self.uploader addFile:filePath vodInfo:imageInfo];
開始上傳。
調用
start
開始上傳。[self.uploader start];
該方法調用后,會觸發(fā)
OnUploadStartedListener
回調。如果通過上傳地址和憑證方式上傳,需要在該回調方法中設置上傳地址和憑證。代碼如下:[weakSelf.uploader setUploadAuthAndAddress:fileInfo uploadAuth:weakSelf.uploadAuth uploadAddress:weakSelf.uploadAddress];
文件開始上傳后,
OnUploadProgressListener
回調開始同步上傳進度。回調參數包括已上傳文件大小
uploadedSize
和總文件大小totalSize
。文件上傳成功后,
OnUploadFinishedListener
回調會返回上傳文件信息UploadFileInfo
和上傳結果VodUploadResult
。VodUploadResult
包含以下屬性:@property (nonatomic, copy) NSString* videoId; @property (nonatomic, copy) NSString* imageUrl;
說明videoId
只在STS方式上傳視頻成功后才有返回值,imageUrl
只在STS方式上傳圖片成功后才有返回值。如果使用上傳地址和憑證方式上傳,videoId
和imageUrl
不會返回,相應的值在請求上傳地址和憑證時就可以獲取到。
執(zhí)行結果
隊列管理
VODUploadClient
支持添加多個文件順序上傳,并且提供了以下方法管理上傳隊列:
盡管VODUploadClient
支持多文件上傳,如果使用上傳憑證和地址方式上傳,每個文件還是需要單獨設置。基于多文件上傳代碼復雜度的考慮,建議只添加單文件上傳。
從隊列中刪除上傳文件,如果待刪除的文件正在上傳中,則取消上傳并自動上傳下一個文件。
- (BOOL)deleteFile:(int) index;
清空上傳隊列,如果有文件在上傳,則取消上傳。
- (BOOL)clearFiles;
獲取上傳文件隊列。
- (NSMutableArray<UploadFileInfo *> *)listFiles;
將文件標記為取消,文件仍保留在上傳列表中。如果待取消的文件正在上傳中,則取消上傳并自動上傳下一個文件。
- (BOOL)cancelFile:(int)index;
恢復已取消的上傳文件,并自動開始上傳。
- (BOOL)resumeFile:(int)index;
上傳控制
停止上傳,如果有文件正在上傳中,則取消上傳。
- (BOOL)stop;
說明停止上傳后如需恢復上傳,請調用
resumeFile
恢復待上傳文件,或者清空隊列后重新添加文件上傳。暫停上傳。
- (BOOL)pause;
恢復上傳。
- (BOOL)resume;
回調處理
上傳失敗
上傳失敗時,會觸發(fā)
OnUploadFailedListener
回調。在該回調方法中,可以通過code
和message
查看具體原因,并在頁面上提示。更多錯誤碼信息,請參見錯誤碼表和OSS錯誤碼。憑證過期處理
上傳憑證或STS過期,會觸發(fā)
OnUploadTokenExpiredListener
回調。在該回調方法中,可以向AppServer重新請求新的上傳憑證或STS,并調用以下方法繼續(xù)上傳。重新設置上傳憑證
- (BOOL)resumeWithAuth:(NSString *)uploadAuth;
重新設置STS
- (BOOL)resumeWithToken:(NSString *)accessKeyId accessKeySecret:(NSString *)accessKeySecret secretToken:(NSString *)secretToken expireTime:(NSString *)expireTime;
超時處理
上傳超時,會觸發(fā)
OnUploadRertyListener
回調并自動重試。在該回調方法中,可以在頁面上給予提示或者調用stop
方法停止上傳。此外,可以設置maxRetryCount
屬性,指定最大重試次數。超時重試可以繼續(xù)上傳時,會觸發(fā)OnUploadRertyResumeListener
回調并恢復上傳。
高級設置
VODUploadClient
支持上傳轉碼、超時重試、設置緩存文件夾位置、斷點續(xù)傳、分片上傳、設置點播服務地域等高級設置。具體示例如下:
上傳轉碼
/**
上傳文件到服務端是否轉碼,默認值YES。指定視頻轉碼生成的格式請參見:音視頻轉碼。
*/
@property (nonatomic, assign) BOOL transcode;
超時重試
/**
最大超時重試次數,默認值INT_MAX
*/
@property (nonatomic, assign) uint32_t maxRetryCount;
/**
超時時間
*/
@property (nonatomic, assign) NSTimeInterval timeoutIntervalForRequest;
設置緩存文件夾位置
/**
緩存文件夾位置
*/
@property (nonatomic, copy) NSString * recordDirectoryPath;
斷點續(xù)傳
/**
是否記錄上傳進度(斷點續(xù)傳),默認值YES
*/
@property (nonatomic, assign) BOOL recordUploadProgress;
分片上傳
/**
分片大小,默認值1024 * 1024
*/
@property (nonatomic, assign) NSInteger uploadPartSize;
設置點播服務地域
/**
vod region,默認值"cn-shanghai"
*/
@property (nonatomic, copy) NSString *region;