All Products
Search
Document Center

ApsaraVideo VOD:Fitur dasar SDK ApsaraVideo Player untuk iOS

Last Updated:Aug 21, 2026

Buat instans pemutar iOS dan konfigurasikan fitur pemutaran dasar seperti sumber pemutaran, volume, kecepatan pemutaran, pengalihan resolusi, dan pengalihan track audio.

Penting

Untuk menjalankan dan menguji demo, unduh SDK ApsaraVideo Player dan ikuti instruksi untuk mengompilasi dan menjalankannya.

Konfigurasi sumber video

SDK ApsaraVideo Player untuk iOS mendukung pemutaran video sesuai permintaan (VOD) dan streaming langsung.

  • Metode pemutaran VOD: VidAuth (direkomendasikan untuk pengguna ApsaraVideo VOD), VidSts, UrlSource, dan pemutaran terenkripsi.

  • Metode pemutaran streaming langsung: UrlSource dan pemutaran terenkripsi.

Catatan
  • UrlSource memutar media dari URL. VidSts dan VidAuth memutar media berdasarkan ID media (Vid).

  • Untuk informasi tentang wilayah yang didukung, lihat ID wilayah ApsaraVideo VOD.

Pemutaran VOD

VidAuth (Direkomendasikan)

Untuk memutar video VOD menggunakan VidAuth, atur properti vid ke ID media dan properti playAuth ke kredensial pemutaran.

  • ID Media: Anda dapat memperoleh ID media setelah mengunggah file media. Di Konsol ApsaraVideo VOD, pilih Media Files > Audio/Video. Anda juga dapat memanggil API SearchMedia.

  • Kredensial pemutaran: Panggil operasi GetVideoPlayAuth untuk memperoleh kredensial pemutaran. Kami menyarankan Anda mengintegrasikan SDK sisi server ApsaraVideo VOD untuk menghindari pembuatan signature secara manual. Untuk contoh, lihat OpenAPI Explorer.

Kami merekomendasikan VidAuth daripada VidSts untuk pengguna ApsaraVideo VOD karena VidAuth menyediakan kegunaan dan keamanan yang lebih baik. Untuk informasi selengkapnya, lihat Metode kredensial vs. metode STS.

Jika Anda mengaktifkan transmisi langsung parameter enkripsi HLS di Konsol ApsaraVideo VOD, nama parameter default-nya adalah MtsHlsUriToken. Untuk informasi selengkapnya, lihat Transmisi langsung parameter untuk enkripsi HLS.

AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
authSource.vid = @"Vid";                 // Wajib. ID video (VideoId).
authSource.playAuth = @"<yourPlayAuth>"; // Wajib. Kredensial pemutaran dari GetVideoPlayAuth.
authSource.region = @"regionID";         // Tidak digunakan lagi mulai SDK V5.5.5.0 dan versi setelahnya. Pemutar akan secara otomatis mengurai wilayahnya. Untuk versi sebelumnya, parameter ini wajib. Default: cn-shanghai.
// authSource.authTimeout = 3600;        // Opsional. Atur periode validitas URL pemutaran dalam detik. Nilai ini akan menggantikan periode validitas yang dikonfigurasi di Konsol ApsaraVideo VOD. Default: 3600. Pastikan nilainya lebih besar dari durasi video agar URL tidak kedaluwarsa selama pemutaran.

// Jika Anda mengaktifkan transmisi langsung parameter enkripsi HLS di Konsol ApsaraVideo VOD dan parameter default-nya adalah MtsHlsUriToken, konfigurasikan sebagai berikut:
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
authSource.playConfig = [vp generatePlayerConfig];

[self.player setAuthSource:authSource];

VidSts

Pemutaran VidSts menggunakan kredensial STS temporary alih-alih kredensial pemutaran VOD. Sebelum memutar video VOD menggunakan VidSts, peroleh token STS dan pasangan AccessKey (ID AccessKey dan Rahasia AccessKey). Untuk informasi selengkapnya, lihat Peroleh token STS.

Jika Anda mengaktifkan transmisi langsung parameter enkripsi HLS di Konsol ApsaraVideo VOD, nama parameter default-nya adalah MtsHlsUriToken. Untuk informasi selengkapnya, lihat Transmisi langsung parameter untuk enkripsi HLS.

AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
source.vid = @"Vid";                                // Wajib. ID video (VideoId).
source.region = @"regionID";                        // Wajib. Wilayah ApsaraVideo VOD. Default: cn-shanghai.
source.securityToken = @"<yourSecurityToken>";      // Wajib. Token STS dari AssumeRole.
source.accessKeySecret = @"<yourAccessKeySecret>";  // Wajib. Rahasia AccessKey temporary dari STS (AssumeRole).
source.accessKeyId = @"<yourAccessKeyId>";          // Wajib. ID AccessKey temporary dari STS (AssumeRole).
// source.authTimeout = 3600;                       // Opsional. Atur periode validitas URL pemutaran dalam detik. Nilai ini akan menggantikan periode validitas yang dikonfigurasi di Konsol ApsaraVideo VOD. Default: 3600. Pastikan nilainya lebih besar dari durasi video agar URL tidak kedaluwarsa selama pemutaran.
// Jika Anda mengaktifkan transmisi langsung parameter enkripsi HLS di Konsol ApsaraVideo VOD dan parameter default-nya adalah MtsHlsUriToken, konfigurasikan sebagai berikut:
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
source.playConfig = [vp generatePlayerConfig];
// Atur sumber pemutaran.
[self.player setStsSource:source]

UrlSource

Untuk memutar video VOD menggunakan UrlSource, masukkan URL pemutaran secara langsung.

  • Anda dapat memanggil operasi GetPlayInfo untuk memperoleh URL pemutaran dari ApsaraVideo VOD. Kami menyarankan Anda mengintegrasikan SDK sisi server ApsaraVideo VOD. Untuk contoh, lihat OpenAPI Explorer.

  • Untuk file lokal, pastikan Anda memiliki izin untuk mengakses file tersebut. Gunakan path lengkap seperti /sdcard/video/sample.mp4 atau content://media/video/123.

AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // Wajib. URL VOD, URL pihak ketiga, atau path file lokal.
[self.player setUrlSource:urlSource]; 

Pemutaran terenkripsi

Video VOD mendukung enkripsi HLS, enkripsi video Alibaba Cloud, dan enkripsi DRM. Untuk pemutaran, lihat Putar video terenkripsi.

Pemutaran streaming langsung

Untuk pemutaran streaming langsung, lihat Pemutaran streaming langsung standar.

Kontrol pemutaran

SDK ApsaraVideo Player untuk iOS menyediakan metode untuk memulai, menjeda, menghentikan, dan mencari posisi pemutaran.

Persiapan pemutaran

Panggil metode prepare untuk mempersiapkan video sebelum diputar.

[self.player prepare];

Callback onPlayerEvent dengan AVPEventPrepareDone dipanggil saat persiapan selesai.

Mulai pemutaran

Panggil metode start untuk memulai pemutaran video:

[self.player start];

Jeda pemutaran

Panggil metode pause untuk menjeda video:

[self.player pause];

Lanjutkan pemutaran

Panggil metode start untuk melanjutkan pemutaran setelah dijeda:

[self.player start];

Cari ke posisi tertentu

Panggil seekToTime untuk melompat ke posisi tertentu. Metode ini berguna saat pengguna menyeret bilah progres atau melanjutkan pemutaran dari posisi yang disimpan.

// Cari ke posisi tertentu (dalam milidetik)
// Pencarian akurat
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// Pencarian tidak akurat
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];

Mode pencarian:

  • Pencarian akurat (AVP_SEEKMODE_ACCURATE): Mencari ke posisi tepat. Lebih lambat tetapi lebih presisi.

  • Pencarian tidak akurat (AVP_SEEKMODE_INACCURATE): Mencari ke keyframe terdekat. Lebih cepat tetapi kurang presisi.

Mulai pemutaran dari posisi tertentu

Untuk memulai pemutaran dari posisi tertentu (bukan mencari selama pemutaran), panggil setStartTime sebelum memanggil prepare:

// Atur waktu mulai untuk pemanggilan prepare berikutnya (dalam milidetik).
// Pengaturan ini hanya berlaku untuk pemanggilan prepare berikutnya. Waktu mulai akan otomatis dihapus setelah prepare dipanggil.
// seekMode: pencarian akurat (AVP_SEEKMODE_ACCURATE) atau pencarian tidak akurat (AVP_SEEKMODE_INACCURATE).
[self.player setStartTime:time seekMode:seekMode];

Hentikan pemutaran

Panggil metode stop untuk menghentikan pemutaran:

[self.player stop];

Lepaskan tampilan pemutar

Setelah menghentikan pemutaran dan sebelum menghapus instans pemutar, lepaskan tampilan pemutar untuk melepas sumber daya rendering dan mencegah kebocoran memori.

// Lepaskan tampilan pemutar
self.player.playerView = nil;
Catatan

Lepaskan tampilan pemutar setelah memanggil stop dan sebelum memanggil destroy atau destroyAsync. Urutan lengkap akhir pemutaran adalah: stop → lepaskan tampilan → destroy / destroyAsync.

Hancurkan pemutar

Anda dapat menghapus pemutar secara sinkron atau asinkron untuk melepas sumber daya.

// Hapus secara sinkron. Memblokir hingga sumber daya pemutar dilepas. Secara otomatis memanggil stop.
[self.player destroy];
// Hapus secara asinkron. Mengembalikan hasil segera. Secara otomatis memanggil stop.
[self.player destroyAsync];

Rekomendasi:

  • Gunakan destroyAsync jika Anda memerlukan respons UI yang cepat.

  • Jangan melakukan operasi apa pun pada objek pemutar selama proses penghapusan asinkron.

  • Anda tidak perlu memanggil stop sebelum destroyAsync karena proses penghapusan sudah mencakup operasi stop asinkron.


Dengarkan event pemutar

SDK ApsaraVideo Player menyediakan callback delegate untuk memantau perubahan status pemutar, progres pemutaran, error, dan event lainnya.

Atur delegate pemutar

Implementasikan protokol AVPDelegate di view controller Anda untuk menerima callback pemutar.

Penting: Implementasikan callback onError dan onPlayerEvent untuk menangani error dan memantau perubahan status pemutaran.

@interface SimplePlayerViewController ()<AVPDelegate>
@end
- (void)viewDidLoad {
    self.player = [[AliPlayer alloc] init];
    self.player.playerView = self.avpPlayerView.playerView;
    self.player.delegate = self;
    //...
}
/**
 @brief Callback delegate untuk error pemutar.
 @param player Instans pemutar.
 @param errorModel Berisi detail error.
 */
- (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
    // Tangani error (misalnya, tampilkan peringatan) dan hentikan pemutaran.
}
/**
 @brief Callback delegate untuk event pemutar.
 @param player Instans pemutar.
 @param eventType Jenis event. Lihat AVPEventType.
 */
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType{
    switch(eventType){
        case AVPEventPrepareDone:{
            // Dipicu saat media telah dipersiapkan dan siap diputar.
        }
            break;
        case AVPEventAutoPlayStart:
            // Dipicu saat putar otomatis dimulai.
            break;
        case AVPEventFirstRenderedStart:
            // Dipicu saat frame pertama dirender.
            break;
        case AVPEventCompletion:
            // Dipicu saat pemutaran selesai.
            break;
        case AVPEventLoadingStart:
            // Dipicu saat buffering dimulai.
            break;
        case AVPEventLoadingEnd:
            // Dipicu saat buffering selesai.
            break;
        case AVPEventSeekEnd:
            // Dipicu saat operasi pencarian selesai.
            break;
        case AVPEventLoopingStart:
            // Dipicu saat loop baru dimulai.
            break;
        default:
            break;
    }
}
/**
 @brief Callback untuk posisi pemutaran saat ini.
 @param player Instans pemutar.
 @param position Posisi pemutaran saat ini dalam milidetik.
 */
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    // Perbarui bilah progres.
}
/**
 @brief Callback untuk posisi buffering saat ini.
 @param player Instans pemutar.
 @param position Posisi buffering saat ini dalam milidetik.
 */
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    // Perbarui indikator progres buffer.
}
/**
 @brief Callback saat informasi track siap.
 @param player Instans pemutar.
 @param info Array objek AVPTrackInfo untuk stream yang tersedia.
 */
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    // Ambil informasi untuk bitrate/track yang tersedia.
}
/**
 @brief Callback saat subtitle harus ditampilkan.
 @param player Instans pemutar.
 @param index Indeks entri subtitle.
 @param subtitle Teks subtitle yang akan ditampilkan.
 */
- (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
    // Dapatkan dan tampilkan teks subtitle.
}
/**
 @brief Callback saat subtitle harus disembunyikan.
 @param player Instans pemutar.
 @param index Indeks entri subtitle yang ditampilkan.
 */
- (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
    // Sembunyikan subtitle.
}
/**
 @brief Callback untuk permintaan tangkapan layar.
 @param player Instans pemutar.
 @param image Tangkapan layar sebagai UIImage.
 */
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
    // Pratinjau atau simpan gambar yang ditangkap.
}
/**
 @brief Callback saat perubahan track selesai.
 @param player Instans pemutar.
 @param info Objek AVPTrackInfo untuk track aktif yang baru.
 */
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
    // Notifikasi bahwa bitrate/track telah berubah.
}

Dengarkan perubahan status pemutar

Callback onPlayerStatusChanged dipanggil saat status pemutar berubah:

- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
    switch (newStatus) {
    case AVPStatusIdle:{
           // Pemutar dalam keadaan idle
        }
 break;
        case AVPStatusInitialzed:{
           // Pemutar telah diinisialisasi
        }
 break;
        case AVPStatusPrepared:{
           // Pemutar telah dipersiapkan
        }
 break;
        case AVPStatusStarted:{
           // Pemutaran dimulai
        }
 break;
case AVPStatusPaused:{
           // Pemutaran dijeda
        }
 break;
case AVPStatusStopped:{
           // Pemutaran dihentikan
        }
 break;
case AVPStatusCompletion:{
           // Pemutaran selesai
        }
 break;
case AVPStatusError:{
           // Terjadi error pada pemutar
        }
 break;
        default:
            break;
    }
}

Konfigurasi tampilan video

Konfigurasikan cara video diskalakan, diputar, dan dicerminkan selama pemutaran.

Mode penskalaan

SDK mendukung tiga mode penskalaan:

// Skala agar sesuai dengan tampilan sambil mempertahankan rasio aspek (letterboxing).
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// Skala agar mengisi tampilan sambil mempertahankan rasio aspek (cropping).
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// Regangkan agar mengisi tampilan. Rasio aspek tidak dipertahankan. Distorsi gambar mungkin terjadi.
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
Catatan

Pengaturan mode penskalaan tidak berlaku untuk mode Gambar-dalam-Gambar (PiP).

Rotasi

Putar video searah jarum jam dengan sudut tertentu:

// Tanpa rotasi
self.player.rotateMode = AVP_ROTATE_0;
// Putar 90 derajat searah jarum jam
self.player.rotateMode = AVP_ROTATE_90;
// Putar 180 derajat searah jarum jam
self.player.rotateMode = AVP_ROTATE_180;
// Putar 270 derajat searah jarum jam
self.player.rotateMode = AVP_ROTATE_270;

Pencerminan

Panggil setMirrorMode untuk mencerminkan video. SDK mendukung pencerminan horizontal dan vertikal:

// Tanpa pencerminan
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// Pencerminan horizontal
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// Pencerminan vertikal
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;

Peroleh informasi pemutaran

Peroleh progres pemutaran, durasi, dan progres buffering selama pemutaran.

Progres pemutaran

Posisi pemutaran saat ini dikembalikan dalam callback onCurrentPositionUpdate:

- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// position dalam milidetik
NSString *position = [NSString stringWithFormat:@"%lld", position];
}

Durasi total

Ambil durasi total video setelah dimuat (misalnya, setelah event AVPEventPrepareDone):

-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
  switch (eventType) {
    case AVPEventPrepareDone: {
      if (self.player.duration >= 0) {
       NSString *duration  = self.player.duration;
      }
    }
      break;
    default:
      break;
  }
}

Durasi pemutaran aktual

Ambil durasi pemutaran aktual secara real time. Nilai ini mengecualikan waktu saat pemutaran dijeda atau buffering.

 NSString *duration = [player getPlayedDuration];

Progres buffering

Progres buffering saat ini dikembalikan dalam callback onBufferedPositionUpdate:

- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    NSString *bufferPosition = [NSString stringWithFormat:@"%lld", position];
}

Metrik rendering dan bitrate real time

Peroleh laju frame rendering, bitrate audio dan video, serta bitrate downstream jaringan secara real time.

// Laju frame rendering video. Mengembalikan nilai float.
[self.player getOption:AVP_OPTION_RENDER_FPS]
// Bitrate video. Mengembalikan nilai float dalam bit/s.
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
// Bitrate audio. Mengembalikan nilai float dalam bit/s.
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
// Bitrate downstream jaringan. Mengembalikan nilai float dalam bit/s.
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]

Kelola volume

Kontrol volume pemutaran dan bisukan audio.

Sesuaikan volume

Panggil volume untuk mengubah volume. Nilai yang valid: 0 hingga 2, dengan 1 sebagai volume asli. Nilai lebih dari 1 akan memperkuat audio dan mungkin menimbulkan kebisingan. Kami menyarankan agar volume dijaga pada atau di bawah 1.

// Atur volume. Nilai yang valid: 0 hingga 2.
self.player.volume = 1.0f;
// Dapatkan volume saat ini.
self.player.volume

Bisukan video

Bisukan atau nyalakan kembali audio:

self.player.muted = YES;

Atur kecepatan pemutaran

Sesuaikan kecepatan pemutaran dari 0,5× hingga 5× kecepatan normal tanpa mengubah pitch:

// Kami menyarankan menggunakan kelipatan 0,5 (misalnya, 0,5; 1,0; 1,5; 2,0)
self.player.rate = 1.0f;

Pengalihan resolusi

Catatan

Untuk contoh kode lengkap, lihat modul MultiResolution dalam proyek API-Example.

Pemutaran berbasis VidAuth atau VidSts

Jika Anda menggunakan VidAuth atau VidSts untuk pemutaran VOD, SDK secara otomatis mengambil definisi video dari ApsaraVideo VOD. Tidak diperlukan konfigurasi tambahan.

Kueri definisi yang tersedia

Setelah video dimuat, ambil definisi yang tersedia (trackBitrate) dalam callback onTrackReady:

- (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;
        }
    }
}

Alihkan definisi

Panggil metode selectTrack dengan indeks track yang diinginkan:

[self.player selectTrack:index];

Dengarkan event pengalihan definisi

Callback onTrackChanged dipanggil setelah definisi dialihkan:

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
 // Definisi dialihkan.
}

Aktifkan pengalihan cepat

Aktifkan mode pengalihan cepat untuk mendapatkan respons lebih cepat saat mengalihkan definisi secara manual:

AVPConfig *config = [self.player getConfig];
config.selectTrackBufferMode = 1;
[self.player setConfig:config];

Streaming langsung berbasis UrlSource

Untuk detailnya, lihat Pemutaran streaming langsung standar.

Aktifkan putar ulang berulang

Aktifkan putar ulang berulang untuk secara otomatis memulai ulang video dari awal saat pemutaran selesai:

self.player.loop = YES;

Event AVPEventLoopingStart dipicu di awal setiap loop:

- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventLoopingStart:
            break;
    }
}

Pengalihan track audio

Alihkan antar track audio dalam bahasa berbeda selama pemutaran.

Jenis stream yang didukung

Jenis stream berikut mendukung pengalihan track audio. Perilaku pengalihan bervariasi berdasarkan jenis stream.

Jenis stream

Ekstensi

Jumlah bitrate

Jenis substream

Perilaku pengalihan

Stream non-list (MP4)

.mp4

1

Satu track video, beberapa track audio dan subtitle

Anda dapat mengalihkan antar track audio.

HLS campuran single-bitrate

.m3u8

1

Satu track video, beberapa track audio dan subtitle

Anda dapat mengalihkan antar track audio.

HLS single-bitrate

.m3u8

1

Substream video, audio, dan caption terpisah

Anda dapat mengalihkan antar track audio.

HLS campuran multi-bitrate

.m3u8

n

Substream dengan bitrate berbeda, masing-masing memiliki satu track video dan beberapa track audio

Anda hanya dapat mengalihkan antar substream, bukan antar track audio dalam satu substream.

Dapatkan track audio yang tersedia

Callback onSubTrackReady dipanggil saat informasi track audio tersedia:

  // onSubTrackReady. Biasanya dipicu sebelum event AVPEventPrepareDone.
- (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    // Panggil getSubMediaInfo setelah callback ini dipicu. Memanggilnya sebelum callback ini akan mengembalikan hasil kosong.
    AVPMediaInfo* subMediaInfo = [player getSubMediaInfo];
    // Iterasi melalui track audio yang tersedia
    for (int i=0; i<subMediaInfo.tracks.count; i++) {
    	AVPTrackInfo* track = [subMediaInfo.tracks objectAtIndex:i];
        // Temukan track audio target dari daftar track.
    }
}

Alihkan track audio

Panggil metode selectTrack untuk beralih ke track audio yang berbeda:

[self.player selectTrack:myTrack.trackIndex accurate:YES]

Gunakan gambar mini

Catatan

Untuk contoh kode lengkap, lihat modul Thumbnail dalam proyek API-Example.

Gambar mini video (sprite sheet) memungkinkan pengguna melihat pratinjau konten video saat menggeser timeline.

Sebelum menggunakan gambar mini, konfigurasikan snapshot sprite untuk video Anda. Di Konsol ApsaraVideo VOD, buat templat snapshot dengan tipe snapshot Image Sprite, lalu buat alur kerja untuk memproses video. Untuk informasi selengkapnya, lihat Snapshot video.

/**
 Bendera yang menunjukkan apakah track saat ini memiliki gambar mini. Jika false, pratinjau gambar mini tidak akan ditampilkan selama pencarian.
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 UIImageView kustom yang digunakan untuk menampilkan gambar pratinjau gambar mini.
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
  onPrepare
 */
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
  if(newStatus == AVPStatusPrepared){
       [self.player setThumbnailUrl:[URL];// Saat pemutar dipersiapkan, atur URL gambar mini.
       self.trackHasThumbnai = YES;
  }
}
/**
 Callback yang dipicu saat nilai slider progres berubah.
 @param playerView Instans tampilan pemutar.
 @param value Nilai progres baru.
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief: Callback yang dipicu saat pengambilan gambar mini berhasil.
 @param positionMs: Posisi waktu yang diminta untuk gambar mini, dalam milidetik.
 @param fromPos: Waktu mulai segmen yang diwakili oleh gambar mini ini, dalam milidetik.
 @param toPos: Waktu akhir segmen yang diwakili oleh gambar mini ini, dalam milidetik.
 @param image: Gambar mini yang diambil (`UIImage` di iOS, `NSImage` di 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 yang dipicu saat pengambilan gambar mini gagal.
 @param positionMs: Posisi waktu yang gagal diambil gambarnya, dalam milidetik.
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

Dapatkan log SDK

Log SDK mencatat status permintaan, hasil pemanggilan, dan permintaan izin untuk debugging selama pengembangan. SDK menyediakan dua metode untuk mendapatkan log.

Metode 1: Lihat log di konsol alat pengembangan

Metode ini cocok untuk skenario di mana Anda dapat mereproduksi masalah secara lokal.

  1. Aktifkan logging dan atur tingkat log:

    // Aktifkan logging SDK
    [AliPlayer setEnableLog:YES];
    // Atur tingkat log (default: LOG_LEVEL_INFO). Gunakan LOG_LEVEL_TRACE untuk troubleshooting detail.
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil];
  2. Aktifkan logging tingkat frame (opsional):

    // Aktifkan logging tingkat frame untuk troubleshooting detail
    // 0 = dinonaktifkan, 1 = diaktifkan
    [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];
    Catatan

    Logging tingkat frame menghasilkan volume log yang besar dan terutama digunakan untuk troubleshooting masalah pemutaran.

  3. Kumpulkan log:

    Opsi A: Lihat log di konsol

    Setelah mereproduksi masalah, ambil log dari konsol alat pengembangan Anda, seperti XCode.

    Opsi B: Tulis log ke file

    Atur path lengkap untuk file log Anda dalam sandbox aplikasi.

    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    // Tentukan path file log kustom Anda. Misalnya, buat file bernama 'xxxx.log'.
    NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];

    Arahkan log ke file kustom dalam sandbox aplikasi:

    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);

    Setelah mereproduksi masalah, ambil file .log dari direktori kustom.

Metode 2: Atur LogCallback untuk menerima log secara terprogram

Gunakan metode ini saat Anda tidak dapat mereproduksi masalah secara andal di perangkat Anda. Callback ini mengekspor log ke saluran log aplikasi Anda.

  1. Aktifkan logging dan atur tingkat log.

    // Aktifkan logging SDK
    [AliPlayer setEnableLog:YES];
    // Atur tingkat log. Nilai default: LOG_LEVEL_INFO. Untuk troubleshooting, atur ke LOG_LEVEL_TRACE.
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) {
     NSLog(@"strLog:%@", strLog);
    }];
  2. Kumpulkan log:

    Setelah mereproduksi masalah, log akan secara otomatis diteruskan ke sistem logging aplikasi Anda.


Troubleshooting

Isu umum

Isu

Kemungkinan penyebab

Solusi

Video tidak diputar

Sumber pemutaran tidak valid

Verifikasi ID video atau URL-nya benar

Layar hitam

Tampilan pemutar belum diatur

Pastikan player.playerView diatur ke tampilan yang valid

Kredensial pemutaran kedaluwarsa

Token kedaluwarsa

Buat ulang kredensial pemutaran dan coba lagi

Audio tetapi tidak ada video

Kodek tidak didukung

Periksa format video dan kompatibilitas kodek

Pemutaran tersendat-sendat

Jaringan buruk

Aktifkan streaming bitrate adaptif atau kurangi kualitas

Referensi

  • Fitur lanjutan: Pelajari fitur lanjutan seperti Gambar-dalam-Gambar (PiP), pergeseran waktu, dan streaming bitrate adaptif.

  • API: Jelajahi referensi API lengkap untuk SDK ApsaraVideo Player untuk iOS.

  • Kode kesalahan seluler: Rujuk topik ini untuk troubleshooting.