本文介紹iOS播放器SDK在使用過程中的常見問題及解決方案。推薦下載使用最新版本,下載地址請參見播放器SDK。
使用iOS Xcode14打包提交到App Store審核時報錯
出現包含bitcode的錯誤
問題現象:使用iOS Xcode14打包APP並提交到App Store審核時出現包含bitcode的錯誤,報錯樣本如下:
ITMS-90482: Invalid Executable - The executable 'xxx.app/Frameworks/alivcffmpeg.framework/alivcffmpeg' contains bitcode.
處理方法:您可以通過xcrun bitcode_strip手動去除對應的framework的bitcode。如下樣本中,${framework_path}是framework的二進位檔案路徑。
xcrun bitcode_strip ${framework_path} -r -o ${framework_path}
出現使用curl的錯誤
問題現象:當使用iOS Xcode14打包APP並提交到App Store審核時出現使用curl的錯誤,報錯樣本如下:
ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/AliyunPlayer.framework/AliyunPlayer: _curl_multi_poll, _curl_multi_wakeup. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For further information, visit the Technical Support Information at http://developer.apple.com/support/technical/
處理方法:
如果您的專案中只整合了播放器SDK(AliPlayerSDK_iOS),則建議您升級到5.4.9.2以上版本。
如果您的專案中既整合了播放器SDK(AliPlayerPartSDK_iOS),同時還整合了短視頻SDK,則建議播放器SDK升級到5.4.9.2以上版本,alivcffmpeg(QuCore-ThirdParty)升級到4.3.6版本,短視頻SDK升級到3.26以上版本。
出現非公開方法報錯
問題現象:當使用iOS Xcode14打包APP並提交到App Store審核時出現非公開方法的錯誤,報錯樣本如下:
處理方法:上述報錯為Xcode14構建的警告,通常情況下,只要工程能構建出來,即便有警告也不影響正常發布;如果不能正常發布,則建議優先使用Xcode13系列進行發布。
出現引入mpf_filter.framework、vfi_filter.framework等插幀、銳利化後處理外掛程式相關報錯
問題現象:當使用iOS Xcode14打包APP並提交到App Store審核時出現引入mpf_filter.framework、vfi_filter.framework等插幀、銳利化後處理外掛程式相關的錯誤,報錯樣本如下:
處理方法:
如果您的工程中沒有使用到報錯提及的外掛程式,則建議您刪除報錯的外掛程式,不僅不會影響播放器的能力,還可以減小包的體積。
如果您的工程中必須使用報錯提及的外掛程式,則可以暫時在該framework路徑下的Info.plist檔案中的
"Bundle identifier"
索引值對中,將值字串中的"_"
手動去掉,然後再進行編譯構建工程。可升級至5.5.2.0及以上版本,已修正命名。
IOS Demo 編譯運行碰到Xcode Error PhaseScriptExecution failed with a nonzero exit code 該怎麼辦?
操作流程如下:
1. 進入專案目錄。
2. 執行 pod deintegrate。
3. 執行 pod install。
在iOS系統上整合阿里雲播放器SDK後,是否支援在Xcode模擬器上調試運行?
iOS播放器SDK
建議您使用iPhone真機進行調試運行。目前僅5.4.7.1以上版本的iOS播放器SDK支援在iPhone模擬器上調試,且不支援在M1晶片的Mac模擬器上調試運行。
Flutter播放器SDK
建議使用iPhone真機調試運行。如果使用Xcode14在iphone模擬器上編譯如下圖的報錯,您可以注釋掉AliPlayerFactory.m檔案中的
setFilterConfig:
、updateFilterConfig:
、setFilterInvalid:
這三個介面方法,並一同注釋掉在Flutter播放器SDK中調用到這三個介面方法的代碼。
播放HLS視頻流並配置本機快取後,播放失敗報錯403
問題現象:當以VidAuth播放方式,播放HLS(M3U8)協議的視頻流時,開啟本機快取後,出現播放失敗並報錯403。
問題原因:由於開啟本機快取後,如果在沒有充分緩衝的狀態下退出播放,當下一次起播時,未緩衝的部分因仍然使用上一次到期的Vid鑒權資訊請求,從而導致鑒權失敗報錯403。
處理方法:針對5.5.4.0及以後版本的播放器SDK,如果視頻播放URL帶有鑒權參數且播放協議為HLS,可以通過設定AVPConfig.enableStrictAuthMode
欄位,進行不同鑒權模式的選擇(預設值為false)。
非嚴格鑒權(false):鑒權也緩衝,若上一次只緩衝了部分媒體,下次播放至非緩衝部分時,播放器會用緩衝的鑒權發起請求,如果URL鑒權設定的有效期間很短,會導致播放異常。
嚴格鑒權(true):鑒權不緩衝,每次起播都進行鑒權,無網路下會導致起播失敗。
音頻搶佔導致iOS播放器SDK無法正常播放
問題現象:如果您的代碼工程中既使用了阿里雲iOS播放器SDK,同時還使用了其它音頻播放控制項,使用阿里雲iOS播放器SDK播放視頻時,視頻出現無聲、畫面卡住等無法正常播放的現象。
問題原因:iOS系統的音頻控制項AVAudioSession
是單例,多個音頻播放控制項如果不統一設定,則可能造成音頻搶佔的問題,從而造成無法使用阿里雲iOS播放器SDK正常播放視頻。
處理方法:您可以在工程中適當的位置,進行統一設定AVAudioSession
。例如:將應用的音頻會話配置為播放類別,並允許與其他應用混音。再如,將應用的音頻會話配置為PlayAndRecord
類別,用於錄製+播放的情境。如果操作過程中有任何錯誤,錯誤資訊將被儲存在err
變數中。
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err];
同時,在阿里雲iOS播放器SDK側通過自訂設定AVAudioSession
的代理,不使用SDK內部定義好的AVAudioSession
邏輯,從而規避阿里雲iOS播放器SDK側可能造成的音頻搶佔風險。阿里雲iOS播放器SDK側的配置樣本如下:
設定代理。
[AliPlayer setAudioSessionDelegate:self];
設定代理的監聽。
return TRUE
表示SDK內部不再對AVAudioSession
進行設定。#pragma mark CicadaAudioSessionDelegate - (BOOL)setActive:(BOOL)active error:(NSError **)outError { return YES; } - (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; } - (BOOL)setCategory:(AVAudioSessionCategory)category mode:(AVAudioSessionMode)mode routeSharingPolicy:(AVAudioSessionRouteSharingPolicy)policy options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; }
iOS播放器SDK運行時出現指向SDK的堆棧崩潰
iOS播放器SDK是否支援邊下載邊播放?
不支援。iOS播放器SDK支援在播放的過程中通過開啟本機快取功能緩衝下載視頻檔案,下次再播放時,直接播放緩衝好的視頻檔案;目前不支援將放在檔案目錄下的本機快取視頻檔案單獨拿出來進行播放。
iOS播放器SDK是否支援擷取播放視頻的緩衝進度?
支援。iOS播放器SDK支援擷取播放視頻的緩衝速度、即時渲染幀率、音視頻碼率、網路下行碼率。詳細資料,請參見擷取播放資訊。
如何擷取當前播放進度
播放器SDK預設每500 ms回調一次播放進度。您可以修改回調間隔時間,通過將間隔時間縮短,以更高頻率地擷取當前播放進度,範例程式碼如下:
AVPConfig *config = [self.player getConfig];
config.positionTimerIntervalMs = 100; // 修改回調間隔時間,單位:ms。
[self.player setConfig:config];
/**
@brief:視頻當前播放位置回調。
@param player:播放器player指標。
@param position:視頻當前播放位置。
*/
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// 當前播放進度。
long currentPosition = position;
}
如何擷取視頻的寬高
可通過如下三種方式進行擷取:
方式一:通過iOS播放器AliPlayer執行個體執行完prepare方法,當處於準備完成狀態後(AVPEventPrepareDone),可以直接擷取AliPlayer執行個體的寬(width)和高(height)。
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType { if (eventType == AVPEventPrepareDone) { NSLog(@"視頻的寬:%d,高:%d", player.width, player.height); } }
方式二:通過監聽視頻大小變化回調的方法,直接返回視頻的寬(width)和高(height)。
- (void)onVideoSizeChanged:(AliPlayer*)player width:(int)width height:(int)height rotation:(int)rotation { NSLog(@"視頻的寬:%d,高:%d", width, height); }
方式三:通過監聽擷取track資訊回調的方法,根據info數組返回的AVPTrackInfo,擷取視頻的寬(videoWidth)和高(videoHeight)。
說明監聽擷取track資訊回調,由於是從網路請求,其成功擷取到視頻的寬高資訊依賴網路品質,建議使用方式一和方式二的方法擷取視頻的寬高資訊更為可靠。
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { for (int i=0; i<info.count; i++) { AVPTrackInfo *trackInfo = info[i]; NSLog(@"視頻的寬:%d,高:%d", trackInfo.videoWidth, trackInfo.videoHeight); } }
播放器運行過程中發生crash
可通過以下步驟排查問題產生原因:
確認crash是否產生在播放器SDK。
查看是否有帶
AliyunPlayer
首碼的崩潰堆棧,如果有,則說明問題產生在播放器SDK。升級至最新版播放器SDK並驗證,確認問題是否已經修複。
如果問題依然存在,請準備相關的崩潰檔案(包含全部線程)、崩潰日誌、崩潰情境等資訊,如何擷取問題日誌。
V5.4.6.0版本播放器SDK運行過程中發生程式初始化、調用預先載入相關crash
建議升級到V5.4.7.1以上版本的播放器SDK。如果需要保持V5.4.6.0版本的穩定性,也可以使用修複版本pod 5.4.6.0-25587639
。
視頻播放相關問題
如何?全屏播放
iOS播放器SDK不提供全屏播放的API,需要您根據系統自行實現。iOS播放器SDK Demo從5.5.0.0版本開始已經適配了iOS 16.0以上系統的全屏方法。
實現方法樣本如下:
執行系統全屏方法後,需要同時將Aliplayer執行個體設定的playerView的frame根據螢幕進行調整。
UIInterfaceOrientation orientation = UIInterfaceOrientationLandscapeLeft; // 要旋轉為全屏
......
// iOS 16.0以上的系統
if (@available(iOS 16.0, *)) {
@try {
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
UIWindowScene *ws = (UIWindowScene *)array[0];
Class GeometryPreferences = NSClassFromString(@"UIWindowSceneGeometryPreferencesIOS");
id geometryPreferences = [[GeometryPreferences alloc]init];
UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskLandscapeRight;
if (orientation == UIInterfaceOrientationPortrait) {
orientationMask = UIInterfaceOrientationMaskPortrait;
}
[geometryPreferences setValue:@(orientationMask) forKey:@"interfaceOrientations"];
SEL sel_method = NSSelectorFromString(@"requestGeometryUpdateWithPreferences:errorHandler:");
void (^ErrorBlock)(NSError *err) = ^(NSError *err){
NSLog(@"旋轉螢幕出錯:%@", [err debugDescription]);
};
if ([ws respondsToSelector:sel_method]) {
(((void (*)(id, SEL,id,id))[ws methodForSelector:sel_method])(ws, sel_method,geometryPreferences,ErrorBlock));
}
} @catch (NSException *exception) {
NSLog(@"旋轉螢幕出錯:%@", exception.reason);
} @finally {
}
} else { // iOS16.0以下的系統
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
[invocation setArgument:&Orientation atIndex:2];
invocation invoke];
}
[[UIApplication sharedApplication]setStatusBarOrientation:orientation animated:YES];
}
視頻播放時畫面有黑邊
可通過以下步驟排查問題產生原因:
檢查視頻源本身是否存在黑邊問題。
可通過如下介面調節播放器的縮放模式。
/* AVP_SCALINGMODE_SCALEASPECTFILL:按比例填充,畫面會有裁剪。 AVP_SCALINGMODE_SCALEASPECTFIT:按比例縮放,會有黑邊。 AVP_SCALINGMODE_SCALETOFILL:不按比例填充,畫面會變形。 */ self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
若縮放模式依然無法滿足需求,則可以調節設定
self.player.playerView
的自訂View的寬和高(通過修改self.player.playerView
的frame
實現)。
播放視頻時有聲音無畫面,日誌報log[AFVTBDecoder] :IOS8VT: throw frame
可通過以下步驟排查問題產生原因:
使用其他播放器播放,檢查視頻是否是純音頻。
使用其他播放器播放時播放正常且出現視頻源長寬變化,則可以設定成軟解碼方式,設定方法如下:
player.enableHardwareDecoder = NO
IOS端應用處於後台時或未啟動時,通過通知進入時就會出現有聲音無畫面的狀況。
解決方案:可去除UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]
。
- (AliPlayer *)aliPlayer{
if (!_aliPlayer && UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]) {
_aliPlayer = [[AliPlayer alloc] init];
_aliPlayer.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
_aliPlayer.rate = 1;
_aliPlayer.delegate = self;
_aliPlayer.playerView = self.playerView;
}
return _aliPlayer;
}
播放直播流時,日誌報標準錯誤-5,IO錯誤(Input/Output (I/O))
播放直播流時,建議緩衝和延遲控制設定(AVPConfig中的startBufferDuration
、highBufferDuration
、maxBufferDuration
)都保持預設值,不進行自訂配置。請參見配置緩衝和延遲控制排查是否自訂了配置緩衝和延遲控制。
暫停後返回繼續播放,日誌報聲音相關的錯誤Deactivating an audio session that has running I/O.
或All I/O should be stopped or paused prior to deactivating the audio session.
問題現象:在視頻播放頁面暫停播放並跳轉到其他有聲音的播放頁面,返回時無法繼續播放,日誌報聲音相關的錯誤Deactivating an audio session that has running I/O.
或All I/O should be stopped or paused prior to deactivating the audio session.
。
解決方案:排查是否存在聲音設定(AudioSession屬性)的衝突,例如當從其他有聲頁面退出時未及時恢複對聲音的佔用(未及時關閉相關的錄音或者聲音播放)。
使用列表播放器AliListPlayer播放HLS(m3u8)視頻報錯
V5.4.5.0及之前版本的播放器SDK不支援使用列表播放器AliListPlayer
播放HLS(m3u8)格式的視頻。從V5.4.5.0之後版本開始支援播放HLS(m3u8)格式的視頻,但是需要開啟本機快取,開啟本機快取的方法請參見本機快取。
無法實現在背景播放視頻
問題現象:iOS播放器SDK無法支援後台播放視頻(即按home鍵以後還能繼續播放視頻),用Demo測試也無法實現後台播放。
解決方案:
在Xcode中開啟後台採集資料功能。樣本如下:
如果實現了程式前後台監聽方法,則需要注釋掉相關的暫停、重新播放方法。
// 添加檢測APP進入背景觀察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnterBackground) name: UIApplicationWillResignActiveNotification object:nil]; // APP從後台進入前台時會調用該方法 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name: UIApplicationDidBecomeActiveNotification object:nil]; // 需注釋掉的暫停方法 - (void)applicationEnterBackground { // [self.player pause]; } // 需注釋掉的重新播放方法 - (void)applicationDidBecomeActive { // [self.player start]; }
seek相關問題
seek後,進度條異常回跳
問題原因:播放器預設使用不精準seek。seek後播放器會從seek點附近的主要畫面格開始播放。
解決方案:切換為精準seek模式。
如何切換精準seek和非精準seek模式
切換seek模式的範例程式碼如下:
//切換為非精準seek。
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_INACCURATE];
//切換為精準seek。
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_ACCURATE];
使用精準seek模式後,進度條也會異常回跳
問題原因:由於精準seek耗時比非精準seek耗時更長,當seek點距離主要畫面格間隔過大,超過精準seek的最大間隔時,播放器SDK會自動切換成非精準seek,導致進度條回跳。
解決方案:可以通過介面設定精準seek的最大間隔,將精準seek的最大間隔調大,降低精準seek被切換成非精準seek的頻率,以提高seek精準度,但當seek的點距離主要畫面格間隔太長時,耗時也將更長,請根據業務特點合理設定精準seek的最大間隔。範例程式碼如下:
//單位:ms。
[self.player setMaxAccurateSeekDelta:100];
使用邊播邊緩衝(CacheConfig)時緩衝失敗
可以在onPlayerEvent回調中,擷取緩衝失敗的原因。onPlayerEvent回調的範例程式碼如下:
/**
@brief:播放器事件回調。
@param player:播放器player指標。
@param eventWithString:播放器事件類型。
@param description:播放器事件說明。
@see AVPEventType
*/
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_PLAYER_CACHE_SUCCESS) { // 邊播邊緩衝成功。
} else if (eventWithString == EVENT_PLAYER_CACHE_ERROR) { // 邊播邊緩衝失敗。
NSString *errorMsg = description;
}
}
常見的失敗原因如下:
CacheConfig中設定的大小和時間長度與視頻不匹配導致緩衝失敗。
在播放過程中,stop或者seek到buffer外導致緩衝失敗。
播放器SDK V5.4.4.0版本,新增支援的預先載入和本機快取能力,可以完全替代邊播邊緩衝的使用情境。建議使用新增加的本機快取能力,更多內容請參見進階功能。
視頻緩衝時報錯encrypt check fail
緩衝即下載,如果設定了安全下載,請確認加密校正檔案與App資訊是否匹配(即需要將離線下載中產生的加密校正檔案下載並儲存到播放器SDK中,詳細內容請參見視頻下載),否則會導致緩衝或下載失敗。
擷取音視頻來源資料
擷取音視頻來源資料的範例程式碼如下:
// 設定渲染回調。
self.player.renderingDelegate = self;
// 監聽渲染回調。
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo {
if (frameInfo.frameType == Cicada_FrameType_Video) { // 底層視頻資料。
} else if (frameInfo.frameType == Cicada_FrameType_Audio) { // 底層音頻資料。
}
return NO;
}
自動碼率切換邏輯
當開啟自動碼率切換,即調用了[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];
介面後,播放器SDK內部會統計當前網速,當10秒內網速達到下一個碼率時,就會切換到下一個碼率。若10秒內網速未達到下一個碼率,則不切換。
從高碼率切換到低碼率的情境,當10秒內網速達到下一個碼率時,會將已緩衝的高碼率內容播放完成後才切換。
從低碼率切換到高碼率的情境,當10秒內網速達到下一個碼率時,會直接切換。
自訂重試邏輯
在網路重試情境下,播放器SDK預設重試次數為2次,網路逾時時間為15秒,當重試失敗後會觸發Error回調。
可以自訂重試邏輯,當觸發重試時,將重試事件通知到外部,由外部決定具體的重試邏輯。範例程式碼如下:
AVPConfig *config = [self.player getConfig];
config.networkRetryCount = 0; // 設定重試次數,此處以設定為0為例。
[self.player setConfig:config];
/**
@brief:播放器事件回調。
@param player:播放器player指標。
@param eventWithString:播放器事件類型。
@param description:播放器事件說明。
@see AVPEventType
*/
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_PLAYER_NETWORK_RETRY) { // 網路失敗,需要重試。
// TODO做相應的邏輯處理。
}
}
播放RTS流時,報錯協議不支援
可通過以下步驟排查報錯原因:
檢查3個SDK(AliPlayerSDK_iOS、AliPlayerSDK_iOS_ARTC、RtsSDK)是否全部都已整合。
使用阿里雲播放器播放RTS流,需要整合3個SDK:AliPlayerSDK_iOS、AliPlayerSDK_iOS_ARTC、RtsSDK。整合操作可參見阿里雲播放器SDK整合Native RTS SDK實現說明。
檢查Native RTS SDK(RtsSDK)和阿里雲播放器SDK(AliPlayerSDK_iOS)的版本是否配套。
Native RTS SDK和阿里雲播放器SDK有版本配套關係,需要整合對應的版本,版本配套關係請參見SDK下載。
檢查AliPlayerSDK_iOS和AliPlayerSDK_iOS_ARTC的版本是否一致,需保持一致。
縮圖使用
在播放器SDK中使用縮圖前,請確保已為視頻配置縮圖,即視頻已產生雪碧截圖(在ApsaraVideo for VOD控制台建立類型為雪碧圖的截圖模板,通過工作流程將視頻用該雪碧圖的截圖模板處理後,產生雪碧圖資料),詳細內容請參見視頻截圖。播放器SDK中使用縮圖的範例程式碼如下:
/**
當前Track是否有縮圖,如果沒有,不展示縮圖。
*/
@property (nonatomic,assign)BOOL trackHasThumbnai;
/**
建立自訂顯示縮圖的視圖。
*/
@property (nonatomic,strong)UIImageView *thumbnaiView;
/**
@brief:擷取track資訊回調。
@param player:播放器player指標。
@param info:track流資訊數組,可參考AVPTrackInfo。
*/
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
AVPMediaInfo* mediaInfo = [player getMediaInfo];
if ((nil != mediaInfo.thumbnails) && (0 < [mediaInfo.thumbnails count])) {
[self.player setThumbnailUrl:[mediaInfo.thumbnails objectAtIndex:0].URL];
self.trackHasThumbnai = YES;
}else {
self.trackHasThumbnai = NO;
}
}
/**
進度條改變進度回調。
@param playerView playerView
@param value:進度值。
*/
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
if (self.trackHasThumbnai) {
[self.player getThumbnail:self.player.duration*value];
}
}
/**
@brief:擷取縮圖成功回調。
@param positionMs:指定的縮圖位置。
@param fromPos:此縮圖的開始位置。
@param toPos:此縮圖的結束位置。
@param image:縮圖略映像指標,對於mac是NSImage,iOS平台是UIImage指標。
*/
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
self.thumbnaiView.hidden = NO;
[self.thumbnaiView setImage:(UIImage *)image];
}
/**
@brief:擷取縮圖失敗回調。
@param positionMs:指定的縮圖位置。
*/
- (void)onGetThumbnailFailed:(int64_t)positionMs {
self.thumbnaiView.hidden = YES;
}
請注意:如果使用者使用的是URL方式的播放,使用上述代碼並不能直接顯示縮圖,因為onTrackReady並不支援URL播放的MediaInfo回調,建議使用者直接指定縮圖URL。
/**
當前Track是否有縮圖,如果沒有,不展示縮圖。
*/
@property (nonatomic,assign)BOOL trackHasThumbnai;
/**
建立自訂顯示縮圖的視圖
*/
@property (nonatomic,strong)UIImageView *thumbnaiView;
/**
onPrepare
*/
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
if(newStatus == AVPStatusPrepared){
[self.player setThumbnailUrl:[URL];// 具體的縮圖url 請根據控制台api產生
self.trackHasThumbnai = YES;
}
}
/**
進度條改變進度回調。
@param playerView playerView
@param value:進度值。
*/
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
if (self.trackHasThumbnai) {
[self.player getThumbnail:self.player.duration*value];
}
}
/**
@brief:擷取縮圖成功回調。
@param positionMs:指定的縮圖位置。
@param fromPos:此縮圖的開始位置。
@param toPos:此縮圖的結束位置。
@param image:縮圖略映像指標,對於mac是NSImage,iOS平台是UIImage指標。
*/
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
self.thumbnaiView.hidden = NO;
[self.thumbnaiView setImage:(UIImage *)image];
}
/**
@brief:擷取縮圖失敗回調。
@param positionMs:指定的縮圖位置。
*/
- (void)onGetThumbnailFailed:(int64_t)positionMs {
self.thumbnaiView.hidden = YES;
}
清晰度相關問題
視頻轉碼了多個清晰度,播放器SDK預設會播放視頻的哪個清晰度?
預設清晰度播放順序:FD、LD、SD、HD、2K、4K、OD,清晰度的定義請參見清晰度:Definition。播放器SDK會從左至右依次尋找,找到哪個清晰度就播放哪個清晰度。
如何指定視頻播放預設清晰度?
範例程式碼如下:
//以VidSts播放方式為例。
AVPVidStsSource *stsSource = [[AVPVidStsSource alloc] init];
stsSource.vid = @"<vid>";
stsSource.accessKeyId = @"<accessKeyId>";
stsSource.securityToken = @"<securityToken>";
stsSource.accessKeySecret = @"<accessKeySecret>";
stsSource.quality = @""; // 期望播放的清晰度,取值為FD、LD、SD、HD、2K、4K、OD。
stsSource.forceQuality = NO; // 是否強制使用期望播放的清晰度播放。NO:不強制使用期望的清晰度播放,按播放器SDK的預設清晰度播放順序尋找播放;YES:強制使用設定的期望清晰度播放,如果找不到期望播放的清晰度就不播放。
如果同一個清晰度有多個碼流,播放器SDK會播放哪個碼流?
當同一個清晰度有多個碼流時,播放器SDK會播放最新的碼流。
如何設定同一個視頻,在播放時無浮水印,下載後帶浮水印?
將視頻轉碼多個清晰度,播放時播放無浮水印的清晰度,下載時下載有浮水印的清晰度。
橫屏無法生效
iOS播放器SDK本身不提供實現橫屏的方法,您需要根據iOS系統API實現,注意實現橫屏時合理設定aliplayer.playerView
的frame
。
如何擷取問題日誌
當您向阿里雲擷取支援人員時,請將您的問題日誌一併提交,以便更高效地為您解決問題。問題日誌的擷取方法如下: