保利威文档中心

幫助中心

6 影片上傳

更新時間:2023-04-17 15:27:58

6.1 概述

PLVVodUploadSDK 是易方資訊科技股份有限公司提供的可整合於專案中用於 iOS 裝置上傳影片檔案到伺服器的 SDK,支援斷點續傳。使用本 SDK 需要在保利威影片雲平台註冊帳號,並使用該帳號進行登入,上傳後的影片檔案可在該影片平台上進行檢視、剪輯、播放、刪除等操作。

6.2 檔案目錄

PLVVodUploadSDK 的檔案目錄如下,其中紅色虛線方框裡的是 SDK 的 public 檔案:

影片上傳_圖1

6.3 開始整合

上傳 SDK 支援 iOS 8.0 以上 iOS 裝置,需具備 Xcode 10.0 以上開發環境、CocoaPods 1.5.3 以上。關於如何安裝 CocoaPods,文件「2.快速整合」的 2.2 有說明。

在 Podfile 檔案中新增以下內容:

pod 'PLVVodUploadSDK'

然後,使用終端工具切換到專案所在路徑下,執行如下指令:

$ pod install

6.4 SDK 登入

PLVUploadClient 是進行登入、上傳請求的操作類別,使用 PLVUploadClient 的方法 -loginWithUserId:secretKey: 進行登入,方法宣告如下(參數 userIdsecretKey 可登入保利威影片雲平台取得):

/**
 SDK 登录
 @param userId 用户 ID
 @param secretKey 用户 secretKey
 */
- (void)loginWithUserId:(NSString *)userId secretKey:(NSString *)secretKey;

以在 AppDelegate 中進行 SDK 登入為例,範例程式碼如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSString *userId, secretKey; // 初始化为用户自己的 userId、secretKey
    [[PLVUploadClient sharedClient] loginWithUserId:userId secretKey:secretKey];
    ……
}

登入失敗、或者上傳狀態的變化,都會透過委託代理的方式通知,代理協定是 PLVUploadClientDelegatePLVUploadClient 支援多代理,允許多個類別同時進行監聽。使用 PLVUploadClient 的方法 -addDelegate: 新增代理,使用方法 -removeDelegate: 移除代理。程式碼範例如下:

#import <PLVVodUploadSDK/PLVVodUploadSDK.h>
 
@interface UIViewController ()<
PLVUploadClientDelegate
>
@end
 
@implementation UIViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
     
    [[PLVUploadClient sharedClient] addDelegate:self];
}
 
- (void)dealloc {
    [[PLVUploadClient sharedClient] removeDelegate:self];
}
 
 
- (void)uploadClientLoginError:(NSError *)error {
    NSLog(@"登录 SDK 失败,失败原因:%@", error.userInfo);
}
@end

設定 PLVUploadClient 的屬性 enableLog,可用於開啟控制台的除錯日誌,預設 enableLog 為 NO。開啟日誌程式碼範例如下:

[PLVUploadClient sharedClient].enableLog = YES;

6.5 回呼監聽

協定 PLVUploadClientDelegate 包含以下幾個代理方法,均為 optional 方法,開發者可依需求使用:

/**
 SDK 登录失败
 @param error 失败 error (含错误码和 userInfo )
 */
- (void)uploadClientLoginError:(NSError *)error;
 
/**
 初始化上传过程中遇到失败
 @param error 失败 error (含错误码和 userInfo )
 */
- (void)prepareUploadError:(NSError *)error fileURL:(NSURL *)fileURL;
 
/**
 启动上传任务失败
 @param vid 失败的视频 vid
 */
- (void)startUploadTaskFailure:(NSString *)vid;
 
/**
 某一个任务被加入等待队列
 @param video 等待上传的任务( PLVUploadVideo 对象)
 */
- (void)waitingUploadTask:(PLVUploadVideo *)video;
 
/**
 开始上传某一个任务
 @param video 开始上传的任务( PLVUploadVideo 对象)
 */
- (void)startUploadTask:(PLVUploadVideo *)video;
 
/**
 上传结束
 如果成功,error 为 nil
 @param video 上传结束的任务( PLVUploadVideo 对象)
 @param error 如果上传失败,回传失败的 NSError 对象指针
 */
- (void)didUploadTask:(PLVUploadVideo *)video error:(NSError * __nullable)error;
 
/**
 上传任务进度变化
 注意:该方法运行在后台线程,非主线程!
 @param vid 视频 vid
 @param progress 上传进度(大于 0 小于 1)
 */
- (void)uploadTask:(NSString *)vid progressChange:(float)progress;
 
/**
 所有任务上传结束(包括成功或失败,不包含被中止/中断的任务)
 */
- (void)didAllUploadTaskComplete;

6.6 上傳影片

6.6.1 上傳任務初始化

使用 PLVUploadClient 的方法 -uploadVideoAtFileURL: 初始化上傳任務,參數 fileURL 是上傳檔案在本機的儲存路徑 URL。如果任務初始化成功,該方法會回傳 nil,否則會回傳一個 NSError 物件。方法宣告如下:

/**
 上传视频文件
 @param fileURL 视频文件本地 URL
 @return 如果出错,返回一个 NSError 对象,如果没有,返回 nil
 */
- (NSError *)uploadVideoAtFileURL:(NSURL *)fileURL;

注意,檔案上傳之前必須先拷貝到想要整合上傳 SDK 的 app 的沙盒資料夾中來,否則會因為 iOS 權限限制而導致無法存取,所以 fileURL 必須是 app 的沙盒資料夾路徑。

如果任務初始化成功,該方法會回傳 nil,否則會回傳一個 NSError 物件。還可以透過 delegate 的方式獲知初始化失敗的原因,對應的 delegate 方法是 -prepareUploadError:fileURL:,範例程式碼如下:

- (void)prepareUploadError:(NSError *)error fileURL:(NSURL *)fileURL {
    NSLog(@"文件 %@ 上传初始化失败", [fileURL path]);
}

6.6.2 上傳任務佇列

上傳任務按照初始化的順序,依次加入到上傳任務佇列中,任務佇列最大並發數為 3,超過並發數的任務會進入等待狀態,直到有別的任務完成。透過監聽 delegate 方法 -waitingUploadTask: 和方法 -startUploadTask: 可以知道任務佇列的變化:

- (void)waitingUploadTask:(PLVUploadVideo *)video {
    // 上传任务 video 被加入队列中,进入等待状态
}
 
- (void)startUploadTask:(PLVUploadVideo *)video {
    // 上传任务 video 被加入队列中,准备开始上传
}

PLVUploadVideo 是上傳任務的資料模型,屬性 vidPLVUploadVideo 物件的唯一識別碼。透過 PLVUploadClient 的方法 -videoWithVid: 可取得上傳任務佇列中某一個 vid 的 PLVUploadVideo 物件,如果該物件不存在,回傳 nil。透過方法 -allUploadVideos 可取得上傳任務佇列中的所有任務,這兩個方法宣告如下:

/**
 返回所有上传中或等待上传的任务
 status 为 PLVUploadStatusWaiting, PLVUploadStatusUploading, PLVUploadStatusResumable
 @return 上传任务数组,数组元素为 PLVUploadVideo 对象
 */
- (NSArray <PLVUploadVideo *>*)allUploadVideos;
 
/**
 在上传中或等待上传的任务队列中,查找指定 vid 的上传任务
 @param vid 上传任务对应的视频 vid
 @return 上传任务( PLVUploadVideo 对象)
 */
- (PLVUploadVideo *)videoWithVid:(NSString *)vid;

6.6.3 上傳進度監聽

PLVUploadVideo 物件中包含一個 block 屬性 uploadProgress,可透過該屬性監聽每一個上傳任務的上傳進度。程式碼範例如下:

PLVUploadVideo *video; // 通过前面提到的 delegate 方法返回的
video.uploadProgress = ^(float progress) {
  NSLog(@"任务 vid:%@ 的上传进度为 %f", video.vid, progress);
});

也可以透過 delegate 方法 -uploadTask:progressChange: 進行監聽,範例程式碼如下:

- (void)uploadTask:(NSString *)vid progressChange:(float)progress {
    NSLog(@"任务 vid:%@ 的上传进度为 %f", vid, progress);
}

6.6.4 上傳中止或結束

想要中止上傳中的任務,可以呼叫 PLVUploadClient 的方法 -abortUploadWithVid:,方法宣告如下:

/**
 中止视频上传
 适用于 status 为 PLVUploadStatusWaiting, PLVUploadStatusUploading 的上传任务
 @param vid 上传任务的 vid
 */
- (void)abortUploadWithVid:(NSString *)vid;

呼叫結束後任務會同步中止,被中止的任務不能恢復,不可再續傳,只能透過 6.6.1 的方法重新進行任務初始化。

上傳結束,不管成功、失敗還是被中止,都會收到 delegate 方法 -didUploadTask:error: 的通知。如果成功,error 為 nil。範例程式碼如下:

- (void)didUploadTask:(PLVUploadVideo *)video error:(NSError *)error {
    if (error) {
        NSLog(@"任务 vid:%@ 上传失败,失败原因 %@", video.vid, error.userInfo);
    } else {
        NSLog(@"任务 vid:%@ 上传成功", video.vid);
    }
}

當所有加入佇列的上傳任務都完成時(成功與失敗都算完成),delegate 方法 -didAllUploadTaskComplete 會被呼叫,範例程式碼如下:

- (void)didAllUploadTaskComplete {
    NSLog(@"所有任务上传结束");
}

6.6.5 失敗任務續傳

上傳失敗時,如果錯誤碼為 PLVClientErrorCodeOSSErrorCanResumeUpload,可使用 PLVUploadClient 的方法 -retryUploadWithVid:fileURL: 進行續傳,方法宣告如下:

/**
 恢复视频上传
 适用于 status 为 PLVUploadStatusResumable 的上传任务
 @param vid 上传任务的 vid
 @param fileURL 上传文件的 URL
 */
- (void)retryUploadWithVid:(NSString *)vid fileURL:(NSURL *)fileURL;

如果續傳任務啟動成功,會收到 delegate 方法 -waitingUploadTask: 或方法 -startUploadTask: 的通知,如 6.6.2。如果啟動失敗,會收到 delegate 方法 -startUploadTaskFailure: 通知。範例程式碼如下:

- (void)startUploadTaskFailure:(NSString *)vid {
    NSLog(@"任务 vid:%@ 上传启动失败", vid);
}

6.6.6 更多上傳參數

除了 6.6.1 中提到的 PLVUploadClient 的方法 -uploadVideoAtFileURL:,我們還可以使用如下的方法,為上傳任務定義更多的參數:

/**
 上传视频文件
 @param uploadParameter 参数封装类(包含更多自定义参数)
 @return 如果出错,返回一个 NSError 对象,如果没有,返回 nil
 */
- (NSError *)uploadVideoWithMutipleParameter:(PLVUploadParameter *)uploadParameter;

參數 uploadParameter 包含了上傳任務的多個自訂參數,包括上傳到哪個分類目錄下,是否錄屏、是否保持原始檔案、影片檔案描述、影片檔案標籤。除了影片檔案的本機儲存路徑是不可為空的屬性,其他屬性如果不被設定,都有預設值。PLVUploadParameter 類別的各個屬性宣告如下:

/**
 初始化视频上传任务时的参数封装类
 */
@interface PLVUploadParameter : NSObject
 
/**
 待上传的视频文件的本地存储 URL
 */
@property (nonatomic, strong) NSURL *fileURL;
 
/**
 上传目录分类 ID,默认为根目录(ID 为 1)
 */
@property (nonatomic, assign) long long catalogId;
 
/**
 是否录屏,默认为否
 */
@property (nonatomic, assign) BOOL screenRecord;
 
/**
 是否保持源文件,默认为否
 */
@property (nonatomic, assign) BOOL keepSource;
 
/**
 待上传的视频文件描述,可选,不传默认为空
 */
@property (nonatomic, copy) NSString * __nullable videoDescription;
 
/**
 待上传的视频文件标签,可选,不传默认为空
 */
@property (nonatomic, copy) NSString * __nullable videoTag;
 
@end

6.7 裁剪上傳模組

若業務上不需要上傳功能,可把上傳模組從點播 demo 中移除。移除後,上傳功能將無法使用。

6.7.1 修改 Podfile

將 Podfile 中以下兩個庫註解掉,然後重新執行 pod install

# pod 'PLVVodUploadSDK'
# pod 'TZImagePickerController', '~> 3.2.0'

6.7.2 移除開源檔案

上傳模組相關的開源程式碼位於 PolyvVodSDKDemo/Classes/Upload 資料夾中,將該資料夾中專案中移除。右鍵選單選擇【Delete】然後選擇【Move to Trash】。

6.7.3 上傳模組入口移除

上傳模組的入口位於首頁導航欄右上角,打開 Main.storyboard 檔案,將入口按鈕刪除,如下圖:

影片上傳_圖1

6.7.4 移除 SDK 註冊

將以下程式碼從 AppDelegate.m 檔案的 -application:didFinishLaunchingWithOptions: 方法中移除:

[[PLVUploadUtil sharedUtil] loginUploadClient];

並移除相關的標頭檔引入:

#import "PLVUploadUtil.h"

6.7.5 移除 framework

此時如果直接執行專案,會報以下錯誤:

ld: framework not found PLVVodUploadSDK
clang: error: linker command failed with exit code 1 (use -v to see invocation)

打開 TARGETS,選擇 Build Phases,在 Link Binary With Libraries 中,將 PLVVodUploadSDK.framework 刪除即可:

影片上傳_圖3

联系客服,在线咨询