Bir iOS oynatıcı örneği oluşturun; oynatma kaynakları, ses düzeyi, oynatma hızı, çözünürlük değiştirme ve ses parçası değiştirme gibi temel oynatma özelliklerini yapılandırın.
Demo uygulamasını çalıştırmak ve test etmek için ApsaraVideo Player SDK'yı indirin ve derleyip çalıştırmak üzere talimatları izleyin.
Video kaynağını yapılandırın
ApsaraVideo Player SDK for iOS, hem video on demand (VOD) hem de canlı yayın oynatmayı destekler.
VOD oynatma yöntemleri: VidAuth (ApsaraVideo VOD kullanıcıları için önerilir), VidSts, UrlSource ve şifreli oynatma.
Canlı yayın oynatma yöntemleri: UrlSource ve şifreli oynatma.
UrlSource, medyayı bir URL'den oynatır. VidSts ve VidAuth ise medya kimliği (Vid) ile medyayı oynatır.
Desteklenen bölgeler hakkında bilgi için ApsaraVideo VOD bölge kimlikleri konusuna bakın.
VOD oynatma
VidAuth (Önerilen)
Bir VOD videosunu VidAuth kullanarak oynatmak için vid özelliğini medya kimliğine ve playAuth özelliğini oynatma kimlik bilgisine ayarlayın.
Medya kimliği: Bir medya dosyasını yükledikten sonra medya kimliğini edinebilirsiniz. ApsaraVideo VOD konsolunda Media Files > Audio/Video yolunu izleyin. Ayrıca SearchMedia API'sini çağırabilirsiniz.
Oynatma kimlik bilgisi: Oynatma kimlik bilgisini almak için GetVideoPlayAuth işlemini çağırın. Elle imza oluşturmayı önlemek amacıyla ApsaraVideo VOD sunucu tarafı SDK'sını entegre etmenizi öneririz. Örnekler için OpenAPI Explorer sayfasına bakın.
ApsaraVideo VOD kullanıcıları için VidSts yerine VidAuth kullanmanızı öneririz; çünkü VidAuth daha iyi kullanılabilirlik ve güvenlik sağlar. Daha fazla bilgi için Kimlik bilgisi yöntemi ile STS yöntemi konusuna bakın.
ApsaraVideo VOD konsolunda HLS şifreleme parametre geçişini etkinleştirirseniz varsayılan parametre adı MtsHlsUriToken olur. Daha fazla bilgi için HLS şifrelemesi için parametre geçişi konusuna bakın.
AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
authSource.vid = @"Vid"; // Required. The video ID (VideoId).
authSource.playAuth = @"<yourPlayAuth>"; // Required. The playback credential from GetVideoPlayAuth.
authSource.region = @"regionID"; // Deprecated for SDK V5.5.5.0 and later. The player automatically parses the region. For earlier versions, this parameter is required. Default: cn-shanghai.
// authSource.authTimeout = 3600; // Optional. Set the validity period of the playback URL in seconds. This value overwrites the validity period configured in the ApsaraVideo VOD console. Default: 3600. Make sure that the value is greater than the video duration to prevent URL expiration during playback.
// If you enable HLS encryption parameter pass-through in the ApsaraVideo VOD console and the default parameter is MtsHlsUriToken, configure it as follows:
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
authSource.playConfig = [vp generatePlayerConfig];
[self.player setAuthSource:authSource];
VidSts
VidSts oynatma, VOD oynatma kimlik bilgileri yerine geçici STS kimlik bilgilerini kullanır. VidSts ile VOD videolarını oynatmadan önce bir STS belirteci ve bir AccessKey çifti (AccessKey ID ve AccessKey secret) edinin. Daha fazla bilgi için STS belirteci edinme konusuna bakın.
ApsaraVideo VOD konsolunda HLS şifreleme parametre geçişini etkinleştirirseniz varsayılan parametre adı MtsHlsUriToken olur. Daha fazla bilgi için HLS şifrelemesi için parametre geçişi konusuna bakın.
AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
source.vid = @"Vid"; // Required. The video ID (VideoId).
source.region = @"regionID"; // Required. The ApsaraVideo VOD region. Default: cn-shanghai.
source.securityToken = @"<yourSecurityToken>"; // Required. The STS token from AssumeRole.
source.accessKeySecret = @"<yourAccessKeySecret>"; // Required. The temporary AccessKey secret from STS (AssumeRole).
source.accessKeyId = @"<yourAccessKeyId>"; // Required. The temporary AccessKey ID from STS (AssumeRole).
// source.authTimeout = 3600; // Optional. Set the validity period of the playback URL in seconds. This value overwrites the validity period configured in the ApsaraVideo VOD console. Default: 3600. Make sure that the value is greater than the video duration to prevent URL expiration during playback.
// If you enable HLS encryption parameter pass-through in the ApsaraVideo VOD console and the default parameter is MtsHlsUriToken, configure it as follows:
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
source.playConfig = [vp generatePlayerConfig];
// Set the playback source.
[self.player setStsSource:source]
UrlSource
Bir VOD videosunu UrlSource kullanarak oynatmak için oynatma URL'sini doğrudan iletin.
ApsaraVideo VOD'dan oynatma URL'lerini almak için GetPlayInfo işlemini çağırabilirsiniz. ApsaraVideo VOD sunucu tarafı SDK'sını entegre etmenizi öneririz. Örnekler için OpenAPI Explorer sayfasına bakın.
Yerel dosyalar için dosyaya erişim iznine sahip olduğunuzdan emin olun.
/sdcard/video/sample.mp4veyacontent://media/video/123gibi tam yollar kullanın.
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // Required. A VOD URL, third-party URL, or local file path.
[self.player setUrlSource:urlSource];
Şifreli oynatma
VOD videoları HLS şifrelemesini, Alibaba Cloud video şifrelemesini ve DRM şifrelemesini destekler. Oynatma için Şifreli bir videoyu oynatma konusuna bakın.
Canlı yayın oynatma
Canlı yayın oynatma için Standart canlı yayın oynatma konusuna bakın.
Oynatmayı kontrol edin
ApsaraVideo Player SDK for iOS, oynatmayı başlatma, duraklatma, durdurma ve belirli bir konuma atlama yöntemleri sağlar.
Oynatmaya hazırlanın
Videoyu oynatmaya hazırlamak için prepare yöntemini çağırın.
[self.player prepare];
Hazırlık tamamlandığında AVPEventPrepareDone ile onPlayerEvent geri çağrısı tetiklenir.
Oynatmayı başlatın
Videoyu oynatmaya başlamak için start yöntemini çağırın:
[self.player start];
Oynatmayı duraklatın
Videoyu duraklatmak için pause yöntemini çağırın:
[self.player pause];
Oynatmayı sürdürün
Duraklatmadan sonra oynatmayı sürdürmek için start yöntemini çağırın:
[self.player start];
Belirli bir konuma atlayın
Belirli bir konuma atlamak için seekToTime yöntemini çağırın. Bu yöntem, kullanıcılar ilerleme çubuğunu sürüklediğinde veya kaydedilmiş bir konumdan oynatmayı sürdürdüğünde kullanışlıdır.
// Seek to a specific position (in milliseconds)
// Accurate seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// Inaccurate seek
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];
Arama modları:
Tam arama (
AVP_SEEKMODE_ACCURATE): Tam konuma atlar. Daha yavaş ancak daha hassastır.Yaklaşık arama (
AVP_SEEKMODE_INACCURATE): En yakın ana kareye atlar. Daha hızlı ancak daha az hassastır.
Belirli bir konumdan oynatmayı başlatın
(Oynatma sırasında atlamak yerine) belirli bir konumdan oynatmayı başlatmak için prepare yöntemini çağırmadan önce setStartTime yöntemini çağırın:
// Set the start time for the next prepare call (in milliseconds).
// This setting is only valid for the immediately following prepare call. The start time is automatically cleared after prepare is called.
// seekMode: accurate seek (AVP_SEEKMODE_ACCURATE) or inaccurate seek (AVP_SEEKMODE_INACCURATE).
[self.player setStartTime:time seekMode:seekMode];
Oynatmayı durdurun
Oynatmayı durdurmak için stop yöntemini çağırın:
[self.player stop];
Oynatıcı görünümünün bağlantısını kaldırın
Oynatmayı durdurduktan ve oynatıcı örneğini yok etmeden önce, oluşturma kaynaklarını serbest bırakmak ve bellek sızıntılarını önlemek için oynatıcı görünümünün bağlantısını kaldırın.
// Unbind the player view
self.player.playerView = nil;
stop yöntemini çağırdıktan ve destroy ya da destroyAsync yöntemini çağırmadan önce oynatıcı görünümünün bağlantısını kaldırın. Oynatmayı sonlandırma sırası şöyledir: stop → görünüm bağlantısını kaldır → destroy / destroyAsync.
Oynatıcıyı yok edin
Kaynakları serbest bırakmak için oynatıcıyı eşzamanlı veya eşzamansız olarak yok edebilirsiniz.
// Synchronous destroy. Blocks until player resources are released. Automatically calls stop.
[self.player destroy];
// Asynchronous destroy. Returns immediately. Automatically calls stop.
[self.player destroyAsync];
Öneriler:
Hızlı yanıt sürelerine ihtiyaç duyuyorsanız
destroyAsyncyöntemini kullanın.Eşzamansız yok etme işlemi sırasında oynatıcı nesnesinde herhangi bir işlem gerçekleştirmeyin.
Yok etme işlemi eşzamansız bir durdurma işlemi içerdiğinden
destroyAsyncyönteminden öncestopyöntemini çağırmanıza gerek yoktur.
Oynatıcı olaylarını dinleyin
ApsaraVideo Player SDK, oynatıcı durum değişikliklerini, oynatma ilerlemesini, hataları ve diğer olayları izlemek için temsilci geri çağrıları sağlar.
Oynatıcı temsilcisini ayarlayın
Oynatıcı geri çağrılarını almak için görünümler denetleyicinizde AVPDelegate protokolünü uygulayın.
Önemli: Hataları işlemek ve oynatma durumu değişikliklerini izlemek için onError ve onPlayerEvent geri çağrılarını uygulayın.
@interface SimplePlayerViewController ()<AVPDelegate>
@end
- (void)viewDidLoad {
self.player = [[AliPlayer alloc] init];
self.player.playerView = self.avpPlayerView.playerView;
self.player.delegate = self;
//...
}
/**
@brief Delegate callback for player errors.
@param player The player instance.
@param errorModel Contains the error details.
*/
- (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
// Handle the error (e.g., show an alert) and stop playback.
}
/**
@brief Delegate callback for player events.
@param player The player instance.
@param eventType The type of the event. See AVPEventType.
*/
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType{
switch(eventType){
case AVPEventPrepareDone:{
// Triggered when the media has been prepared and is ready to play.
}
break;
case AVPEventAutoPlayStart:
// Triggered when autoplay begins.
break;
case AVPEventFirstRenderedStart:
// Triggered when the first frame is rendered.
break;
case AVPEventCompletion:
// Triggered when playback completes.
break;
case AVPEventLoadingStart:
// Triggered when buffering starts.
break;
case AVPEventLoadingEnd:
// Triggered when buffering finishes.
break;
case AVPEventSeekEnd:
// Triggered when a seek operation completes.
break;
case AVPEventLoopingStart:
// Triggered when a new loop begins.
break;
default:
break;
}
}
/**
@brief Callback for the current playback position.
@param player The player instance.
@param position The current playback position in milliseconds.
*/
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// Update the progress bar.
}
/**
@brief Callback for the current buffered position.
@param player The player instance.
@param position The current buffered position in milliseconds.
*/
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// Update the buffer progress indicator.
}
/**
@brief Callback for when track information is ready.
@param player The player instance.
@param info An array of AVPTrackInfo objects for the available streams.
*/
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
// Retrieve information for available bitrates/tracks.
}
/**
@brief Callback for when a subtitle should be displayed.
@param player The player instance.
@param index The index of the subtitle entry.
@param subtitle The subtitle text to be displayed.
*/
- (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
// Get and display the subtitle text.
}
/**
@brief Callback for when a subtitle should be hidden.
@param player The player instance.
@param index The index of the subtitle entry that was shown.
*/
- (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
// Hide the subtitle.
}
/**
@brief Callback for a screen capture request.
@param player The player instance.
@param image The captured screenshot as a UIImage.
*/
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
// Preview or save the captured image.
}
/**
@brief Callback for when a track change is complete.
@param player The player instance.
@param info The AVPTrackInfo object for the new, active track.
*/
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
// Notification that the bitrate/track has changed.
}
Oynatıcı durumu değişikliklerini dinleyin
Oynatıcı durumu değiştiğinde onPlayerStatusChanged geri çağrısı tetiklenir:
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
switch (newStatus) {
case AVPStatusIdle:{
// Player is idle
}
break;
case AVPStatusInitialzed:{
// Player is initialized
}
break;
case AVPStatusPrepared:{
// Player prepared
}
break;
case AVPStatusStarted:{
// Playback started
}
break;
case AVPStatusPaused:{
// Playback paused
}
break;
case AVPStatusStopped:{
// Playback stopped
}
break;
case AVPStatusCompletion:{
// Playback completed
}
break;
case AVPStatusError:{
// Player error occurred
}
break;
default:
break;
}
}
Video görüntüsünü yapılandırın
Oynatma sırasında videonun nasıl ölçeklendirileceğini, döndürüleceğini ve yansıtılacağını yapılandırın.
Ölçeklendirme modları
SDK üç ölçeklendirme modunu destekler:
// Scale to fit the view while maintaining the aspect ratio (letterboxing).
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// Scale to fill the view while maintaining the aspect ratio (cropping).
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// Stretch to fill the view. The aspect ratio is not maintained. Image distortion may occur.
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
Ölçeklendirme modu ayarları Resim içinde Resim (PiP) moduna uygulanmaz.
Döndürme
Videoyu belirtilen açı kadar saat yönünde döndürün:
// No rotation
self.player.rotateMode = AVP_ROTATE_0;
// Rotate 90 degrees clockwise
self.player.rotateMode = AVP_ROTATE_90;
// Rotate 180 degrees clockwise
self.player.rotateMode = AVP_ROTATE_180;
// Rotate 270 degrees clockwise
self.player.rotateMode = AVP_ROTATE_270;
Yansıtma
Videoyu yansıtmak için setMirrorMode yöntemini çağırın. SDK yatay ve dikey yansıtmayı destekler:
// No mirroring
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// Horizontal mirroring
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// Vertical mirroring
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;
Oynatma bilgilerini edinin
Oynatma sırasında oynatma ilerlemesini, süreyi ve arabelleğe alma ilerlemesini edinin.
Oynatma ilerlemesi
Geçerli oynatma konumu onCurrentPositionUpdate geri çağrısında döndürülür:
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// position is in milliseconds
NSString *position = [NSString stringWithFormat:@"%lld, position"];
}
Toplam süre
Video yüklendikten sonra (örneğin, AVPEventPrepareDone olayından sonra) videonun toplam süresini alın:
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone: {
if (self.player.duration >= 0) {
NSString *duration = self.player.duration;
}
}
break;
default:
break;
}
}
Gerçek oynatma süresi
Gerçek zamanlı olarak gerçek oynatma süresini alın. Bu değer, oynatmanın duraklatıldığı veya arabelleğe alındığı süreleri hariç tutar.
NSString *duration = [player getPlayedDuration];
Arabelleğe alma ilerlemesi
Geçerli arabelleğe alma ilerlemesi onBufferedPositionUpdate geri çağrısında döndürülür:
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
NSString *bufferPosition = position;
}
Gerçek zamanlı oluşturma ve bit hızı ölçümleri
Oluşturma kare hızını, ses ve video bit hızını ve ağ aşağı yönlü bit hızını gerçek zamanlı olarak edinin.
// Video rendering frame rate. Returns a float value.
[self.player getOption:AVP_OPTION_RENDER_FPS]
// Video bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
// Audio bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
// Network downstream bitrate. Returns a float value in bit/s.
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]
Ses düzeyini yönetin
Oynatma ses düzeyini kontrol edin ve sesi kapatın.
Ses düzeyini ayarlayın
Ses düzeyini değiştirmek için volume yöntemini çağırın. Geçerli değerler: 0 ile 2 arasındadır; burada 1 özgün ses düzeyidir. 1 değerinden büyük değerler sesi yükseltir ve gürültüye neden olabilir. Ses düzeyini 1 veya altında tutmanızı öneririz.
// Set the volume. Valid values: 0 to 2.
self.player.volume = 1.0f;
// Get the current volume.
self.player.volume
Videoyu sessize alın
Sesi kapatın veya açın:
self.player.muted = YES;
Oynatma hızını ayarlayın
Perdeyi değiştirmeden oynatma hızını normal hızın 0,5× ile 5× katı arasında ayarlayın:
// We recommend using multiples of 0.5 (e.g., 0.5, 1.0, 1.5, 2.0)
self.player.rate = 1.0f;
Çözünürlükleri değiştirin
Ayrıntılı kod örnekleri için API-Example projesindeki MultiResolution modülüne bakın.
VidAuth veya VidSts tabanlı oynatma
VOD oynatma için VidAuth veya VidSts kullanıyorsanız SDK video tanımlarını ApsaraVideo VOD'dan otomatik olarak alır. Ek yapılandırma gerekmez.
Kullanılabilir tanımları sorgulayın
Video yüklendikten sonra onTrackReady geri çağrısında kullanılabilir tanımları (trackBitrate) alın:
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
for (int i=0; i<info.count; i++) {
AVPTrackInfo* track = [info objectAtIndex:i];
switch (track.trackType) {
case AVPTRACK_TYPE_VIDEO: {
int trackBitrate = track.trackBitrate;
}
break;
}
}
}
Tanımı değiştirin
İstenen parçanın dizinini kullanarak selectTrack yöntemini çağırın:
[self.player selectTrack:index];
Tanım değiştirme olaylarını dinleyin
Tanım değiştirildikten sonra onTrackChanged geri çağrısı tetiklenir:
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
// Definition switched.
}
Hızlı değiştirmeyi etkinleştirin
Tanımları manuel olarak değiştirirken daha hızlı yanıtlar almak için hızlı değiştirme modunu etkinleştirin:
AVPConfig *config = [self.player getConfig];
config.selectTrackBufferMode = 1;
[self.player setConfig:config];
UrlSource tabanlı canlı yayın
Ayrıntılar için Standart canlı yayın oynatma konusuna bakın.
Döngüsel oynatmayı etkinleştirin
Oynatma tamamlandığında videoyu baştan otomatik olarak yeniden başlatmak için döngüsel oynatmayı etkinleştirin:
self.player.loop = YES;
Her döngünün başında AVPEventLoopingStart olayı tetiklenir:
- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventLoopingStart:
break;
}
}
Ses parçalarını değiştirin
Oynatma sırasında farklı dillerdeki ses parçaları arasında geçiş yapın.
Desteklenen akış türleri
Aşağıdaki akış türleri ses parçası değiştirmeyi destekler. Değiştirme davranışı akış türüne göre değişir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kullanılabilir ses parçalarını alın
Ses parçası bilgileri mevcut olduğunda onSubTrackReady geri çağrısı tetiklenir:
// onSubTrackReady. Typically triggered before the AVPEventPrepareDone event.
- (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
// Call getSubMediaInfo after this callback is triggered. Calling it before this callback returns an empty result.
AVPMediaInfo* subMediaInfo = [player getSubMediaInfo];
// Iterate through available audio tracks
for (int i=0; i<subMediaInfo.tracks.count; i++) {
AVPTrackInfo* track = [mediaInfo.tracks objectAtIndex:i];
// Find the target audio track from the track list.
}
}
Ses parçasını değiştirin
Farklı bir ses parçasına geçmek için selectTrack yöntemini çağırın:
[self.player selectTrack:myTrack.trackIndex accurate:YES]
Küçük resimleri kullanın
Ayrıntılı kod örnekleri için API-Example projesindeki Thumbnail modülüne bakın.
Video küçük resimleri (sprite sayfaları), kullanıcıların zaman çizelgesinde gezinirken video içeriğini önizlemesine olanak tanır.
Küçük resimleri kullanmadan önce videonuz için sprite anlık görüntülerini yapılandırın. ApsaraVideo VOD konsolunda, anlık görüntü türü olarak Image Sprite seçili bir anlık görüntü şablonu oluşturun ve ardından videoyu işlemek için bir iş akışı oluşturun. Daha fazla bilgi için Video anlık görüntüleri konusuna bakın.
/**
A flag indicating whether the current track has thumbnails. If false, thumbnail previews will not be displayed during seeking.
*/
@property (nonatomic,assign)BOOL trackHasThumbnai;
/**
The custom UIImageView used to display the thumbnail preview image.
*/
@property (nonatomic,strong)UIImageView *thumbnaiView;
/**
onPrepare
*/
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
if(newStatus == AVPStatusPrepared){
[self.player setThumbnailUrl:[URL];// When the player is prepared, set the thumbnail URL.
self.trackHasThumbnai = YES;
}
}
/**
Callback triggered when the progress slider's value changes.
@param playerView The player view instance.
@param value The new progress value.
*/
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
if (self.trackHasThumbnai) {
[self.player getThumbnail:self.player.duration*value];
}
}
/**
@brief: Callback triggered upon successful retrieval of a thumbnail.
@param positionMs: The requested time position for the thumbnail, in milliseconds.
@param fromPos: The start time of the segment this thumbnail represents, in milliseconds.
@param toPos: The end time of the segment this thumbnail represents, in milliseconds.
@param image: The retrieved thumbnail image (`UIImage` on iOS, `NSImage` on macOS).
*/
- (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: Callback triggered when thumbnail retrieval fails.
@param positionMs: The time position for which the thumbnail request failed, in milliseconds.
*/
- (void)onGetThumbnailFailed:(int64_t)positionMs {
self.thumbnaiView.hidden = YES;
}
SDK günlüklerini alın
SDK günlükleri, geliştirme sırasında hata ayıklama amacıyla istek durumunu, çağrı sonuçlarını ve izin isteklerini kaydeder. SDK günlükleri almak için iki yöntem sunar.
Yöntem 1: Günlükleri geliştirme aracı konsolunda görüntüleyin
Bu yöntem, sorunu yerel olarak çoğaltabildiğiniz senaryolar için uygundur.
-
Günlük kaydını etkinleştirin ve günlük düzeyini ayarlayın:
// Enable SDK logging [AliPlayer setEnableLog:YES]; // Set the log level (default: LOG_LEVEL_INFO). Use LOG_LEVEL_TRACE for detailed troubleshooting. [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil]; -
Kare düzeyinde günlük kaydını etkinleştirin (isteğe bağlı):
// Enable frame-level logging for detailed troubleshooting // 0 = disabled, 1 = enabled [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];NotKare düzeyinde günlük kaydı büyük hacimde günlük üretir ve öncelikli olarak oynatma sorunlarını gidermek için kullanılır.
-
Günlükleri toplayın:
Seçenek A: Günlükleri konsolda görüntüleyin
Sorunu çoğalttıktan sonra günlükleri XCode gibi geliştirme aracı konsolunuzdan alın.
Seçenek B: Günlükleri bir dosyaya yazın
Uygulamanın korumalı alanı içinde günlük dosyanız için tam yolu ayarlayın.
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; // Define your custom log file path. For example, create a file named 'xxxx.log'. NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];Günlükleri uygulamanın korumalı alanındaki özel bir dosyaya yönlendirin:
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout); freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);Sorunu çoğalttıktan sonra
.logdosyasını özel dizinden alın.
Yöntem 2: Günlükleri programlı olarak almak için LogCallback ayarlayın
Sorunu cihazınızda güvenilir bir şekilde çoğaltamadığınızda bu yöntemi kullanın. Geri çağrı, günlükleri uygulamanızın günlük kanalına aktarır.
-
Günlük kaydını etkinleştirin ve günlük düzeyini ayarlayın.
// Enable SDK logging [AliPlayer setEnableLog:YES]; // Set the log level. Default value: LOG_LEVEL_INFO. For troubleshooting, set it to LOG_LEVEL_TRACE. [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) { NSLog(@"strLog:%@", strLog); }]; -
Günlükleri toplayın:
Sorunu çoğalttıktan sonra günlükler otomatik olarak uygulamanızın günlük sistemine iletilir.
Sorun giderme
Yaygın sorunlar
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Başvurular
Gelişmiş özellikler: Resim içinde Resim (PiP), zaman kaydırma ve adaptif bit hızı akışı gibi gelişmiş özellikler hakkında bilgi edinin.
API başvurusu: ApsaraVideo Player SDK for iOS için eksiksiz API başvurusunu keşfedin.
Mobil hata kodları: Sorun giderme için bu konuya bakın.