Tüm Ürünler
Search
Belge Merkezi

ApsaraVideo VOD:Basic features of ApsaraVideo Player SDK for iOS

Son Güncelleme:Oct 05, 2026

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.

Önemli

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.

Not
  • 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.mp4 veya content://media/video/123 gibi 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;
Not

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 destroyAsync yö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 destroyAsync yönteminden önce stop yö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;
Not

Ö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

Not

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.


Akış türü


Uzantı


Bit hızı sayısı


Alt akış türü


Değiştirme davranışı


Liste dışı akış (MP4)


.mp4


1


Bir video parçası, birden çok ses ve altyazı parçası


Ses parçaları arasında geçiş yapabilirsiniz.


Tek bit hızlı karma HLS


.m3u8


1


Bir video parçası, birden çok ses ve altyazı parçası


Ses parçaları arasında geçiş yapabilirsiniz.


Tek bit hızlı HLS


.m3u8


1


Ayrı video, ses ve altyazı alt akışları


Ses parçaları arasında geçiş yapabilirsiniz.


Çok bit hızlı karma HLS


.m3u8


n


Farklı bit hızlarına sahip, her biri bir video ve birden çok ses parçası içeren alt akışlar


Yalnızca alt akışlar arasında geçiş yapabilirsiniz; bir alt akış içindeki ses parçaları arasında geçiş yapamazsınız.

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

Not

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.

  1. 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];
  2. 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];
    Not

    Kare 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.

  3. 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 .log dosyası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.

  1. 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);
    }];
  2. 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


Sorun


Olası neden


Çözüm


Video oynatılmıyor


Geçersiz oynatma kaynağı


Video kimliğinin veya URL'nin doğru olduğunu doğrulayın


Siyah ekran


Oynatıcı görünümü ayarlanmamış


player.playerView özelliğinin geçerli bir görünüme ayarlandığından emin olun


Oynatma kimlik bilgisi süresi doldu


Belirtecin süresi doldu


Oynatma kimlik bilgisini yeniden oluşturun ve yeniden deneyin


Ses var ancak video yok


Desteklenmeyen kodek


Video biçimini ve kodek uyumluluğunu kontrol edin


Takılarak oynatma


Zayıf ağ


Adaptif bit hızı akışını etkinleştirin veya kaliteyi düşürün

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.