本文介紹iOS端集成微短劇項目的操作步驟。
源碼說明
源碼下載
如需獲取源碼詳情,請提交方案咨詢。
環境要求
類別 | 要求 | ||||||
開發環境 | Xcode 14.0 及以上版本,推薦使用最新正式版本。 | ||||||
系統版本 | iOS 9.0以上版本的真機。 | ||||||
CocoaPods | CocoaPods 1.9.3 及以上版本。 |
前提條件
您已獲取音視頻終端SDK的播放器的License授權證書和License Key,獲取的詳細步驟請參見申請License。
跑通Demo
獲取Demo源碼后,進入
Example
目錄。打開
Podfile
文件,將播放器SDK的依賴版本更新為最新版本。版本號請參見iOS播放器SDK。進入Example目錄,執行
pod install --repo-update
,自動安裝所需的SDK依賴。打開工程文件
AlivcPlayerDemo.xcworkspace
,在Signing & Capabilities中修改Team和Bundle Identifier。Team是用戶添加的開發者Apple ID。
Bundle Identifier也就是包id。
將上述步驟中獲取的License授權證書放到
Example/
目錄下,并修改文件名為license.crt
。并打開Example/Info.plist
文件,在字段AlivcLicenseKey的值中填寫在上述步驟中獲取的LicenseKey。在真機上編譯并運行Demo。
集成組件
以下是 AUIShortVideoList 組件的使用方法及其對外接口的詳細介紹,旨在實現短視頻列表播放功能。
集成準備
接入已授權播放器的音視頻終端SDK License。
具體操作,請參見iOS端接入License。
將AUIFoundation(AUI基礎組件)、AUIShortVideoList(短視頻列表基礎播放組件)、AUIPlayer.podspec(框架配置文件)三個模塊拷貝到您項目工程中。
配置Podfile。
# Pod Example install! 'cocoapods', :deterministic_uuids => false source 'https://github.com/CocoaPods/Specs.git' platform :ios, '9.0' target 'Your ProjectName' do # 選取的SDK類型 # 播放器SDK及版本,建議使用最新版本,詳情參考官網:http://bestwisewords.com/zh/vod/developer-reference/release-notes-for-apsaravideo-player-sdk-for-ios pod "AUIPlayer/AliPlayerSDK_iOS", :path => "../" # 您可以根據自己的業務去調整使用的SDK,增加自己要使用的SDK;或者修改 AUIPlayer.podspec 中 AliPlayerSDK_iOS 版本 # pod "AUIPlayer/AliVCSDK_Standard", :path => "../" # AUI基礎組件(必需) pod "AUIFoundation/All", :path => "../AUIBaseKits/AUIFoundation" # 短劇列表播放組件 pod "AUIPlayer/AUIPlayerKits", :path => "../" # 可自定義第三方庫版本 pod 'SDWebImage', '5.18.1' end post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings['CLANG_WARN_DOCUMENTATION_COMMENTS'] = 'NO' config.build_settings['CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER'] = 'NO' end end
請根據您項目中實際存放依賴庫的路徑進行相應修改。
說明如果您項目中所使用的第三方庫版本與當前源碼依賴的版本存在沖突,請以項目中所使用的版本為準。
項目配置。
如果您的項目是Swift工程,并且需要使用Objective-C的第三方庫,您必須在項目的Build Settings中配置Bridging Header,以確保Swift能夠正確訪問并使用AUIShortVideoList模塊中的Objective-C的接口。
設置Bridging Header。
在項目的 Build Settings 中找到 SWIFT_OBJC_BRIDGING_HEADER 設置,并將其指向您的橋接頭文件。示例路徑如下:
<YourProjectName>/<YourProjectName>-Bridge-Header.h
引入Objective-C接口。
在橋接頭文件中,確保引入需要暴露給 Swift 的 Objective-C 接口,示例如下:
#import "AUIShortVideoList.h"
您可以參考AUIShortVideoList模塊中的AUIPlayer-Bridging-Header.h文件,獲取更多示例和指導。
編譯與運行。
完成配置后,請編譯并運行項目,以確保AUIShortVideoList組件已被正確集成。
在完成AUIShortVideoList組件的集成準備后,您可以直接將以下代碼復制到項目中以進行使用。
使用方法
以下提供兩種方式,來初始化和推送AUIShortVideoListViewController,以便快速實現功能運行:
使用UINavigationController進行跳轉。
Objective-C示例
// 創建視頻信息數組 NSArray<AUIShortVideoInfo *> *videoInfoList = [[NSArray alloc] init]; // 初始化 AUIShortVideoListViewController,傳入視頻數據 AUIShortVideoListViewController *vc = [[AUIShortVideoListViewController alloc] initWithData:videoInfoList]; // 使用 UINavigationController 推送新視圖控制器 [self.navigationController pushViewController:vc animated:YES];
Swift示例
// 創建視頻信息數組 let info = Array<AUIShortVideoInfo>() // 添加數據源 // 初始化 AUIShortVideoListViewController,傳入視頻數據 let vc = AUIShortVideoListViewController(data: info) // 使用 UINavigationController 推送新視圖控制器 self.navigationController?.pushViewController(vc, animated: true)
使用模態(Modal)跳轉。
Objective-C示例
// 創建視頻信息數組 NSArray<AUIShortVideoInfo *> *videoInfoList = [[NSArray alloc] init]; // 初始化 AUIShortVideoListViewController,傳入視頻數據 AUIShortVideoListViewController *vc = [[AUIShortVideoListViewController alloc] initWithData:videoInfoList]; // 設置模態展示樣式(可選) vc.modalPresentationStyle = UIModalPresentationFullScreen; // 以模態方式展示新視圖控制器 [self presentViewController:vc animated:YES completion:nil];
Swift示例
// 創建視頻信息數組 let info = Array<AUIShortVideoInfo>() // 添加數據源 // 初始化 AUIShortVideoListViewController,傳入視頻數據 let vc = AUIShortVideoListViewController(data: info) // 設置模態展示樣式 vc.modalPresentationStyle = .fullScreen // 可選,根據需求設置樣式 // 以模態方式展示新視圖控制器 self.present(vc, animated: true, completion: nil)
您還可以通過實現AUIShortVideoDataProviderDelegate委托來注冊數據回調,從而自定義加載視頻數據。
獲取數據
數據結構
AUIShortVideoList 組件使用的數據結構為NSArray<AUIShortVideoInfo *>
,其中AUIShortVideoInfo
為存儲視頻信息的數據類,其數據結構如下:
字段 | 類型 | 釋義 | 備注 |
videoId | int | 視頻唯一id | 用于唯一標識每一個視頻。 |
url | String | 視頻源地址 | 您可以自定義視頻源格式,如MP4/M3U8等。 |
coverUrl | String | 視頻封面圖 | |
author | String | 視頻作者 | |
title | String | 視頻標題 | |
type | String | 視頻類型 | 參考VideoType枚舉,視頻源或者廣告。 |
組件初始化
為了確保AUIShortVideoList組件正常運行,請在初始化AUIShortVideoListViewController
時,傳入 NSArray<AUIShortVideoInfo *>
數據源。以下是示例代碼:
Objective-C示例
// 在當前視圖控制器中創建視頻信息數組并初始化控制器
NSArray<AUIShortVideoInfo *> *videoInfoList = [[NSArray alloc] init];
AUIShortVideoListViewController *vc = [[AUIShortVideoListViewController alloc] initWithData:videoInfoList];
// 使用 UINavigationController 推送新視圖控制器
[self.navigationController pushViewController:vc animated:YES];
Swift示例
// 在當前視圖控制器中創建視頻信息數組并初始化控制器
let info = [AUIShortVideoInfo]() // 添加數據源
let vc = AUIShortVideoListViewController(data: info)
// 使用 UINavigationController 推送新視圖控制器
self.navigationController?.pushViewController(vc, animated: true)
自定義數據加載
除了直接傳遞數據數組,您也可以通過實現AUIShortVideoDataProviderDelegate協議來自定義數據加載:
通過代理初始化組件(建議在初始化時實現數據代理)
Objective-C示例
// 在當前視圖控制器中初始化控制器,傳入數據提供者 AUIShortVideoListViewController *videoListVC = [[AUIShortVideoListViewController alloc] initWithDataProvider:self]; // 使用 UINavigationController 推送新視圖控制器 [self.navigationController pushViewController:videoListVC animated:YES];
Swift示例
// 在當前視圖控制器中初始化控制器,傳入數據提供者 let videoListVC = AUIShortVideoListViewController(dataProvider: self) // 使用 UINavigationController 推送新視圖控制器 self.navigationController?.pushViewController(videoListVC, animated: true)
實現AUIShortVideoDataProviderDelegate協議,以自定義數據加載和刷新:
@protocol AUIShortVideoDataProviderDelegate <NSObject> @required - (void)loadData:(id _Nullable)controller; //加載數據 @optional - (void)refreshData:(id _Nullable)controller;//刷新數據(可選) @end
更新數據列表
當獲取到視頻數據后,使用以下接口更新ViewController中的數據列表:
追加數據
/**
* @brief 將新的視頻數據追加到當前視頻列表中。
*
* @param videoInfoList 新的視頻數據列表,可以為空。
* 當提供的數據列表不為空時,這些數據將被追加到現有的視頻列表的末尾。
* 如果提供為空的數據列表,則不對當前列表進行任何修改。
*/
- (void)appendVideoInfoList:(NSArray<AUIShortVideoInfo *> * _Nullable)videoInfoList;
重置數據
/**
* @brief 重置當前的視頻列表為指定的新視頻數據列表。
*
* @param videoInfoList 新的視頻數據列表,可以為空。
* 將當前的視頻列表替換為提供的數據列表。
* 如果提供為空的數據列表,將清空當前視頻列表。
*/
- (void)resetVideoInfoList:(NSArray<AUIShortVideoInfo *> * _Nullable)videoInfoList;
獲取數據示例
您可以通過網絡請求和數據轉換兩種方式來獲取NSArray<AUIShortVideoInfo *>
數據源,示例如下:
網絡請求
Objective-C示例
//請求額外數據 AUIShortVideoListConstants.defaultVideoInfoListURL 為請求URL ,您可以嘗試將其替換為自己的請求地址URL - (void)loadData:(id)controller { __weak typeof(self) weakSelf = self; // 弱引用 self [AUIShortVideoListDataManager requestVideoInfoList:AUIShortVideoListConstants.defaultVideoInfoListURL completed:^(NSArray<AUIShortVideoInfo *> * _Nullable data, NSError * _Nullable error) { if (error) { __strong typeof(weakSelf) strongSelf = weakSelf; // 強引用 self [AVToastView show:[NSString stringWithFormat:@"Unable to retrieve short video list, error: %@", error.localizedDescription] view:strongSelf.view position:AVToastViewPositionMid]; return; } // 調用相應子視圖控制器的 appendVideoInfoList: 方法 if (controller && [controller respondsToSelector:@selector(appendVideoInfoList:)]) { [controller appendVideoInfoList:data]; } }]; }
Swift示例
// 請求額外數據 AUIShortVideoListConstants.defaultVideoInfoListURL 為請求URL ,您可以嘗試將其替換為自己的請求地址URL func loadData(_ controller: Any?) { weak var weakSelf = self // Weak reference to self AUIShortVideoListDataManager.requestVideoInfoList(AUIShortVideoListConstants.defaultVideoInfoListURL) { (data: [AUIShortVideoInfo]?, error: Error?) in if let error = error { guard let strongSelf = weakSelf else { return } // Strong reference to self AVToastView.show("Unable to retrieve short video list, error: \(error.localizedDescription)", view: strongSelf.view, position: .mid) return } if let myController = controller as? AUIShortVideoListViewController { // 成功轉型,使用 myController if myController.responds(to: #selector(myController.appendVideoInfoList(_:))) { myController.appendVideoInfoList(data) } } } }
數據轉換
Objective-C示例
// 將字典數組轉換為視頻信息模型數組 NSArray<NSDictionary *> *responseArray = (NSArray<NSDictionary *> *)responseObject; NSMutableArray<AUIShortVideoInfo *> *videoInfoArray = [NSMutableArray arrayWithCapacity:responseArray.count]; for (NSDictionary *dict in responseArray) { // 初始化 AUIShortVideoInfo 模型對象并添加到數組中 AUIShortVideoInfo *videoInfo = [[AUIShortVideoInfo alloc] initWithDict:dict]; [videoInfoArray addObject:videoInfo]; }
Swift示例
let responseArray = responseObject as? [[AnyHashable : Any]] var videoInfoArray = [AnyHashable](repeating: 0, count: responseArray?.count ?? 0) as? [AUIShortVideoInfo] for dict in responseArray ?? [:] { guard let dict = dict as? [AnyHashable : Any] else { continue } // 初始化 AUIShortVideoInfo 模型對象并添加到數組中 let videoInfo = AUIShortVideoInfo(dict: dict) videoInfoArray?.append(videoInfo) }
集成FAQ
播放黑屏等異常情況
請檢查您的SDK License配置,詳情請參見iOS端接入License。
編譯運行出現報錯
如果您的項目中已包含相同的第三方庫,請調整AUIPlayer.podspec文件中該第三方庫的版本,以確保兼容性并避免發生沖突。
錯誤“Sandbox: rsync.samba(56557) deny(1) file-read-data”
配置BuildSetting中的Use Script SandBoxing為NO。
搭建場景
AUIShortVideoList組件支持低代碼集成,適用于多種場景。您可以基于此組件構建短視頻列表的場景化功能。請參考AUIPlayerScenes中的示例,例如AUIShortDramaList(短劇劇場場景化模塊)和 AUIShortDramaFeeds(短劇Feeds流場景化模塊)。
短劇劇場場景
概述
AUIShortDramaList是短劇劇場場景化模塊,基于AUIShortVideoList組件實現。模塊提供了劇場詳情頁和推薦頁,并且支持一二級頁面嵌套和播放器實例共享。
場景集成
在進行短劇劇場場景搭建之前,請確保已完成AUIShortVideoList組件的集成準備。
將AUIShortDramaList模塊拷貝到您項目工程中。
配置Podfile。
在項目的Podfile中添加對AUIShortDramaList模塊的引用和依賴。示例配置如下:
# Pod Example install! 'cocoapods', :deterministic_uuids => false source 'https://github.com/CocoaPods/Specs.git' platform :ios, '9.0' target 'Your ProjectName' do # 短劇場景(包含劇場/Feed流)兩個模塊,可單獨集成。 pod "AUIPlayer/AUIPlayerScenes", :path => "../" # 短劇劇場場景 # pod "AUIPlayer/AUIPlayerScenes/AUIShortDramaList", :path => "../" end post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings['CLANG_WARN_DOCUMENTATION_COMMENTS'] = 'NO' config.build_settings['CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER'] = 'NO' end end
請根據您項目中實際存放依賴庫的路徑進行相應修改。
說明如果您項目中所使用的第三方庫版本與AUIShortDramaList源碼依賴的版本存在沖突,請以項目中所使用的版本為準。
項目配置。
如果您的項目是Swift工程,并且需要使用Objective-C的第三方庫,您必須在項目的Build Settings中配置Bridging Header,以確保Swift能夠正確訪問并使用AUIShortDramaList模塊中的Objective-C的接口。
設置Bridging Header。
在項目的 Build Settings 中找到 SWIFT_OBJC_BRIDGING_HEADER 設置,并將其指向您的橋接頭文件。示例路徑如下:
<YourProjectName>/<YourProjectName>-Bridge-Header.h
引入Objective-C接口。
在橋接頭文件中,確保引入需要暴露給 Swift 的 Objective-C 接口,示例如下:
#import "AUIShortDramaList.h"
您可以參考AUIShortVideoList模塊中的AUIPlayer-Bridging-Header.h文件,獲取更多示例和指導。
編譯與運行。
完成配置后,請編譯并運行項目,以確保AUIShortDramaList組件已被正確集成。
使用方法
您可以將短劇劇場ViewController頁面直接提供給外部進行跳轉,具體調用邏輯可參考以下示例。
Objective-C示例
- (void)openShortDramaList {
AUIShortDramaListViewController *vc = [[AUIShortDramaListViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
Swift示例
func openShortDramaList() {
let vc = AUIShortDramaListViewController()
navigationController?.pushViewController(vc, animated: true)
}
獲取數據
AUIShortDramaList 模塊使用的數據結構為NSMutableArray<AUIShortDramaInfo *>
,其中 AUIShortDramaInfo
為存儲短劇劇集的數據類,其數據結構如下:
字段 | 類型 | 釋義 | 備注 |
dramaId | NSInteger | 劇集唯一id | |
title | NSString * | 劇集標題 | |
cover | NSString * | 劇集封面 | |
firstDrama | AUIShortVideoInfo * | 劇集首集 | firstDrama為 dramas 中的第一集 |
dramas | NSMutableArray<AUIShortVideoInfo *> * | 劇集列表 | 可作為 AUIShortVideoList 模塊的數據源 |
您可以通過網絡請求或數據轉換這兩種方式,獲取最終的NSMutableArray<AUIShortDramaInfo *>
數據源:
AUIShortDramaListViewController代碼中提供了獲取數據的代碼示例。該類實現了 AUIShortVideoDataProviderDelegate數據請求代理接口,提供了以下兩種主要方法:
@protocol AUIShortVideoDataProviderDelegate <NSObject> @required - (void)loadData:(id _Nullable)controller; //加載數據 @optional - (void)refreshData:(id _Nullable)controller; // 刷新數據(可選) @end
通過AUIShortDramaListDataManager中提供的requestDramaInfoList方法進行網絡請求,以獲取最終的
NSMutableArray<AUIShortDramaInfo *>
數據源。獲取的數據會存儲在內部的dramaInfoList對象中,用于后續的視圖展示和處理。
短劇Feeds流場景
概述
AUIShortDramaFeeds是短劇 Feeds 流場景化模塊,基于AUIShortVideoList組件實現。模塊提供了Feeds流TAB頁,支持TAB頁嵌套以及上下左右滑動播放,實現了播放器實例共享。
場景集成
在進行短劇 Feeds 流場景搭建之前,請確保已完成AUIFoundation基礎組建和AUIShortVideoList組件的集成準備。
將AUIShortDramaFeeds模塊拷貝到您項目工程中。
配置Podfile。
在項目的Podfile中添加對AUIShortDramaFeeds模塊的引用和依賴。示例配置如下:
# Pod Example install! 'cocoapods', :deterministic_uuids => false source 'https://github.com/CocoaPods/Specs.git' platform :ios, '9.0' target 'Your ProjectName' do # 短劇場景(包含劇場/Feed流)兩個模塊,可單獨集成。 pod "AUIPlayer/AUIPlayerScenes", :path => "../" # 短劇Feeds流場景 # pod "AUIPlayer/AUIPlayerScenes/AUIShortDramaFeeds", :path => "../" end post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings['CLANG_WARN_DOCUMENTATION_COMMENTS'] = 'NO' config.build_settings['CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER'] = 'NO' end end
請根據您項目中實際存放依賴庫的路徑進行相應修改。
說明如果您項目中所使用的第三方庫版本與AUIShortDramaFeeds源碼依賴的版本存在沖突,請以項目中所使用的版本為準。
項目配置。
如果您的項目是Swift工程,并且需要使用Objective-C的第三方庫,您必須在項目的Build Settings中配置Bridging Header,以確保Swift能夠正確訪問并使用AUIShortDramaFeeds模塊中的Objective-C的接口。
設置Bridging Header。
在項目的 Build Settings 中找到 SWIFT_OBJC_BRIDGING_HEADER 設置,并將其指向您的橋接頭文件。示例路徑如下:
<YourProjectName>/<YourProjectName>-Bridge-Header.h
引入Objective-C接口。
在橋接頭文件中,確保引入需要暴露給 Swift 的 Objective-C 接口,示例如下:
#import "AUIShortDramaFeeds.h"
您可以參考AUIShortVideoList模塊中的AUIPlayer-Bridging-Header.h文件,獲取更多示例和指導。
編譯與運行。
完成配置后,請編譯并運行項目,以確保AUIShortDramaFeeds組件已被正確集成。
使用方法
您可以將短劇Feeds流ViewController頁面直接提供給外部進行跳轉,具體調用邏輯可參考以下示例。
Objective-C示例
- (void)openShortDramaFeeds {
AUIShortDramaFeedsViewController *vc = [[AUIShortDramaFeedsViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
Swift示例
func openShortDramaFeeds() {
let vc = AUIShortDramaFeedsViewController()
navigationController?.pushViewController(vc, animated: true)
}
獲取數據
AUIShortDramaFeeds 模塊使用的數據結構為NSArray<AUIShortVideoInfo *>
,其中 AUIShortVideoInfo
為存儲視頻信息的數據類該數組包含多個 AUIShortVideoInfo
實例,每個實例代表一個視頻的信息。如需了解更詳細的內容,建議查閱 AUIShortVideoList 組件的完整文檔。
核心功能介紹
本組件功能使用阿里云播放器SDK,通過多個播放器實例(AliPlayer)+ 預加載(MediaLoader)+ 預渲染的方式進行實現,使用了預加載、預渲染、HTTPDNS、加密播放等核心能力,在播放延遲、播放穩定性及安全性方面大幅提升觀看體驗。具體介紹參考進階功能。
預加載
通過滑動窗口策略,動態啟停視頻的預加載任務。SDK底層基于網絡狀態智能調節任務優先級,以確保正播放視頻和即將播放視頻可以獲得更多的網絡資源,顯著提升視頻秒開率,減少播放卡頓。即使在快速滑動視頻時,仍然可以獲得流暢的播放體驗。更多信息,請參見預加載。
預渲染
使用預渲染的方式,在后臺提前渲染后續視頻的首幀,減少黑屏的出現,讓播放更加絲滑。音視頻終端 SDK和播放器SDK從6.16.0版本開始增添了對強制預渲染功能的支持。更多信息,請參見預渲染。
多實例播放器池
實現了全局共享的播放器實例池,可以靈活配置實例數。通過優化 API 調用和線程資源管控,確保在線程管理、CPU利用、內存占用等方面達到性能最優、資源最省,使性能和體驗達到最佳平衡。通過性能優化,減少了滑動過程中的耗時操作,減少滑動卡頓,讓播放體驗更加絲滑。
HTTPDNS
HTTPDNS可以提供更快速和穩定的DNS解析服務,通過替換傳統DNS解析,可以減少DNS解析時間,提高視頻播放的加載速度和穩定性,從而提升用戶的觀看體驗。音視頻終端SDK和播放器SDK從6.12.0版本開始無需手動開啟HTTPDNS。更多信息,請參見HTTPDNS。
視頻加密
微短劇場景的視頻通常為1~3分鐘的MP4格式視頻,音視頻終端SDK和播放器SDK從6.8.0版本開始支持MP4私有加密播放能力,為微短劇場景的視頻提供安全保障支撐。更多信息,請參見阿里云視頻加密(私有加密)。
經私有加密的MP4格式視頻,需滿足以下條件,才可正常播放:
經私有加密的MP4視頻傳給播放器播放時,業務側(App側)需要為視頻URL追加
etavirp_nuyila=1
,例如:原視頻URL為https://example.aliyundoc.com/test.mp4
,則需要傳給播放器播放的視頻URL為https://example.aliyundoc.com/test.mp4?etavirp_nuyila=1
。App的License對應的uid與產生私有加密MP4的uid是一致的。
如何校驗私有加密視頻是否正確,以私有加密的視頻URL為例說明如下:
meta信息里面應帶有
AliyunPrivateKeyUri
的tag。ffplay不能直接播放。
H265自適應播放
當播放H265流硬解失敗且已設置H264備流時,實現自動降級播放H264備流;若未設置H264備流,則自動降級為H265軟解播放。更多信息,請參見H265自適應播放。
自適應ABR
播放器SDK支持多碼率自適應HLS、DASH視頻流,通過調用播放器的selectTrack
方法切換播放的碼流,可以實現網絡自適應切換視頻清晰度的功能。更多信息,請參見自網絡自適應切換。