All Products
Search
Document Center

ApsaraVideo VOD:Fitur lanjutan

Last Updated:Apr 11, 2026

Topik ini menjelaskan cara menggunakan fitur lanjutan ApsaraVideo Player SDK untuk iOS. Untuk panduan lengkap semua fitur, lihat referensi API.

Penting

Untuk mencoba demo, unduh dan ikuti petunjuk di Jalankan demo untuk mengompilasi dan menjalankannya.

Verifikasi fitur lanjutan

Catatan

Beberapa fitur pemutar memerlukan lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Fitur. Untuk mendapatkan lisensi, lihat Dapatkan lisensi.

Atur listener saat startup aplikasi atau sebelum melakukan panggilan API pemutar apa pun:

void premiumVeryfyCallback(AVPPremiumBizType biztype, bool isValid, NSString* errorMsg) {
    NSLog(@"onPremiumLicenseVerifyCallback: %d, isValid: %d, errorMsg: %@", biztype, isValid, errorMsg);
}

[AliPrivateService setOnPremiumLicenseVerifyCallback:premiumVeryfyCallback];

Di sini, AVPPremiumBizType adalah enumerasi fitur lanjutan. Saat Anda menggunakan fitur lanjutan, pemutar memverifikasi lisensi dan mengembalikan hasilnya melalui callback ini. Jika isValid bernilai false, errorMsg berisi alasan kegagalannya.

Pemutaran

Putar balik daftar

Player SDK for iOS menyediakan fitur putar balik daftar yang komprehensif untuk skenario video pendek dan menggunakan teknik seperti preloading guna mengurangi Time-to-First-Frame (TTTF) secara signifikan.

Prosedur

  1. Buat pemutar.

    Buat instans AliListPlayer.

    self.listPlayer = [[AliListPlayer alloc] init];
    [self.listPlayer setTraceID:@"xxxxxx"];  // TraceID secara unik mengidentifikasi perangkat atau pengguna. Biasanya berupa IMEI atau IDFA.
  2. Opsi:Atur listener.

    Listener bersifat opsional, tetapi kami merekomendasikan untuk mengaturnya agar menerima notifikasi event untuk kegagalan pemutaran, pembaruan progres, dan lainnya.

    Pemutar mendukung beberapa listener. Kami merekomendasikan Anda mengatur setidaknya listener onPlayerEvent dan onError.

    /**
     @brief Callback kesalahan.
     @param player Pointer pemutar.
     @param errorModel Deskripsi kesalahan. Untuk informasi lebih lanjut, lihat AVPErrorModel.
     */
    - (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
        // Menampilkan kesalahan dan menghentikan pemutaran.
    }
    /**
     @brief Callback event pemutar.
     @param player Pointer pemutar.
     @param eventType Jenis event pemutar. Untuk informasi lebih lanjut, lihat AVPEventType.
     */
    -(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
        switch (eventType) {
            case AVPEventPrepareDone: {
                // Pemutar telah siap.
            }
                break;
            case AVPEventAutoPlayStart:
                // Autoplay dimulai.
                break;
            case AVPEventFirstRenderedStart:
                // Frame pertama dirender.
                break;
            case AVPEventCompletion:
                // Pemutaran selesai.
                break;
            case AVPEventLoadingStart:
                // Buffering dimulai.
                break;
            case AVPEventLoadingEnd:
                // Buffering selesai.
                break;
            case AVPEventSeekEnd:
                // Pencarian selesai.
                break;
            case AVPEventLoopingStart:
                // Looping dimulai.
                break;
            default:
                break;
        }
    }
    /**
     @brief Callback untuk posisi pemutaran saat ini.
     @param player Pointer pemutar.
     @param position Posisi pemutaran saat ini.
     */
    - (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // Memperbarui bilah progres.
    }
    /**
     @brief Callback untuk posisi buffering.
     @param player Pointer pemutar.
     @param position Posisi buffering saat ini.
     */
    - (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // Memperbarui progres buffer.
    }
    /**
     @brief Callback untuk informasi track.
     @param player Pointer pemutar.
     @param info Array informasi stream track. Untuk informasi lebih lanjut, lihat AVPTrackInfo.
     */
    - (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
        // Mendapatkan informasi tentang stream multi-bitrate.
    }
    /**
     @brief Callback untuk menampilkan subtitle.
     @param player Pointer pemutar.
     @param trackIndex Indeks stream subtitle.
     @param subtitleID ID subtitle.
     @param subtitle String subtitle.
     */
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
        // Dipicu saat subtitle harus ditampilkan.
    }
    /**
     @brief Callback untuk menyembunyikan subtitle.
     @param player Pointer pemutar.
     @param trackIndex Indeks stream subtitle.
     @param subtitleID ID subtitle.
     */
    - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID {
        // Dipicu saat subtitle harus disembunyikan.
    }
    /**
     @brief Callback untuk mengambil snapshot.
     @param player Pointer pemutar.
     @param image Gambar.
     */
    - (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
        // Pratinjau dan simpan snapshot.
    }
    /**
     @brief Callback untuk pergantian track.
     @param player Pointer pemutar.
     @param info Informasi tentang track baru. Untuk informasi lebih lanjut, lihat AVPTrackInfo.
     */
    - (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
        // Dipicu saat track pemutaran berubah, misalnya setelah pergantian bitrate.
    }
    //...
  3. Atur jumlah preload.

    Atur jumlah preload yang wajar untuk secara efektif mengurangi TTTF. Contoh:

    self.listPlayer.preloadCount = 2;
  4. Tambahkan atau hapus sumber pemutaran.

    Putar balik daftar mendukung dua jenis sumber pemutaran: pemutaran VidSts dan pemutaran UrlSource. Pemutaran UrlSource menggunakan URL pemutaran, sedangkan pemutaran VidSts menggunakan VideoId dari aset media di ApsaraVideo VOD.

    • URL: Alamat pemutaran dapat berasal dari layanan pihak ketiga atau ApsaraVideo VOD.

      Kami merekomendasikan mengintegrasikan SDK sisi server ApsaraVideo VOD untuk mendapatkan alamat pemutaran karena menyederhanakan proses dengan secara otomatis menangani penandatanganan URL. Untuk contoh cara memanggil operasi API, lihat Portal Developer.

    • Vid: VideoId. Anda dapat memperoleh VideoId setelah mengunggah file media. Temukan di konsol ApsaraVideo VOD di Perpustakaan Aset Media > Audio/Video, atau dengan memanggil API sisi server seperti Cari informasi media.

    // Tambahkan sumber pemutaran VidSts.
    [self.listPlayer addVidSource:videoId uid:UUIDString];
    // Tambahkan sumber pemutaran UrlSource.
    [self.listPlayer addUrlSource:URL uid:UUIDString];
    // Hapus sumber.
    [self.listPlayer removeSource:UUIDString];
    Catatan
    • uid adalah pengenal unik untuk setiap video. Pemutar menganggap video dengan uid yang sama sebagai identik. Jika Anda mengalami kekacauan stream, pastikan Anda tidak memberikan uid yang sama untuk video yang berbeda. uid tidak memiliki persyaratan format dan dapat berupa string apa pun.

  5. Atur tampilan.

    Jika sumber pemutaran berisi video, Anda harus mengatur tampilan di pemutar untuk menampilkan frame video.

    self.listPlayer.playerView = self.simplePlayScrollView.playView;
  6. Putar sumber pemutaran.

    Setelah menambahkan sumber pemutaran, panggil moveTo untuk mulai memutar sumber tertentu.

    // Gunakan API ini untuk pemutaran UrlSource.
    - (BOOL) moveTo:(NSString*)uid;
    // Untuk pemutaran VidSts. Anda harus meneruskan komponen kredensial STS sementara: ID AccessKey, Rahasia AccessKey, dan token STS. Untuk informasi lebih lanjut tentang cara mendapatkannya, lihat 'Buat role RAM dan berikan izin akses sementara menggunakan STS'.
    - (BOOL) moveTo:(NSString*)uid accId:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
  7. Putar video sebelumnya atau berikutnya.

    Setelah Anda memanggil moveTo untuk memutar sumber video, operasi moveToPrev dan moveToNext menggunakan sumber video dari panggilan moveTo sebagai jangkar untuk memutar video sebelumnya dan berikutnya. Berikut contohnya:

    Catatan

    Mengganti sumber video dalam view yang sama dengan metode seperti moveTo atau moveToNext dapat menyebabkan layar berkedip atau menjadi hitam sejenak. Untuk mencegah hal ini, atur field clearShowWhenStop dari PlayerConfig ke false saat Anda menginisialisasi listPlayer, lalu panggil setConfig untuk menerapkan perubahan tersebut.

    UrlSource

    // Pindah ke video berikutnya.
    - (BOOL) moveToNext;
    // Pindah ke video sebelumnya.
    - (BOOL) moveToPrev;

    VidSts

    // Pindah ke video berikutnya.
    - (BOOL) moveToNext:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
    // Pindah ke video sebelumnya.
    - (BOOL) moveToPre:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
Catatan

Untuk pengalaman putar balik daftar yang lebih baik, pertimbangkan menggunakan solusi drama format pendek kami. Untuk detailnya, lihat Pengembangan Sisi Klien untuk Drama Format Pendek.

Putar video dengan saluran alpha

Ikhtisar

ApsaraVideo Player SDK mendukung rendering saluran alpha untuk menciptakan efek dinamis, seperti hadiah animasi. Di ruang streaming langsung, Anda dapat memutar efek animasi ini di atas konten utama untuk secara signifikan meningkatkan pengalaman pengguna.

Batasan

Rendering saluran alpha didukung di SDK all-in-one versi 6.8.0 atau lebih baru, atau ApsaraVideo Player SDK versi 6.9.0 atau lebih baru.

Manfaat

Menggunakan video MP4 dengan saluran alpha untuk efek animasi menawarkan kualitas animasi yang lebih baik, ukuran file yang lebih kecil, kompatibilitas yang lebih tinggi, dan efisiensi pengembangan yang lebih besar.

  1. Kualitas animasi yang lebih baik: Video MP4 mempertahankan detail dan warna animasi asli lebih akurat dibandingkan format lain seperti APNG atau IXD.

  2. Ukuran file yang lebih kecil: File MP4 dapat dikompresi lebih efektif daripada format lain seperti APNG atau IXD, yang meningkatkan kecepatan pemuatan dan mengurangi konsumsi lebar pita jaringan.

  3. Kompatibilitas yang lebih tinggi: Sebagai format video universal, MP4 didukung secara luas di sebagian besar perangkat dan browser.

  4. Efisiensi pengembangan yang lebih tinggi: Implementasinya sederhana dan tidak memerlukan developer untuk membangun logika parsing atau rendering yang kompleks. Hal ini memungkinkan mereka fokus pada fitur lainnya.

Kode contoh

API baru memungkinkan Anda mengatur mode alpha, yang menentukan posisi saluran alpha dalam aset video: atas, bawah, kiri, atau kanan. Nilai default adalah none.

Catatan
  • Posisi saluran alpha dalam aset harus sesuai dengan pengaturan alphaRenderMode.

  • Rasio aspek tampilan pemutar harus sesuai dengan rasio aspek output akhir, bukan seluruh aset sumber.

/**
 @brief Mode rendering alpha. Mendukung alpha di kanan, kiri, atas, atau bawah. Nilai default adalah none.
 @see AVPAlphaRenderMode
 */
@property(nonatomic) AVPAlphaRenderMode alphaRenderMode;
//--------------Penggunaan View-------------
// Untuk tampilan pemutar, atur warna latar belakang yang transparan.
@property (weak, nonatomic) IBOutlet UIView *mediaPlayerView;
[self.aliplayerview setBackgroundColor:UIColor.clearColor];

//-----------Penggunaan AliPlayer-----------
// Atur mode alpha.
[self.player setAlphaRenderMode:AVP_RENDERMODE_ALPHA_AT_LEFT];
// Atur aset yang sesuai dengan mode alpha.
AVPUrlSource *source = [[AVPUrlSource alloc] urlWithString:@"https://alivc-player.oss-cn-shanghai.aliyuncs.com/video/business_needs_sample/alpha_channel/alpha_left.mp4"];
[self.player setUrlSource:source];

// Opsional: Jika Anda mengalami artefak visual setelah pemutaran selesai, Anda dapat membersihkan layar.
#pragma mark -- AVPDelegate
- (void)onPlayerEvent:(AliPlayer *)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventCompletion:
        {
            [player clearScreen];
        }
            break;
        //...
    }
}

[self.player setAutoPlay: YES];
[self.player prepare];

Rendering Metal

Alibaba Cloud Player SDK untuk iOS mendukung rendering video menggunakan framework Metal.

Catatan

Saat ini, rendering Metal hanya mendukung warna latar belakang, mode penskalaan, dan Gambar-dalam-Gambar (PiP).

Parameter

/**
 @brief Menentukan jenis render video. Nilai valid: 0 (renderer default) dan 1 (renderer campuran). Default: 0.
 */
@property(nonatomic, assign) int videoRenderType;

Contoh

AVPConfig *config = [self.player getConfig];
// Aktifkan rendering Metal.
config.videoRenderType = 1;
[self.player setConfig:config];
[self.player prepare];

Subtitle eksternal

Catatan

Untuk contoh kode terperinci, lihat modul ExternalSubtitle di API-Example. Proyek sampel Objective-C ini menunjukkan cara mengintegrasikan fitur inti ApsaraVideo Player SDK untuk iOS.

ApsaraVideo Player SDK untuk iOS mendukung penambahan dan pergantian subtitle eksternal dalam format SRT, SSA, ASS, dan VTT.

Contoh berikut menunjukkan cara mengimplementasikan fitur ini.

  1. Buat tampilan untuk menampilkan subtitle.

    Buat tampilan berdasarkan format subtitle.

    // Inisialisasi subTitleLabel kustom.
    UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame];
    // Tambahkan label subtitle ke superView kustom.
    [superView addSubview:subTitleLabel];
  2. Atur listener terkait subtitle.

    // Dipanggil saat track subtitle eksternal ditambahkan.
    - (void)onSubtitleExtAdded:(AliPlayer*)player trackIndex:(int)trackIndex URL:(NSString *)URL {}
    // Callback untuk header subtitle.
    - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header{}
    // Dipanggil saat subtitle ditampilkan.
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
     subTitleLabel.text =subtitle;
     subTitleLabel.tag =subtitleID;
    }
    // Dipanggil saat subtitle disembunyikan.
    - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID{
      [subTitleLabel removeFromSuperview];
    }
  3. Tambahkan track subtitle.

    [self.player addExtSubtitle:URL];
  4. Ganti track subtitle.

    [self.player selectExtSubtitle:trackIndex enable:YES];

Subtitle eksternal (rendering kustom)

Menggunakan AliVttSubtitleView dan AliVttRenderImpl, fitur ini sepenuhnya mendukung subtitle eksternal WebVTT dan memungkinkan Anda menyesuaikan gaya seperti font, warna, dan ukuran.

Catatan

Kasus penggunaan:

  • Anda ingin menyesuaikan gaya subtitle WebVTT, seperti font, warna, dan ukuran.

  • Integrasi Anda menggunakan Alibaba Cloud Player SDK v7.11.0 atau lebih baru dan AliVttSubtitleView.

  • Mendukung subtitle multibahasa (seperti Arab, Tionghoa, Jepang, dan Korea) dan secara otomatis mencocokkan font yang sesuai.

Penting

Prasyarat:

  • Anda telah menambahkan file font yang diperlukan (.ttf) ke proyek Xcode Anda.

  • Anda telah mengonfigurasi listener subtitle untuk menerima konten WebVTT.

  • Font yang diperlukan dimuat dengan memanggil metode loadFontFromBundle.

Menyesuaikan gaya subtitle

  1. Buat kelas implementasi rendering kustom yang mewarisi dari AliVttRenderImpl.

    // CustomFontVttRenderImpl.h
    @interface CustomFontVttRenderImpl : AliVttRenderImpl
    @end
    
    // CustomFontVttRenderImpl.m
    @implementation CustomFontVttRenderImpl
    
    // Opsional: Ganti logika pembuatan font.
    - (UIFont *)customizeFont:(UIFont *)originalFont
             contentAttribute:(VttContentAttribute *)contentAttribute
                  contentText:(NSString *)text {
        
        // Contoh: Secara otomatis memilih font berdasarkan konten.
        if ([self containsArabicCharacters:text]) {
            return [UIFont fontWithName:@"NotoSansArabic-Regular" size:originalFont.pointSize];
        }
        if ([self containsCJKCharacters:text]) {
            return [UIFont fontWithName:@"NotoSansCJKsc-Regular" size:originalFont.pointSize];
        }
        
        return originalFont;
    }
    
    // Opsional: Paksa warna tertentu.
    - (void)applyColorStyle:(NSMutableDictionary *)attrs
           contentAttribute:(VttContentAttribute *)contentAttribute {
        // Paksa warna menjadi merah.
        attrs[NSForegroundColorAttributeName] = [UIColor redColor];
    }
    
    // Opsional: Perbesar font.
    - (void)applyFontStyle:(NSMutableDictionary *)attrs
          contentAttribute:(VttContentAttribute *)contentAttribute
                   context:(RenderContext *)context {
        
        CGFloat originalSize = contentAttribute.fontSizePx / context.contentsScale;
        CGFloat newSize = originalSize * 2.0; // Perbesar 2x.
        
        UIFont *font = [self generateFontWithName:contentAttribute.fontName
                                        fontSize:newSize
                                          isBold:contentAttribute.mBold
                                        isItalic:contentAttribute.mItalic];
        
        attrs[NSFontAttributeName] = font;
    }
    
    // Helper: Deteksi karakter Arab.
    - (BOOL)containsArabicCharacters:(NSString *)text {
        for (NSUInteger i = 0; i < text.length; i++) {
            unichar c = [text characterAtIndex:i];
            if ((c >= 0x0600 && c <= 0x06FF) || (c >= 0x0750 && c <= 0x077F)) {
                return YES;
            }
        }
        return NO;
    }
    
    // Helper: Deteksi karakter CJK.
    - (BOOL)containsCJKCharacters:(NSString *)text {
        for (NSUInteger i = 0; i < text.length; i++) {
            unichar c = [text characterAtIndex:i];
            if ((c >= 0x4E00 && c <= 0x9FFF) ||   // Tionghoa
                (c >= 0x3040 && c <= 0x309F) ||   // Hiragana Jepang
                (c >= 0xAC00 && c <= 0xD7AF)) {   // Korea
                return YES;
            }
        }
        return NO;
    }
    
    @end
  2. (Opsional) Muat font kustom secara dinamis.

    - (void)loadCustomFontFromBundle:(NSString *)fontName {
        NSString *path = [[NSBundle mainBundle] pathForResource:fontName ofType:@"ttf"];
        if (path) {
            NSData *fontData = [NSData dataWithContentsOfFile:path];
            CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)fontData);
            CGFontRef fontRef = CGFontCreateWithDataProvider(provider);
            
            if (CTFontManagerRegisterGraphicsFont(fontRef, NULL)) {
                NSLog(@"Font berhasil didaftarkan: %@", fontName);
            } else {
                NSLog(@"Pendaftaran font gagal: %@", fontName);
            }
            
            CGFontRelease(fontRef);
            CGDataProviderRelease(provider);
        }
    }
  3. Inisialisasi tampilan subtitle dan ikat renderer kustom.

    // Buat tampilan subtitle.
    AliVttSubtitleView *subtitleView = [[AliVttSubtitleView alloc] init];
    
    // Atur factory renderer kustom.
    [subtitleView setRenderImplFactory:^AliVttRenderImpl*() {
        CustomFontVttRenderImpl *impl = [[CustomFontVttRenderImpl alloc] init];
        
        // Opsional: Pra-muat font.
        [impl loadCustomFontFromBundle:@"LongCang-Regular"];
        
        return impl;
    }];
    
    // Lampirkan ke pemutar.
    [player setExternalSubtitleView:subtitleView];
  4. Tangani callback subtitle pemutar.

    Implementasikan metode berikut pada AVPDelegate Anda:

    // Header subtitle (berisi definisi gaya dan wilayah).
    - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header {
        [self.subtitleView setVttHeader:player trackIndex:trackIndex Header:header];
    }
    
    // Tampilkan subtitle.
    - (void)onSubtitleShow:(AliPlayer *)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
        [self.subtitleView show:player trackIndex:trackIndex subtitleID:subtitleID subtitle:subtitle];
    }
    
    // Sembunyikan subtitle.
    - (void)onSubtitleHide:(AliPlayer *)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID {
        [self.subtitleView hide:player trackIndex:trackIndex subtitleID:subtitleID];
    }
    
    // Track subtitle berhasil ditambahkan. Gunakan callback ini untuk mengaktifkan track.
    - (void)onSubtitleExtAdded:(AliPlayer *)player trackIndex:(int)trackIndex URL:(NSString *)URL {
        [player selectExtSubtitle:trackIndex enable:YES];
    }

Pemutaran hanya audio

Untuk mengaktifkan pemutaran hanya audio, nonaktifkan track video. Konfigurasikan PlayerConfig sebelum memanggil prepare.

AVPConfig *config = [self.player getConfig];
config.disableVideo = YES;
[self.player setConfig:config];

Pergantian decoder

Player SDK untuk iOS mendukung decoding hardware untuk H.264 dan H.265. Fitur ini diaktifkan secara default dan dikontrol oleh properti enableHardwareDecoder. Jika inisialisasi decoding hardware gagal, pemutar secara otomatis beralih ke decoding software untuk memastikan pemutaran berlanjut.

// Aktifkan decoding hardware (diaktifkan secara default).
self.player.enableHardwareDecoder = YES;

Saat pemutar secara otomatis beralih dari decoding hardware ke software, callback onPlayerEvent dipicu, seperti pada contoh berikut:

-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
    if (eventWithString == EVENT_SWITCH_TO_SOFTWARE_DECODER) {
        // Beralih ke decoding software.
    }
}

Pemutaran adaptif H.265

Jika model perangkat berada dalam blacklist H.265 berbasis cloud atau jika decoding hardware H.265 gagal, fallback adaptif dipicu. Jika stream cadangan H.264 dikonfigurasi, pemutar secara otomatis memutarnya. Jika tidak, pemutar kembali ke decoding software H.265.

Catatan
  • Fitur ini hanya tersedia setelah mengaktifkan layanan decoding adaptif cloud-native. Anda perlu mengirimkan formulir Yida untuk mengajukan lisensi.

  • Layanan decoding adaptif cloud-native menyediakan dua kemampuan utama: 1. Pengiriman dinamis data kompatibilitas decoding hardware dari cloud. 2. Fallback adaptif dari stream H.265 ke H.264.

  • SDK masih dapat secara otomatis beralih ke decoding software jika decoding hardware gagal, bahkan tanpa layanan bernilai tambah ini.

Contoh berikut menunjukkan cara mengatur stream cadangan:

// Lapisan aplikasi harus mempertahankan dictionary untuk memetakan URL asli ke URL cadangannya.
NSString* getBackupUrlCallback(AVPBizScene scene, AVPCodecType codecType, NSString* oriurl){
    NSMutableDictionary *globalMap = [AliPlayerViewController getGlobalBackupUrlMap];
    NSString *backupUrl = globalMap[oriurl];
    return backupUrl; 
}

[AliPlayerGlobalSettings setAdaptiveDecoderGetBackupURLCallback:getBackupUrlCallback];

Streaming bitrate adaptif

Catatan

ApsaraVideo Player SDK untuk iOS mendukung stream multi-bitrate adaptif. Setelah metode prepare berhasil, Anda dapat memanggil metode getMediaInfo untuk mendapatkan TrackInfo untuk setiap stream.

AVPMediaInfo *info = [self.player getMediaInfo];
NSArray<AVPTrackInfo*>* tracks = info.tracks;

Selama pemutaran, Anda dapat mengganti stream dengan memanggil metode selectTrack pemutar. Untuk mengaktifkan streaming bitrate adaptif, teruskan SELECT_AVPTRACK_TYPE_VIDEO_AUTO.

// Ganti ke stream tertentu.
[self.player selectTrack:track.trackIndex];
// Aktifkan streaming bitrate adaptif.
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];

Callback onTrackChanged mengonfirmasi pergantian stream.

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
    if (info.trackType == AVPTRACK_TYPE_VIDEO) {
        // Track video telah berubah.
    }
    // dll
}

Opsi: Sebelum memanggil metode selectTrack untuk mengaktifkan streaming bitrate adaptif, Anda dapat membatasi definisi video untuk mencegah pemutar beralih ke bitrate yang terlalu tinggi. Terapkan konfigurasi ini sebelum memanggil metode prepare atau metode moveTo untuk putar balik daftar.

AVPConfig *config = [self.player getConfig];
config.maxAllowedAbrVideoPixelNumber = 921600; // Atur jumlah piksel maksimum untuk ABR menjadi 921600 (1280 * 720). Ini memastikan bahwa pemutar hanya beralih ke definisi dengan jumlah piksel kurang dari atau sama dengan nilai ini.
[self.player setConfig:config];

Snapshot

Player SDK untuk iOS menyediakan fitur untuk mengambil snapshot video saat ini. Fitur ini diimplementasikan oleh API snapShot. Fitur ini menangkap data mentah dan mengembalikannya sebagai bitmap. Callback-nya adalah onCaptureScreen. Berikut contohnya:

// Callback snapshot
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
    // Proses snapshot.
}
// Ambil snapshot frame saat ini.
[self.player snapShot];
Catatan

Snapshot tidak menyertakan UI.

Pratinjau

ApsaraVideo Player SDK untuk iOS mendukung fitur pratinjau saat dikonfigurasi dengan ApsaraVideo VOD. SDK mendukung pemutaran VidSts dan VidAuth. VidAuth adalah metode yang direkomendasikan. Untuk informasi lebih lanjut, lihat Pratinjau video.

Setelah Anda mengonfigurasi fitur pratinjau, gunakan metode setPreviewTime dari antarmuka VidPlayerConfigGen untuk mengatur durasi pratinjau pemutar. Berikut contoh pemutaran VidSts:

AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
....
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setPreviewTime:20]; // Pratinjau 20 detik
source.playConfig = [vp generatePlayerConfig]; // Terapkan konfigurasi ke sumber pemutaran.
...

Saat Anda mengatur durasi pratinjau dan menggunakan iOS player SDK untuk memutar video, server hanya mengembalikan konten video untuk periode pratinjau, bukan konten video lengkap.

Catatan

Anda dapat menggunakan kelas VidPlayerConfigGenerator untuk mengatur parameter permintaan sisi server. Untuk informasi lebih lanjut, lihat Deskripsi parameter permintaan.

Atur Referer

Player SDK untuk iOS memungkinkan Anda mengatur Referer untuk mengimplementasikan kontrol akses. Fitur ini bekerja dengan Daftar hitam Referer dan daftar putih yang Anda konfigurasi di konsol ApsaraVideo VOD. Anda dapat mengatur Referer dalam objek AVPConfig, seperti pada contoh berikut:

// Dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur Referer.
config.referer = referer;
....// Pengaturan lainnya.
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];

User-Agent

iOS player SDK menyediakan AVPConfig untuk mengatur User-Agent kustom, yang kemudian disertakan pemutar dalam semua permintaan jaringan berikutnya. Contoh berikut menunjukkan caranya:

// Dapatkan konfigurasi saat ini.
AVPConfig *config = [self.player getConfig];
// Atur User-Agent.
config.userAgent = userAgent;
//... pengaturan lainnya
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];

Konfigurasikan jumlah retry jaringan dan timeout

Untuk mengonfigurasi timeout jaringan dan jumlah retry untuk iOS player SDK, gunakan objek AVPConfig. Contohnya:

// Dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur timeout jaringan dalam milidetik.
config.networkTimeout = 5000;
// Atur jumlah maksimum retry. Interval retry ditentukan oleh networkTimeout. Nilai 0 menonaktifkan retry, memungkinkan aplikasi mengimplementasikan kebijakan retry sendiri. Default adalah 2.
config.networkRetryCount = 2;
//... Pengaturan lainnya
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];
Catatan
  • Jika networkRetryCount lebih besar dari 0, pemutar mencoba ulang hingga networkRetryCount kali saat terjadi masalah jaringan selama pemuatan. Interval retry ditentukan oleh networkTimeout.

  • Jika pemutar gagal memuat setelah semua upaya retry, callback onError dipicu, dan AVPErrorModel.code adalah ERROR_LOADING_TIMEOUT.

  • Jika networkRetryCount adalah 0, timeout jaringan memicu callback onPlayerEvent dengan parameter eventWithString diatur ke EVENT_PLAYER_NETWORK_RETRY. Anda kemudian dapat memanggil metode reload pemutar untuk mencoba ulang permintaan jaringan atau melakukan tindakan lain.

Kontrol cache dan latensi

Kontrol cache sangat penting untuk kinerja pemutar. Konfigurasi yang tepat dapat meningkatkan kecepatan startup dan mengurangi tersendat. Player SDK untuk iOS menyediakan antarmuka untuk mengonfigurasi pengaturan cache dan latensi dalam objek AVPConfig:

// Ambil konfigurasi.
AVPConfig *config = [self.player getConfig];
// Latensi maksimum dalam milidetik. Catatan: Parameter ini hanya untuk streaming langsung. Jika latensi menjadi tinggi, Player SDK menyinkronkan frame untuk menjaganya dalam batas ini.
config.maxDelayTime = 5000;
// Durasi maksimum (dalam milidetik) data yang dapat dibuffer oleh pemutar.
config.maxBufferDuration = 50000;
// Durasi buffer tinggi dalam milidetik. Saat kondisi jaringan buruk, pemutar berhenti memuat data begitu buffer mencapai durasi ini.
config.highBufferDuration = 3000;
// Durasi buffer startup dalam milidetik. Nilai yang lebih kecil menghasilkan kecepatan startup yang lebih cepat tetapi dapat menyebabkan tersendat segera setelah pemutaran dimulai.
config.startBufferDuration = 500;
// Pengaturan lainnya.
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];
Penting
  • Durasi buffer harus memenuhi hubungan ini: startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration.

  • Jika durasi buffer maksimum (maxBufferDuration) melebihi 5 menit, sistem memberlakukan batas 5 menit untuk mencegah pengecualian memori akibat buffer yang terlalu besar.

Atur Header HTTP

Gunakan objek AVPConfig untuk menambahkan header HTTP ke permintaan pemutar:

// Dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Definisikan header.
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
// Misalnya, atur header Host saat Anda menggunakan HTTPDNS.
[httpHeaders addObject:@"Host:example.com"];
// Atur header.
config.httpHeaders = httpHeaders;
....// Pengaturan lainnya.
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];

Gambar-dalam-Gambar

Catatan

Lihat modul PictureInPicture di proyek API-Example untuk contoh kode terperinci. Proyek sampel Objective-C ini menunjukkan cara mengintegrasikan fitur inti Alibaba Cloud Player SDK untuk iOS.

Catatan
  • Gambar dalam gambar (PiP) memerlukan iOS 15 atau lebih baru dan ApsaraVideo Player SDK untuk iOS 5.4.9.0 atau lebih baru.

  • Versi ApsaraVideo Player SDK untuk iOS sebelum 5.5.2.0 hanya menyediakan metode untuk mengaktifkan atau menonaktifkan PiP dan menampilkan jendela PiP saat aplikasi masuk ke latar belakang. Mulai versi 5.5.2.0, Anda juga dapat mengatur delegasi PiP eksternal untuk menyesuaikan perilaku PiP.

  • Untuk menggunakan PiP, pastikan fitur tersebut diaktifkan di pengaturan perangkat Anda (Pengaturan > Umum > Gambar dalam Gambar).

Aktifkan PiP

Setelah Anda mengaktifkan picture-in-picture, video terus diputar di jendela kecil saat aplikasi masuk ke latar belakang. Saat aplikasi kembali ke latar depan, video kembali ke tampilan aslinya. Untuk mengaktifkan picture-in-picture, panggil setPictureInPictureEnable setelah pemutar memasuki status AVPEventPrepareDone. Contoh berikut menunjukkan caranya:

- (void)onPlayerEvent:(AliPlayer *)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventPrepareDone:
        {
            [self.player setPictureInPictureEnable:YES];
        }
            break;
        default:
            break;
    }
}
Catatan

Memanggil metode stop pemutar tidak secara otomatis menutup jendela picture-in-picture. Oleh karena itu, Anda harus menonaktifkan picture-in-picture dengan memanggil setPictureInPictureEnable sebelum memanggil stop.

Tetapkan delegate PiP

Contoh kode berikut menunjukkan interaksi umum antara jendela Picture-in-Picture (PiP) dan pemutar. Interaksi ini mencakup menampilkan kontrol pemutaran seperti jeda, putar, maju cepat, dan mundur cepat, serta mengimplementasikan logika putar ulang. Untuk referensi lengkap metode delegasi, lihat file header AliPlayerPictureInPictureDelegate.h, yang terletak di AliyunPlayer.framework dalam folder SDK dari demo player SDK.

  1. Atur delegasi Picture-in-Picture.

    /**
    * @brief Mengatur delegasi untuk event Picture-in-Picture.
    */
    -(void) setPictureinPictureDelegate:(id<AliPlayerPictureInPictureDelegate>)delegate;
    
    
    // Atur delegasi Picture-in-Picture.
    [self.player setPictureinPictureDelegate:self];
  2. Tambahkan properti dan implementasikan metode delegasi.

    1. Tambahkan properti ke view controller Anda untuk mengelola status pemutar dan jendela Picture-in-Picture.

      #import "YourUIViewController.h"
      #import <AliyunPlayer/AliyunPlayer.h>
      
      @interface YourUIViewController () <AVPDelegate, AliPlayerPictureInPictureDelegate>
      // Instans pemutar.
      @property (nonatomic, strong) AliPlayer *player;
      // Tampilan kontainer untuk pemutar.
      @property (nonatomic, strong) UIView *playerView;
      // Melacak apakah jendela Picture-in-Picture dijeda.
      @property (nonatomic, assign) BOOL isPipPaused;
      // Melacak status pemutaran saat ini pemutar, diperbarui oleh callback onPlayerStatusChanged:oldStatus:newStatus:.
      @property (nonatomic, assign) AVPStatus currentPlayerStatus;
      // Referensi lemah ke pengontrol picture-in-picture. Ini diatur dalam callback pictureInPictureControllerWillStartPictureInPicture: dan harus diatur ke nil sebelum view controller dealokasi. Menggunakan referensi lemah direkomendasikan.
      @property (nonatomic, weak) AVPictureInPictureController *pipController;
      // Melacak progres pemutaran, diperbarui oleh parameter 'position' dalam callback progres pemutaran.
      @property (nonatomic, assign) int64_t currentPosition;
      
      @end
      Catatan

      Properti pipController harus dideklarasikan dengan atribut weak atau assign untuk mencegah siklus retensi. Jika Anda menggunakan assign, atur properti tersebut ke nil secara manual pada waktu yang tepat.

    2. Dalam metode delegasi onPlayerStatusChanged: Anda, beri tahu pengontrol picture-in-picture untuk memperbarui statusnya.

      - (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
          self.currentPlayerStatus = newStatus;
      
        if (_pipController) {
           [self.pipController invalidatePlaybackState];
         }
      }
    3. Dalam metode delegasi onPlayerEvent: Anda, perbarui status Picture-in-Picture sebagai respons terhadap event pemutaran.

      - (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
          if (eventType == AVPEventCompletion) {
            if (_pipController) {
             self.isPipPaused = YES; // Saat pemutaran selesai, atur status PiP ke dijeda.
             [self.pipController invalidatePlaybackState];
          }
        } else if (eventType == AVPEventSeekEnd) {
          // Operasi pencarian selesai.
            if (_pipController) {
             [self.pipController invalidatePlaybackState];
          }
        }
      }
    4. Implementasikan metode delegasi.

      • Implementasikan callback untuk saat Picture-in-Picture akan dimulai.

        /**
         @brief Memberi tahu delegasi bahwa Picture-in-Picture akan dimulai.
         @param pictureInPictureController Pengontrol picture-in-picture.
         */
        - (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
            if (!_pipController) {
             self.pipController = pictureInPictureController;
          }
            self.isPipPaused = !(self.currentPlayerStatus == AVPStatusStarted);
          [pictureInPictureController invalidatePlaybackState];
        }
      • Implementasikan callback untuk saat Picture-in-Picture akan dihentikan.

        /**
         @brief Memberi tahu delegasi bahwa Picture-in-Picture akan dihentikan.
         @param pictureInPictureController Pengontrol picture-in-picture.
         */
        - (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
            self.isPipPaused = NO;
          [pictureInPictureController invalidatePlaybackState];
        }
      • Implementasikan callback untuk memulihkan UI sebelum Picture-in-Picture dihentikan.

        /**
         @brief Memberi tahu delegasi untuk memulihkan antarmuka pengguna sebelum Picture-in-Picture dihentikan.
         @param pictureInPictureController Pengontrol picture-in-picture.
         @param completionHandler Handler penyelesaian yang dipanggil dengan YES untuk mengizinkan sistem menyelesaikan pemulihan.
         */
        - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler {
            if (_pipController) {
              _pipController = nil;
          }
          completionHandler(YES);
        }
      • Implementasikan callback yang menyediakan rentang waktu yang dapat diputar.

        /**
         @brief Meminta delegasi untuk rentang waktu yang dapat diputar saat ini.
         @param pictureInPictureController Pengontrol picture-in-picture.
         @return Rentang waktu yang dapat diputar saat ini.
         */
         - (CMTimeRange)pictureInPictureControllerTimeRangeForPlayback:(nonnull AVPictureInPictureController *)pictureInPictureController layerTime:(CMTime)layerTime{
            Float64 current64 = CMTimeGetSeconds(layerTime);
        
            Float64 start;
            Float64 end;
        
            if (currentPosition <= self.player.duration) {
                double curPostion = self.currentPosition / 1000.0;
                double duration = self.player.duration / 1000.0;
                double interval = duration - curPostion;
                start = current64 - curPostion;
                end = current64 + interval;
                CMTime t1 = CMTimeMakeWithSeconds(start, layerTime.timescale);
                CMTime t2 = CMTimeMakeWithSeconds(end, layerTime.timescale);
                return CMTimeRangeFromTimeToTime(t1, t2);
            } else {
                return CMTimeRangeMake(kCMTimeNegativeInfinity, kCMTimePositiveInfinity);
            }
        }
      • Implementasikan callback yang melaporkan apakah pemutaran dijeda.

        /**
         @brief Meminta delegasi apakah pemutaran saat ini dijeda.
         @param pictureInPictureController Pengontrol picture-in-picture.
         @return Nilai Boolean yang menunjukkan apakah pemutaran dijeda.
         */
        - (BOOL)pictureInPictureControllerIsPlaybackPaused:(nonnull AVPictureInPictureController *)pictureInPictureController{
            return self.isPipPaused;
        }
        Catatan

        Callback ini dipanggil sebelum Picture-in-Picture dimulai. Callback ini harus mengembalikan false pada titik ini agar jendela PiP dapat diluncurkan. Mengembalikan true mencegah Picture-in-Picture dimulai.

      • Implementasikan callback untuk menangani tindakan maju cepat dan mundur cepat dari kontrol Picture-in-Picture.

        /**
         @brief Memberi tahu delegasi bahwa pengguna telah meminta untuk maju cepat atau mundur cepat.
         @param pictureInPictureController Pengontrol picture-in-picture.
         @param skipInterval Interval waktu untuk dilewati.
         @param completionHandler Handler penyelesaian yang harus Anda panggil setelah operasi pencarian selesai.
         */
         - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController skipByInterval:(CMTime)skipInterval completionHandler:(nonnull void (^)(void))completionHandler {
            int64_t skipTime = skipInterval.value / skipInterval.timescale;
            int64_t skipPosition = self.currentPosition + skipTime * 1000;
            if (skipPosition < 0) {
                skipPosition = 0;
            } else if (skipPosition > self.player.duration) {
                skipPosition = self.player.duration;
            }
            [self.player seekToTime:skipPosition seekMode:AVP_SEEKMODE_INACCURATE];
            [pictureInPictureController invalidatePlaybackState];
        }
      • Implementasikan callback untuk menangani tindakan putar dan jeda dari kontrol Picture-in-Picture.

        /**
         @brief Memberi tahu delegasi bahwa pengguna telah mengaktifkan/menonaktifkan tombol putar/jeda.
         @param pictureInPictureController Pengontrol picture-in-picture.
         @param playing Nilai Boolean yang menunjukkan apakah pemutaran harus dimulai.
         */
        - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController setPlaying:(BOOL)playing {
            if (!playing){
              [self.player pause];
              self.isPipPaused = YES;
            } else {
              // Tips: Jika Anda ingin tombol putar memulai ulang video setelah pemutaran selesai, tambahkan blok berikut.
              if (self.currentPlayerStatus == AVPStatusCompletion) {
                 [self.player seekToTime:0 seekMode:AVP_SEEKMODE_ACCURATE];
              }
        
              [self.player start];
              self.isPipPaused = NO;
          }
          [pictureInPictureController invalidatePlaybackState];
        }

Gambar-dalam-gambar dalam aplikasi

Gambar-dalam-gambar secara default di luar aplikasi. Untuk mengimplementasikan gambar-dalam-gambar dalam aplikasi, pertama-tama panggil antarmuka berikut untuk memeriksa apakah gambar-dalam-gambar aktif:

/**
 @brief Memberi tahu delegasi apakah gambar-dalam-gambar diaktifkan.
 @param pictureInPictureController Pengontrol picture-in-picture yang melaporkan statusnya.
 @param isEnable `YES` jika gambar-dalam-gambar diaktifkan; `NO` jika tidak.
 */
- (void)pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *)pictureInPictureController isEnable:(BOOL)isEnable;

Untuk menonaktifkan startup otomatis dan beralih ke aktivasi manual saat gambar-dalam-gambar berjalan, gunakan kode sampel berikut:

- (void) pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *) pictureInPictureController isEnable:(BOOL) isEnable
{
    if (isEnable && pictureInPictureController) {
        _pipController = pictureInPictureController;
        // Nonaktifkan auto-start pip.
        if (@available(iOS 15.0, *)) {
            _pipController.canStartPictureInPictureAutomaticallyFromInline = false;
        }
    } else {
        _pipController = NULL;
    }
}

- (void) switchPip:(bool) enable {
    if (_pipController == nil) {
        return;
    }
    if (enable) {
        // Mulai pip.
        [_pipController startPictureInPicture];
    } else {
        // Hentikan pip.
        [_pipController stopPictureInPicture];
    }
}

Fallback RTS langsung

Catatan

Untuk contoh kode lengkap, lihat modul RtsLiveStream dalam proyek sampel Objective-C di API-Example, yang menunjukkan cara mengintegrasikan fitur inti Alibaba Cloud Player SDK untuk iOS.

Untuk informasi selengkapnya, lihat Pemutaran Langsung RTS.

Ganti saluran audio

Gunakan properti outputAudioChannel untuk mengatur saluran audio output. Jika sumber input berupa saluran stereo, Anda dapat mengalihkan output ke saluran audio kiri atau kanan. Pengaturan ini tidak berlaku jika sumber input berupa saluran mono.

Catatan

Pengaturan saluran audio output memengaruhi rendering audio dan callback data PCM.

// Atur saluran audio output menggunakan nilai enumerasi AVPOutputAudioChannel.
// AVP_AUDIO_CHANNEL_NONE: Memutar saluran audio asli dari sumber input. Ini adalah nilai default.
// AVP_AUDIO_CHANNEL_LEFT: Memutar hanya saluran audio kiri.
// AVP_AUDIO_CHANNEL_RIGHT: Memutar hanya saluran audio kanan.
self.player.outputAudioChannel = AVP_AUDIO_CHANNEL_NONE;

Atur warna latar belakang video

Player SDK untuk iOS memungkinkan Anda mengatur warna latar belakang tampilan rendering.

Contoh API

/**
 @brief
 @param color  warna
 */
/****
 @brief Mengatur warna latar belakang video.
 @param color Warna latar belakang.
 */
-(void) setVideoBackgroundColor:(UIColor *)color;

Penggunaan

// Parameter adalah nilai heksadesimal 8 digit dalam format ARGB (alpha, merah, hijau, biru).
// Misalnya, 0x0000ff00 merepresentasikan hijau.
[self.player setVideoBackgroundColor:0x0000ff00]

Tentukan domain pemutaran dengan VidAuth

Gunakan metode VidAuth untuk menentukan bidang—seperti domain pemutaran—yang terkait dengan ID video (vid). Untuk daftar bidang yang didukung, lihat Parameter Permintaan GetPlayInfo.

Contoh API

/**
 @brief Putar video menggunakan ID video dan kredensial pemutaran (PlayAuth). Untuk informasi lebih lanjut, lihat: https://www.alibabacloud.com/help/en/vod/user-guide/use-playback-credentials-to-play-videos
 @param source Objek AVPVidAuthSource.
 @see AVPVidAuthSource
 */
- (void)setAuthSource:(AVPVidAuthSource*)source;

Penggunaan

Gunakan metode addVidPlayerConfigByStringValue dari antarmuka VidPlayerConfigGenerator untuk menambahkan bidang playDomain.

VidPlayerConfigGenerator* gen = [[VidPlayerConfigGenerator alloc]init];
// Tambahkan bidang playDomain. Untuk daftar bidang yang didukung, lihat:
// https://www.alibabacloud.com/help/en/vod/developer-reference/api-vod-2017-03-21-getplayinfo
[gen addVidPlayerConfigByStringValue:@"playDomain" value: @"com.example.xxx"];
[source setPlayConfig:[gen generatePlayerConfig]];
[self.player setAuthSource:source]:

Decoding latar belakang

Sejak versi 6.12.0, Player SDK mendukung decoding latar belakang. Dengan mengaktifkan fitur ini, pemutar dapat terus mendekode dan memutar stream video serta memicu callback saat aplikasi berjalan di latar belakang. Contoh berikut menunjukkan cara mengaktifkan fitur tersebut:

// Atur ke 1 untuk mengaktifkan decoding latar belakang atau 0 untuk menonaktifkannya. Default: 0.
[self.player setOption:ALLOW_DECODE_BACKGROUND valueInt:1];

Plugin pendekodean H.266

H.266, juga dikenal sebagai Versatile Video Coding (VVC), merupakan standar pengkodean video generasi berikutnya yang memberikan kualitas visual setara dengan bitrate jauh lebih rendah. Untuk mengoptimalkan kinerja dan mengontrol ukuran SDK utama, decoder H.266 disediakan sebagai plugin terpisah yang dapat diintegrasikan sesuai kebutuhan.

Prasyarat

  1. Player SDK atau SDK all-in-one versi 7.6.0 atau lebih baru.

  2. Anda memiliki lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Dapatkan lisensi.

  3. Plugin decoding H.266 untuk Player SDK hanya mendukung video H.266 yang ditranskode oleh Transcoding Alibaba Cloud.

Integrasikan plugin

Player SDK

CocoaPods (direkomendasikan)

Tambahkan dependensi plugin ke Podfile Anda:

Catatan

Untuk versi terbaru, lihat Riwayat Rilis iOS SDK.

// Ganti x.x.x dengan versi Player SDK Anda.
pod 'AliPlayerSDK_iOS_VVC_CODEC_PLUGIN', 'x.x.x'

Integrasi lokal

Unduh versi terbaru Player SDK untuk iOS, tambahkan file vvcCodecPlugin.framework ke Frameworks, Libraries, and Embedded Content, atur Embed ke Embed & Sign, lalu konfigurasikan Framework Search Paths. Untuk detailnya, lihat Integrasi lokal.

SDK all-in-one

CocoaPods (direkomendasikan)

Tambahkan dependensi plugin ke Podfile Anda:

// Ganti x.x.x dengan versi SDK all-in-one Anda.
pod 'AliVCSDK_Standard/AliPlayerSDK_iOS_VVC_CODEC', 'x.x.x'

Integrasi lokal

Unduh paket SDK all-in-one terbaru untuk iOS. Ekstrak paket tersebut, lalu tambahkan file plugins/vvcCodecPlugin.framework ke Frameworks, Libraries, and Embedded Content di proyek Anda, atur Embed ke Embed & Sign, dan konfigurasikan Framework Search Paths. Untuk detailnya, lihat Integrasi lokal.

Aktifkan plugin

Catatan

Mulai Player SDK untuk iOS v7.7.0, plugin diaktifkan secara default dan tidak memerlukan aktivasi manual.

[AliPlayerGlobalSettings enableCodecPlugin:@"vvc" valid:true];

Kode kesalahan

Untuk kode kesalahan plugin decoding H.266, lihat FAQ pemutar lintas platform.

Segarkan sumber secara otomatis

Aktifkan penyegaran sumber otomatis untuk mencegah gangguan pemutaran akibat autentikasi yang kedaluwarsa. Saat sumber kedaluwarsa, pemutar memicu callback guna memperoleh sumber baru, sehingga memastikan pemutaran berlangsung lancar dan berkelanjutan.

Prasyarat

  1. Pemutar atau SDK terintegrasi harus menggunakan versi 7.9.0 atau lebih baru.

  2. Gunakan sumber VidAuth untuk pemutaran atau telah mengonfigurasi penandatanganan URL.

Sumber VidAuth

Contoh API

/**
 @brief Mengatur callback untuk notifikasi kedaluwarsa sumber VidAuth.

 Callback ini dipicu saat pemutar mendeteksi bahwa sumber VidAuth saat ini telah kedaluwarsa. Sumber VidAuth kedaluwarsa jika PlayAuth atau URL pemutaran telah kedaluwarsa.
 Anda dapat menyegarkan sumber VidAuth dalam callback ini dan meneruskan objek baru melalui parameter `callback` untuk memastikan pemutaran yang lancar.

 @param callback Blok callback yang dipicu saat sumber VidAuth kedaluwarsa.
 Gunakan callback ini untuk memperbarui pemutar dengan objek `VidAuth` yang valid.
 */
-(void)setOnVidAuthExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;

Komponen utama

/**
 @protocol AVPSourceRefreshCallback
 @brief Protokol untuk menangani hasil penyegaran sumber, yang harus Anda implementasikan.

 Protokol ini memberi tahu aplikasi Anda saat pemutar meminta penyegaran sumber, seperti saat resource
 telah kedaluwarsa atau perlu diperbarui. Metode dalam protokol ini dipanggil untuk memberikan hasil penyegaran,
 termasuk keberhasilan atau kegagalan.

 @note Protokol ini berlaku untuk sumber URL, sumber VidAuth, dan skenario serupa yang memerlukan logika penyegaran.
 */
@protocol AVPSourceRefreshCallback <NSObject>

/**
 @brief Dipanggil oleh pemutar saat operasi penyegaran berhasil.
 
 @param newSource Objek sumber baru yang berisi informasi yang diperbarui.

 Metode ini menunjukkan bahwa operasi penyegaran telah berhasil diselesaikan. Anda harus meneruskan
 `newSource` yang diperbarui kembali ke pemutar agar dapat memuat resource baru.
 */
- (void)onSuccess:(id)newSource;

/**
 @brief Dipanggil oleh pemutar saat operasi penyegaran gagal.
 
 @param errorMsg String yang menjelaskan alasan kegagalan.

 Metode ini menunjukkan bahwa operasi penyegaran telah gagal. Anda dapat menggunakan `errorMsg` untuk menangkap detail kegagalan
 dan menangani kesalahan tersebut.
 */
- (void)onError:(NSString *)errorMsg;

@end

Penggunaan

Anda dapat memperoleh PlayAuth dengan memanggil operasi GetVideoPlayAuth. Kami merekomendasikan mengintegrasikan SDK sisi server untuk VOD guna mendapatkan kredensial, sehingga menghindari kebutuhan penandatanganan URL secara manual. Untuk informasi selengkapnya, lihat Portal OpenAPI.

[self.player setOnVidAuthExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
    // Dapatkan objek AVPVidAuthSource.
    if ([expiredSource isKindOfClass:[AVPVidAuthSource class]]) {
        AVPVidAuthSource *vidAuth = (AVPVidAuthSource *)expiredSource;

        // ------------------- Awal implementasi pengguna -------------------
        // Panggil fungsi kustom Anda untuk mengambil PlayAuth baru dari server aplikasi Anda.
        // clinetGetPlayAuthFunction adalah nama fungsi sampel. Ganti dengan implementasi aktual Anda.
        [self clinetGetPlayAuthFunction:vidAuth.vid success:^(NSString* newPlayAuth){
            // 1. Dalam callback sukses, setelah mengambil kredensial baru:
            [vidAuth setPlayAuth:newPlayAuth];
            // 2. Teruskan objek sumber yang diperbarui kembali ke pemutar melalui callback SDK.
            [callback onSuccess:vidAuth];
        } failure:^(NSString* errorMsg) {
            // Dalam callback kegagalan.
            // errorMsg berisi detail kesalahan.
            [callback onError:errorMsg];
        }];
        // ------------------- Akhir implementasi pengguna -------------------
    }
}];

Sumber URL

Contoh API

/**
 @brief Mengatur callback untuk notifikasi kedaluwarsa sumber URL.

 Callback ini dipicu saat pemutar mendeteksi bahwa sumber URL saat ini telah kedaluwarsa.
 Anda dapat menyegarkan sumber URL dalam callback ini dan mengembalikan sumber URL baru melalui parameter `callback` untuk memastikan pemutaran berkelanjutan.

 @note Untuk informasi lebih lanjut tentang cara mengonfigurasi penandatanganan URL, lihat dokumentasi Alibaba Cloud:
 https://www.alibabacloud.com/help/en/vod/user-guide/configure-url-signing
 
 @param callback Blok callback yang dipicu saat sumber URL kedaluwarsa.
 Anda dapat menggunakan callback ini untuk memberikan objek `URLSource` yang valid untuk memperbarui pemutar.
 */
-(void)setOnURLSourceExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;

Komponen utama

/**
 @protocol AVPSourceRefreshCallback
 @brief Protokol untuk menangani hasil penyegaran sumber, yang harus Anda implementasikan.

 Protokol ini memberi tahu aplikasi Anda saat pemutar meminta penyegaran sumber, seperti saat resource
 telah kedaluwarsa atau perlu diperbarui. Metode dalam protokol ini dipanggil untuk memberikan hasil penyegaran,
 termasuk keberhasilan atau kegagalan.

 @note Protokol ini berlaku untuk sumber URL, sumber VidAuth, dan skenario serupa yang memerlukan logika penyegaran.
 */
@protocol AVPSourceRefreshCallback <NSObject>

/**
 @brief Dipanggil oleh pemutar saat operasi penyegaran berhasil.
 
 @param newSource Objek sumber baru yang berisi informasi yang diperbarui.

 Metode ini menunjukkan bahwa operasi penyegaran telah berhasil diselesaikan. Anda harus meneruskan
 `newSource` yang diperbarui kembali ke pemutar agar dapat memuat resource baru.
 */
- (void)onSuccess:(id)newSource;

/**
 @brief Dipanggil oleh pemutar saat operasi penyegaran gagal.
 
 @param errorMsg String yang menjelaskan alasan kegagalan.

 Metode ini menunjukkan bahwa operasi penyegaran telah gagal. Anda dapat menggunakan `errorMsg` untuk menangkap detail kegagalan
 dan menangani kesalahan tersebut.
 */
- (void)onError:(NSString *)errorMsg;

@end

Penggunaan

[self.player setOnURLSourceExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
    // Dapatkan objek AVPUrlSource.
    if ([expiredSource isKindOfClass:[AVPUrlSource class]]) {
        AVPUrlSource *expiredUrlSource = (AVPUrlSource *)expiredSource;
        NSString *expiredUrl = [expiredUrlSource.playerUrl absoluteString];

        // Periksa apakah URL berisi "auth_key".
        if (![expiredUrl containsString:@"auth_key="]) {
            return;
        }

        // 1. Ekstrak URL asli dari URL yang kedaluwarsa.
        NSRange authKeyQuestionRange = [expiredUrl rangeOfString:@"?auth_key="];
        NSRange authKeyAmpersandRange = [expiredUrl rangeOfString:@"&auth_key="];

        NSInteger authKeyIndex = NSNotFound;
        if (authKeyQuestionRange.location != NSNotFound) {
            authKeyIndex = authKeyQuestionRange.location;
        } else if (authKeyAmpersandRange.location != NSNotFound) {
            authKeyIndex = authKeyAmpersandRange.location;
        }

        NSString *originalUrl = nil;
        if (authKeyIndex != NSNotFound) {
            originalUrl = [expiredUrl substringToIndex:authKeyIndex];
        } else {
            // Jika "auth_key" tidak ditemukan, anggap seluruh URL adalah URL asli.
            originalUrl = expiredUrl;
        }

        // 2. Siapkan parameter autentikasi baru: authKey dan waktu kedaluwarsa.
        // Gunakan anggota kelas authKey jika valid.
        NSString *key = (self.authKey.length > 0) ? self.authKey : @"";
        if (!NOT_EMPTY(key)) {
            [callback onError:@"REFRESH_ERROR:key fail"];
            return;
        }       
        
        // Gunakan anggota kelas validTime jika valid; jika tidak, gunakan nilai default.
        NSTimeInterval validTime = (self.validTime > 0) ? self.validTime : 3600; // Default: 3600 detik.
        NSTimeInterval newExpireTime = [[NSDate date] timeIntervalSince1970] + validTime;

         // 3. Hasilkan URL bertanda tangan baru dengan CdnAuthUtil (Metode A).
        NSString *newAuthUrl = [CdnAuthUtil aAuthWithUri:originalUrl key:key exp:newExpireTime];
        AVPUrlSource *resultSource = [[AVPUrlSource alloc] urlWithString:newAuthUrl];

        // 4. Tangani callback.
        if (newAuthUrl) {
            [callback onSuccess:resultSource];
        } else {
            [callback onError:@"REFRESH_ERROR:refresh fail"];
        }
    }
}];

Fungsi helper

Contoh berikut menggunakan metode autentikasi A.

#import "CdnAuthUtil.h"
#import <CommonCrypto/CommonDigest.h>

@implementation CdnAuthUtil

#pragma mark - Auth Method A
+ (NSString *)aAuthWithUri:(NSString *)uri key:(NSString *)key exp:(NSTimeInterval)exp {
    NSDictionary *components = [self matchUri:uri];
    if (!components) return nil;

    NSString *scheme = components[@"scheme"];
    NSString *host = components[@"host"];
    NSString *path = components[@"path"];
    NSString *args = components[@"args"];

    NSString *rand = @"0";
    NSString *uid = @"0";

    NSString *sstring = [NSString stringWithFormat:@"%@-%lld-%@-%@-%@", path, (long long)exp, rand, uid, key];
    NSString *hashvalue = [self md5sum:sstring];
    NSString *authKey = [NSString stringWithFormat:@"%lld-%@-%@-%@", (long long)exp, rand, uid, hashvalue];

    if (args.length > 0) {
        return [NSString stringWithFormat:@"%@%@%@%@&auth_key=%@", scheme, host, path, args, authKey];
    } else {
        return [NSString stringWithFormat:@"%@%@%@%@?auth_key=%@", scheme, host, path, args, authKey];
    }
}

#pragma mark - Private Helper: MD5
+ (NSString *)md5sum:(NSString *)src {
    const char *cStr = [src UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(cStr, (unsigned int)strlen(cStr), result);

    NSMutableString *hexString = [NSMutableString string];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [hexString appendFormat:@"%02x", result[i]];
    }
    return hexString.copy;
}

#pragma mark - Private Helper: Regex Match
+ (NSDictionary *)matchUri:(NSString *)uri {
    NSError *error = nil;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^(https?://)?([^/?]+)(/[^?]*)?(\\?.*)?$"
                                  options:0
                                  error:&error];
    if (error) {
        NSLog(@"Regex error: %@", error.localizedDescription);
        return nil;
    }

    NSTextCheckingResult *match = [regex firstMatchInString:uri
                                   options:0
                                   range:NSMakeRange(0, uri.length)];
    if (!match) return nil;

    __block NSString *scheme = nil, *host = nil, *path = nil, *args = nil;

    void (^setStringFromRange)(NSInteger, NSString**) = ^(NSInteger idx, NSString **outStr) {
        NSRange range = [match rangeAtIndex:idx];
        if (range.location != NSNotFound && range.length > 0) {
            *outStr = [uri substringWithRange:range];
        } else {
            *outStr = nil;
        }
    };

    setStringFromRange(1, &scheme);
    setStringFromRange(2, &host);
    setStringFromRange(3, &path);
    setStringFromRange(4, &args);

    // Tangani nilai default.
    if (!scheme) scheme = @"http://";
    if (!path) path = @"/";

    return @{
        @"scheme": scheme,
        @"host": host,
        @"path": path,
        @"args": args ?: @""
        };
}
@end

Peningkatan audio

ApsaraVideo Player SDK untuk iOS menyediakan plugin peningkatan audio guna meningkatkan pengalaman pemutaran audio. Plugin ini mencakup tiga fitur utama: normalisasi volume, peningkatan dialog, dan suara surround.

Fitur

  • Normalisasi volume: Secara otomatis menyesuaikan semua konten audio ke tingkat volume yang konsisten, sehingga meningkatkan kualitas pemutaran video dengan volume asli yang terlalu rendah atau terlalu tinggi.

    • Saluran yang didukung: mono, stereo, 5.1, dan 7.1.

    • Laju sampel yang didukung: 16 kHz, 44.1 kHz, dan 48 kHz.

  • Peningkatan dialog: Secara cerdas memperjelas dialog, membuat suara dalam adegan bising lebih mudah dipahami tanpa mengubah timbre aslinya.

    • Saluran yang didukung: stereo.

    • Laju sampel yang didukung: 44.1 kHz dan 48 kHz.

  • Suara surround: Menerapkan rendering surround virtual pada audio multi-saluran dan stereo, memberikan pengalaman imersif melalui headphone atau perangkat standar. Fitur ini mencakup dua mode: 3DSurround dan MegaBass.

    • Saluran yang didukung: mono, stereo, 5.1, dan 7.1.

    • Laju sampel yang didukung: 44.1 kHz dan 48 kHz.

Prasyarat

  1. ApsaraVideo Player SDK untuk iOS atau SDK all-in-one harus versi 7.13.0 atau lebih baru.

  2. Anda harus memiliki Lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Dapatkan lisensi untuk ApsaraVideo Player SDK.

Penting

Fitur peningkatan audio mendukung sumber audio berikut:

  • Stream VOD: Memerlukan transkoding media di ApsaraVideo VOD.

  • Stream langsung: Semua sumber didukung.

Integrasikan plugin

Integrasi CocoaPods

Tambahkan dependensi plugin ke file Podfile Anda:

Catatan

Untuk versi terbaru ApsaraVideo Player SDK untuk iOS, lihat Catatan rilis untuk ApsaraVideo Player SDK untuk iOS.

// x.x.x harus sesuai dengan versi player SDK.
pod 'AliPlayerSDK_iOS_AUDIO_ENHANCE_FILTER', 'x.x.x'

Integrasi lokal

Unduh versi terbaru ApsaraVideo Player SDK untuk iOS. Tambahkan file audioEnhanceFilter.framework ke bagian Frameworks, Libraries, and Embedded Content, atur Embed menjadi Embed & Sign, lalu konfigurasikan Framework Search Paths. Untuk informasi selengkapnya, lihat Integrasi lokal.

API

setFilterValid

Mengontrol sakelar utama fitur peningkatan audio. Nama target filter peningkatan audio adalah audioEnhance. Menonaktifkan fitur ini juga akan menonaktifkan semua sub-fiturnya. Secara default, fitur ini dinonaktifkan.

[player setFilterValid:@"audioEnhance" valid:YES];  // Aktifkan
[player setFilterValid:@"audioEnhance" valid:NO];   // Nonaktifkan
setFilterConfig

Atur objek FilterConfig sebelum memanggil metode prepare. Konfigurasi ini berlaku saat pemutaran dimulai.

AVPFilterConfig *filterConfig = [[AVPFilterConfig alloc] init];
AVPFilter *filterItem = [[AVPFilter alloc] initWithTarget:@"audioEnhance"];
AVPFilterOptions *opts = [[AVPFilterOptions alloc] init];
// Suara surround
[opts setOptions:@"enable_surround" value:@YES];
[opts setOptions:@"surround_effect_type" value:@"3DSurround"]; // Jenis harus diatur saat Anda pertama kali mengaktifkan suara surround.
// Peningkatan dialog
[opts setOptions:@"enable_dialoguenhance" value:@YES];
[opts setOptions:@"dialoguenhance_voice" value:@(1.0)]; // Rentang: 1.0 hingga 10.0. Tingkat suara harus diatur saat Anda pertama kali mengaktifkan peningkatan dialog.
// Normalisasi volume
[opts setOptions:@"enable_normalizer" value:@YES];

[filterItem setOptions:opts];
[filterConfig addFilter:filterItem];
[player setFilterConfig:filterConfig];

Parameter

Jenis

Deskripsi

enable_surround

Boolean

Menentukan apakah akan mengaktifkan fitur suara surround.

surround_effect_type

String

Mode suara surround. Nilai valid: "3DSurround" dan "MegaBass".

enable_dialoguenhance

Boolean

Menentukan apakah akan mengaktifkan fitur peningkatan dialog.

dialoguenhance_voice

Float

Intensitas peningkatan dialog. Rentang: 1.0 hingga 10.0.

enable_normalizer

Boolean

Menentukan apakah akan mengaktifkan fitur normalisasi volume.

updateFilterConfig

Panggil metode ini untuk menyesuaikan parameter secara dinamis setelah pemutar disiapkan atau selama pemutaran.

Catatan

Pemanggilan updateFilterConfig sebelum metode prepare tidak berpengaruh. Gunakan metode setFilterConfig untuk konfigurasi awal.

AVPFilterOptions *opts = [[AVPFilterOptions alloc] init];
[opts setOptions:@"enable_surround" value:@YES];
[opts setOptions:@"surround_effect_type" value:@"3DSurround"]; // Jenis hanya dapat diatur saat mengaktifkan suara surround untuk pertama kalinya. Diabaikan pada panggilan berikutnya karena filter sudah diinisialisasi.
[player updateFilterConfig:@"audioEnhance" options:opts];
Penting

Jenis suara surround ("3DSurround" atau "MegaBass") dan kekuatan peningkatan dialog (dialoguenhance_voice) harus dikonfigurasi bersamaan dengan properti enable saat pertama kali diaktifkan. Jika tidak, nilai-nilai tersebut akan diinisialisasi ke nilai default ("3DSurround" untuk suara surround dan 1,0 untuk kekuatan peningkatan dialog) dan tidak dapat diubah selama pemutaran.

Kinerja

Atur skenario pemutar

Mengatur skenario pemutar secara otomatis menerapkan parameter optimal untuk skenario tersebut, seperti pengaturan buffer dan toggle fitur. Parameter kustom yang Anda atur dengan metode setConfig menggantikan default skenario.

Catatan
  • Setelah Anda mengatur skenario pemutar, Anda dapat memanggil metode getConfig untuk melihat konfigurasi yang berlaku.

Contoh API

/**
 @brief Mengatur skenario pemutar.
 @param scene Skenario pemutar.
 @see AVPScene
 */
-(void) setPlayerScene:(AVPScene)scene;

Skenario pemutar

typedef enum _AVPScene {
    /**
     * Tidak ada skenario khusus yang diatur.
     */
    SceneNone,
    /**
     * Skenario video panjang, cocok untuk video lebih dari 30 menit.
     */
    SceneLong,
    /**
     * Skenario video menengah, cocok untuk video antara 5 hingga 30 menit.
     */
    SceneMedium,
    /**
     * Skenario video pendek, cocok untuk video hingga 5 menit.
     */
    SceneShort,
    /**
     * Skenario streaming langsung.
     */
    SceneLive,
    /**
     * Skenario RTS langsung.
     */
    SceneRTSLive
} AVPScene;

Penggunaan

// Atur skenario video pendek.
[self.player setPlayerScene:SceneShort];

// Atur skenario video menengah.
[self.player setPlayerScene:SceneMedium]; 

// Atur skenario video panjang.
[self.player setPlayerScene:SceneLong];  

// Atur skenario streaming langsung.
[self.player setPlayerScene:SceneLive];   

Pre-rendering

Alibaba Cloud Player SDK untuk iOS dapat merender frame pertama video sebelum pemutaran dimulai, yang dapat meningkatkan kecepatan startup.

Catatan
  1. Fitur ini dinonaktifkan secara default.

  2. Anda harus mengatur View pemutar sebelum memanggil Prepare untuk memastikan frame dirender ke View segera setelah siap.

  3. Mengaktifkan fitur ini memengaruhi urutan pemicuan event keberhasilan persiapan dan rendering frame pertama. Saat fitur ini dinonaktifkan, event keberhasilan persiapan dipicu sebelum event rendering frame pertama. Saat fitur ini diaktifkan, event rendering frame pertama dapat dipicu sebelum event keberhasilan persiapan, tergantung pada kecepatan decoding dan rendering. Hal ini tidak memengaruhi pemutaran.

Contoh berikut menunjukkan cara mengaktifkan fitur ini:

[self.player setOption:ALLOW_PRE_RENDER valueInt:1];

Cache lokal

Catatan

Untuk contoh kode terperinci, lihat modul PreloadUrl di proyek API-Example. Proyek sampel ini, yang ditulis dalam Objective-C, menunjukkan cara mengintegrasikan fitur inti Alibaba Cloud Player SDK untuk iOS.

Alibaba Cloud Player SDK untuk iOS menyediakan fitur cache lokal. Fitur ini meningkatkan kecepatan startup dan kecepatan pencarian, mengurangi tersendat, dan menghemat lalu lintas jaringan selama pemutaran berulang.

Aktifkan cache lokal

Fitur cache lokal dinonaktifkan secara default. Untuk menggunakan fitur ini, Anda harus mengaktifkannya dengan metode enableLocalCache dari kelas AliPlayerGlobalSettings. Contoh berikut menunjukkan caranya.

/**
 * Mengaktifkan cache lokal. Saat diaktifkan, konten di-cache ke file lokal.
 * @param enable Nilai boolean yang menentukan apakah akan mengaktifkan cache lokal. true: diaktifkan, false: dinonaktifkan. Nilai default: false.
 * @param maxBufferMemoryKB Parameter ini tidak digunakan lagi di v5.4.7.1 dan lebih baru dan tidak berpengaruh.
 * @param localCacheDir Direktori untuk file cache lokal. Anda harus menentukan jalur mutlak.
 */
[AliPlayerGlobalSettings enableLocalCache:true maxBufferMemoryKB:1024 localCacheDir:@""];

/**
 @brief Mengonfigurasi pembersihan otomatis file cache lokal.
 @param expireMin Parameter ini tidak digunakan lagi di v5.4.7.1 dan lebih baru dan tidak berpengaruh.
 @param maxCapacityMB Ukuran cache maksimum dalam MB. Nilai default: 20 GB. Selama pembersihan, jika ukuran total cache melebihi batas ini, item cache terlama dihapus satu per satu hingga ukuran total berada dalam batas.
 @param freeStorageMB Ruang disk kosong minimum dalam MB. Nilai default: 0. Selama pembersihan, jika ruang disk yang tersedia kurang dari nilai ini, file cache dihapus satu per satu hingga ruang kosong sama dengan atau lebih besar dari nilai ini, atau hingga semua file cache dihapus.
 */
[AliPlayerGlobalSettings setCacheFileClearConfig:0 maxCapacityMB:0 freeStorageMB:0];

/**
 * Callback untuk mendapatkan nilai hash URL. Nilai ini digunakan sebagai ID unik untuk URL. Anda harus memastikan bahwa setiap URL memiliki nilai hash yang unik.
 */

// Anda harus mengimplementasikan fungsi ini dan meneruskan pointer-nya ke setCacheUrlHashCallback.
static NSString *CaheUrlHashHandle(NSString *url) {
    return @"xxx";
}

[AliPlayerGlobalSettings setCacheUrlHashCallback:&CaheUrlHashHandle];
Catatan
  • Jika URL pemutaran video berisi parameter autentikasi, parameter ini dapat berubah selama caching lokal dan pemutaran. Untuk meningkatkan tingkat hit cache untuk URL yang sama dengan parameter autentikasi berbeda, Anda dapat menghapus parameter autentikasi dari URL sebelum menghitung nilai hash (misalnya, MD5) dengan menggunakan antarmuka setCacheUrlHashCallback. Misalnya, jika URL pemutaran adalah http://****.mp4?aaa, gunakan http://****.mp4 untuk menghitung nilai hash. Namun, untuk video M3U8 terenkripsi, jika Anda menghitung nilai hash keyURL-nya setelah menghapus parameter autentikasi, video yang berbeda mungkin mengenai kunci cache yang sama, menyebabkan pemutaran gagal. Solusi: Dalam callback setCacheUrlHashCallback, periksa nama domain dan hapus parameter autentikasi hanya dari URL pemutaran (http(s)://xxxxx.m3u8?aaaa), tetapi tidak dari keyURL (http(s)://yyyyy?bbbb).进阶功能-本地缓存.png

  • Jika server menyajikan file media yang sama melalui HTTP dan HTTPS, Anda dapat meningkatkan tingkat hit cache dengan menghapus atau menormalkan protokol sebelum menghitung nilai hash. Misalnya:

    • Jika URL pemutaran adalah https://****.mp4 dan http://****.mp4, gunakan ****.mp4 untuk menghitung nilai hash.

    • Jika URL pemutaran adalah https://****.mp4, Anda dapat secara konsisten menggunakan http://****.mp4 untuk menghitung nilai hash.

  • Untuk Alibaba Cloud Player SDK v5.5.4.0 dan lebih baru, jika Anda memutar stream HLS dengan URL yang berisi parameter autentikasi, Anda dapat mengatur field AVPConfig.enableStrictAuthMode untuk memilih mode autentikasi. Nilai default adalah false untuk versi lama dan true untuk v7.13.0 dan lebih baru.

    • Autentikasi non-ketat (false): Informasi autentikasi di-cache bersama konten media. Jika hanya sebagian media yang di-cache sebelumnya, pemutar menggunakan informasi autentikasi yang di-cache untuk meminta bagian yang belum di-cache. Jika autentikasi URL memiliki masa berlaku singkat atau jika pemutaran dilanjutkan setelah jeda panjang, autentikasi mungkin kedaluwarsa. Untuk menangani hal ini, Anda perlu mengimplementasikan fitur penyegaran sumber otomatis.

    • Autentikasi ketat (true): Informasi autentikasi tidak di-cache. Autentikasi terjadi di awal setiap sesi pemutaran. Hal ini dapat menyebabkan pemutaran gagal jika tidak ada koneksi jaringan.

Aktifkan atau nonaktifkan cache untuk URL

Jika Anda ingin menonaktifkan fitur cache lokal untuk satu URL, Anda dapat mengonfigurasinya dalam konfigurasi pemutar. Berikut contohnya:

// Dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Menentukan apakah akan mengaktifkan caching lokal untuk URL pemutaran. Nilai default: true.
// Untuk mengaktifkan caching lokal untuk URL ini, pengaturan ini dan pengaturan global di AliPlayerGlobalSettings harus diaktifkan.
// Jika diatur ke false, caching lokal dinonaktifkan untuk URL ini.
config.enableLocalCache = false;
....// Pengaturan lainnya

// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];

Gunakan jalur cache default

Untuk menggunakan jalur cache default, aktifkan caching lokal tanpa menentukan direktori di AliPlayerGlobalSettings.

[AliPlayerGlobalSettings enableLocalCache:true];

Preloading

Alibaba Cloud Player SDK untuk iOS menyediakan fitur preloading, yang merupakan peningkatan dari cache lokal. Preloading mengunduh sebagian video ke cache sebelum pemutaran dimulai, meningkatkan kecepatan startup.

Preloading memiliki batasan berikut:

  • Hanya mendukung file media tunggal, seperti MP4, MP3, FLV, dan HLS.

Catatan

Secara default, Alibaba Cloud Player SDK untuk iOS secara otomatis menjadwalkan sumber daya jaringan untuk preloading guna meminimalkan gangguan pada video yang sedang diputar. Permintaan preload hanya dikirim setelah buffer video yang sedang diputar mencapai ambang batas tertentu. Untuk menonaktifkan perilaku ini dan mengelola permintaan preload secara real-time, panggil metode berikut:

[AliPlayerGlobalSettings enableNetworkBalance:false];
  1. Aktifkan fitur cache lokal seperti yang dijelaskan di Cache lokal.

  2. Atur sumber data.

    VidAuth (direkomendasikan)

    AVPVidAuthSource* vidAuthSource = [[AVPVidAuthSource alloc] init];
    [vidAuthSource setVid:@"your_video_id"]; // Wajib. ID video.
    [vidAuthSource setPlayAuth:@"<yourPlayAuth>"]; // Wajib. Kredensial pemutaran. Anda harus memanggil operasi GetVideoPlayAuth ApsaraVideo untuk VOD untuk menghasilkan kredensial.
    [vidAuthSource setRegion:@"your_region"]; // Parameter ini tidak digunakan lagi di SDK v5.5.5.0 dan lebih baru. Pemutar secara otomatis mengurai wilayah. Untuk versi sebelumnya, parameter ini wajib dan default ke cn-shanghai.
    [vidAuthSource setQuality:@"AUTO"]; // "AUTO" mengaktifkan streaming bitrate adaptif.

    VidSts

    AVPVidStsSource* vidStsSource = [[AVPVidStsSource alloc] init];
    [vidStsSource setVid: @""]; // Wajib. ID video.
    [vidStsSource setRegion:@""]; // Wajib. Wilayah tempat ApsaraVideo VOD diaktifkan. Nilai default: cn-shanghai.
    [vidStsSource setSecurityToken: @"<yourSecurityToken>"]; // Wajib. Token keamanan STS. Anda harus memanggil operasi API AssumeRole STS untuk mendapatkan token.
    [vidStsSource setAccessKeySecret: @"<yourAccessKeySecret>"]; // Wajib. Rahasia AccessKey dari pasangan kunci akses STS sementara. Anda harus memanggil operasi API AssumeRole STS untuk mendapatkan rahasia AccessKey.
    [vidStsSource setAccessKeyId: @"<yourAccessKeyId>"]; // Wajib. ID AccessKey dari pasangan kunci akses STS sementara. Anda harus memanggil operasi API AssumeRole STS untuk mendapatkan ID AccessKey.
    [vidStsSource setQuality:@""]; // "AUTO" menentukan streaming bitrate adaptif.

    UrlSource

    NSString* url = @"your_playback_url"; // Wajib. URL pemutaran. Dapat berupa URL VOD pihak ketiga atau URL pemutaran dari ApsaraVideo untuk VOD.
    AVPUrlSource* urlSource = [[AVPUrlSource alloc]urlWithString:url];
  3. Atur parameter tugas.

    Catatan

    Parameter ini hanya berlaku untuk video multi-bitrate. Anda hanya perlu mengatur salah satu dari setDefaultBandWidth, setDefaultResolution, dan setDefaultQuality.

    AVPPreloadConfig *config = [[AVPPreloadConfig alloc]init];
    // Atur bitrate preload untuk stream multi-bitrate.
    [config setDefaultBandWidth:400000];
    // Atur resolusi preload untuk stream multi-bitrate.
    [config setDefaultResolution:640 * 480];
    // Atur kualitas preload untuk stream multi-bitrate.
    [config setDefaultQuality:@"FD"];
    // Atur durasi preload.
    [config setDuration:1000];
  4. Tambahkan listener tugas.

    Contoh kode

    @interface YourViewController () <OnPreloadListener>
    
    @property(nonatomic,strong) AliMediaLoaderV2* vodMedialoader; // Preloader.
    @property(nonatomic,strong) AVPVidAuthSource* vidSource; // Sumber data VidAuth.
    @property(nonatomic,strong) AVPUrlSource* urlSource; // Sumber data UrlSource.
    @property(nonatomic,strong) AVPVidStsSource* vidStsSource; // Sumber data VidSts.
    
    @end
    
    @implementation YourViewController
    
    - (void)onCompleted:(NSString *)taskId urlOrVid:(NSString *)urlOrVid {
        NSLog(@"Tugas saat ini (%@) selesai: %@", taskId,urlOrVid);
    }
    
    - (void)onError:(NSString *)taskId urlOrVid:(NSString *)urlOrVid errorModel:(AVPErrorModel *)errorModel {
        NSLog(@"Terjadi kesalahan: %@", urlOrVid);
    }
    
    - (void)onCanceled:(NSString *)taskId urlOrVid:(NSString *)urlOrVid {
        NSLog(@"Tugas dibatalkan: %@", urlOrVid);
    }
    
    @end
  5. Buat tugas, tambahkan ke instans MediaLoaderV2, dan mulai preloading.

    VidAuth (direkomendasikan)

    // Buat tugas preload.
    AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidAuthSource:vidAuthSource preloadConfig:config];
    // Dapatkan instans MediaLoaderV2.
    AliMediaLoaderV2* vodMedialoader = [AliMediaLoaderV2 shareInstance];
    // Tambahkan tugas dan mulai preloading.
    NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];

    VidSts

    // Buat tugas preload.
    AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidStsSource:vidStsSource preloadConfig:config];
    // Dapatkan instans MediaLoaderV2.
    AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init];
    // Tambahkan tugas dan mulai preloading.
    NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];

    UrlSource

    // Buat tugas preload.
    AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithUrlSource:urlSource preloadConfig:config];
    // Dapatkan instans MediaLoaderV2.
    AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init];
    // Tambahkan tugas dan mulai preloading.
    NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];
  6. Opsi: Kelola tugas.

    [vodMedialoader cancelTask:taskId];// Batalkan tugas preload dengan ID yang ditentukan.
    [vodMedialoader pauseTask:taskId];// Jeda tugas preload dengan ID yang ditentukan.
    [vodMedialoader resumeTask:taskId];// Lanjutkan tugas preload dengan ID yang ditentukan.
  7. Opsional: Hapus file yang diunggah.

    Untuk menghemat ruang, Anda dapat menghapus file cache. Karena Alibaba Cloud Player SDK untuk iOS tidak menyediakan antarmuka penghapusan, Anda harus menghapus file secara manual dari direktori cache dalam aplikasi Anda.

Preloading dinamis

Strategi preloading dinamis memungkinkan Anda mengontrol caching untuk video saat ini dan jumlah video yang akan dipreloading. Hal ini membantu Anda menyeimbangkan pengalaman pemutaran dengan biaya.

Contoh kode

// Aktifkan konfigurasi yang direkomendasikan dan preloading dinamis.
[self.listPlayer setScene:AVP_SHORT_VIDEO];

// Konfigurasikan durasi preload dasar.
// Atur durasi preload ke 1.000 ms.
AVPPreloadConfig *config = [[AVPPreloadConfig alloc] init];
config.preloadDuration = 1000;
[self.listPlayer updatePreloadConfig:config];

// Konfigurasikan jumlah item yang akan dipreloading. Ini mendukung preloading ke dua arah.
// 1 adalah jumlah item sebelumnya yang akan dipreloading, dan 3 adalah jumlah item berikutnya yang akan dipreloading.
[self.listPlayer setPreloadCount:1 nextCount:3];

// Konfigurasikan offset penurunan untuk preloading dinamis.
[self.listPlayer enableStrategy:AVP_STRATEGY_DYNAMIC_PRELOAD enable:true];
[self.listPlayer setStrategyParam:AVP_STRATEGY_DYNAMIC_PRELOAD strategyParam:@"{\"algorithm\": \"sub\",\"offset\": \"200\"}"];

Preloading video HLS multi-bitrate

Dalam skenario listPlayer dengan video HLS multi-bitrate, Anda dapat mempreloading stream yang sesuai dengan kualitas pemutaran saat ini dan memilih mode preload yang sesuai dengan kebutuhan bisnis Anda.

Mode preloading yang didukung

typedef enum AVPMultiBitratesMode : NSUInteger {
    /**
     * Konfigurasi default. Memutar dan mempreloading bitrate default.
     */
    AVPMultiBitratesMode_Default = 0,
    /**
     * Mengutamakan time to first frame yang cepat. Pemutar mulai dengan memutar bitrate yang telah selesai dipreloading.
     */
    AVPMultiBitratesMode_FCPrio = 1,
    /**
     * Menyeimbangkan time to first frame yang cepat dengan pemutaran yang lancar. Pemutar berusaha memutar bitrate yang sama sebelum dan sesudah panggilan `moveToNext`.
     */
    AVPMultiBitratesMode_FC_AND_SMOOTH = 2,
    /**
     * Mengutamakan pemutaran yang lancar. Pemutar berusaha memulai video berikutnya pada bitrate yang sama dengan video sebelumnya.
     */
    AVPMultiBitratesMode_SmoothPrio = 3,
} AVPMultiBitratesMode;

Kode integrasi

// Pilih mode pemuatan multi-bitrate.
[self.listPlayer->SetMultiBitratesMode(preLoadMode)];

// Opsional: Pilih bitrate startup.
[self.listPlayer setDefaultBandWidth:defaultBandWidth];

// Opsional: Dalam callback onPlayerEvent untuk AVPEventPrepareDone, pilih mode bitrate adaptif (ABR).
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventPrepareDone: {
            [self.listPlayer selectTrack:-1];
        }
            break;
        case AVPEventFirstRenderedStart: {
        }
            break;
        default:
            break;
    }
}

Kecepatan unduh

Anda dapat mendapatkan kecepatan unduh video yang sedang diputar dari parameter speed dalam callback onCurrentDownloadSpeed. Contoh berikut menunjukkan caranya.

- (void)onCurrentDownloadSpeed:(AliPlayer *)player speed:(int64_t)speed{
  intspeed_=speed;
}

Fitur jaringan

HTTPDNS

HTTPDNS menyelesaikan nama domain dengan mengirim permintaan ke server HTTPDNS khusus melalui HTTP. Proses ini memberikan resolusi nama domain yang lebih cepat dan stabil serta mengurangi risiko pembajakan DNS.

Alibaba Cloud Player SDK menyediakan fitur HTTPDNS yang ditingkatkan khusus untuk nama domain CDN Alibaba Cloud. Fitur ini mendukung penjadwalan jaringan yang tepat dan pembaruan resolusi secara real-time untuk meningkatkan kinerja jaringan.

Contoh HTTPDNS yang ditingkatkan

Fitur HTTPDNS yang ditingkatkan hanya tersedia untuk nama domain CDN Alibaba Cloud. Pastikan Anda menggunakan nama domain CDN Alibaba Cloud yang dikonfigurasi dan beroperasi dengan benar. Untuk menambah dan mengonfigurasi nama domain yang dipercepat di Alibaba Cloud VOD, lihat Tambahkan nama domain yang dipercepat. Untuk informasi lebih lanjut tentang nama domain CDN, lihat Alibaba Cloud CDN.

// Aktifkan HTTPDNS yang ditingkatkan.
[AliPlayerGlobalSettings enableEnhancedHttpDns:YES];
// Opsional. Tambahkan nama domain untuk pra-resolusi HTTPDNS.
[[AliDomainProcessor shareInstance] addPreResolveDomain:@"player.***alicdn.com"];

HTTP/2

Catatan

Mulai dari v5.5.0.0, Alibaba Cloud Player SDK untuk iOS mengaktifkan HTTP/2 secara default.

Alibaba Cloud Player SDK untuk iOS mendukung HTTP/2, yang menggunakan multiplexing untuk menghindari head-of-line blocking dan meningkatkan kinerja pemutaran. Contoh:

[AliPlayerGlobalSettings setUseHttp2:true];

Pra-koneksi TCP

Untuk permintaan pemutaran video HTTP (bukan HTTPS), membuat koneksi TCP terlebih dahulu secara signifikan meningkatkan pengalaman pengguna dengan mengurangi waktu koneksi, memastikan pemutaran segera dan berkelanjutan, serta mengoptimalkan penggunaan sumber daya jaringan dan sistem. Contoh:

// Format domain adalah host[:port]. Port opsional. Gunakan titik koma (;) untuk memisahkan beberapa nama domain.
// Pengaturan global.
// Ini adalah pengaturan absolut. Setiap kali Anda memanggil metode ini, string baru menggantikan yang sebelumnya. String kosong menonaktifkan koneksi awal.
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];

Unduh video

Catatan

Untuk contoh kode terperinci, lihat modul Unduh Video dan Pemutaran Offline (Unduh) di API-Example. Proyek sampel Objective-C ini menunjukkan cara mengintegrasikan fitur inti ApsaraVideo Player SDK untuk iOS.

ApsaraVideo Player SDK untuk iOS memungkinkan Anda mengunduh konten ApsaraVideo VOD untuk pemutaran offline. SDK menawarkan dua mode unduh: unduh standar dan unduh aman.

  • Unduh standar: Data video yang diunduh tidak dienkripsi oleh Alibaba Cloud dan dapat diputar menggunakan pemutar pihak ketiga.

  • Unduh aman: Data video yang diunduh dienkripsi oleh Alibaba Cloud. Data ini tidak dapat diputar oleh pemutar pihak ketiga dan hanya dapat diputar menggunakan ApsaraVideo Player.

Penggunaan

  • Fitur unduh video hanya tersedia untuk sumber VidSts dan VidAuth.

  • Untuk menggunakan fitur unduh video, Anda harus mengaktifkan dan mengonfigurasi mode unduh di konsol ApsaraVideo VOD. Untuk informasi lebih lanjut, lihat unduh offline.

  • Fitur unduh video mendukung unduhan yang dapat dilanjutkan.

Prosedur

  1. Opsi: Konfigurasikan file kunci untuk unduh aman. Langkah ini hanya diperlukan untuk unduh aman.

    Catatan

    Pastikan informasi dalam file kunci yang dikonfigurasi sesuai dengan informasi aplikasi Anda. Jika tidak, unduh video akan gagal.

    Jika Anda menggunakan mode unduh aman, Anda harus mengonfigurasi ApsaraVideo Player SDK dengan file kunci yang Anda hasilkan di konsol ApsaraVideo VOD. File ini digunakan untuk dekripsi dan verifikasi selama unduh dan pemutaran video. Untuk instruksi cara menghasilkan file kunci, lihat Aktifkan unduh aman.

    Lakukan konfigurasi ini hanya sekali dalam aplikasi Anda, seperti pada contoh berikut:

    NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"];
    [AliPrivateService initKey:encrptyFilePath];
  2. Buat dan konfigurasikan downloader.

    Kode berikut memberikan contoh:

    AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init];
    [downloader setSaveDirectory:self.downLoadPath];
    [downloader setDelegate:self];
  3. Atur listener event.

    Downloader mendukung beberapa listener event. Kode berikut memberikan contoh:

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        // Item unduh berhasil disiapkan.
    }
    -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel {
        // Terjadi kesalahan selama unduh.
    }
    -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        // Persentase progres unduh.
    }
    -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        // Persentase progres pemrosesan.
    }
    -(void)onCompletion:(AliMediaDownloader *)downloader {
        // Unduh berhasil.
    }
  4. Siapkan sumber unduh.

    Panggil metode prepare untuk menyiapkan sumber unduh. Sumber VidSts dan VidAuth didukung. Kode berikut memberikan contoh:

    • VidSts

      // Buat sumber VidSts.
      AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init];
      stsSource.region = @"your_region"; // Wilayah layanan ApsaraVideo VOD Anda. Nilai default: cn-shanghai.
      stsSource.vid = @"your_video_id"; // ID video.
      stsSource.securityToken = @"<yourSecurityToken>"; // Token keamanan STS. Untuk mendapatkan token ini, panggil operasi STS AssumeRole.
      stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // Rahasia AccessKey dari kredensial STS sementara. Untuk mendapatkan rahasia ini, panggil operasi STS AssumeRole.
      stsSource.accessKeyId = @"<yourAccessKeyId>"; // ID AccessKey dari kredensial STS sementara. Untuk mendapatkan ID ini, panggil operasi STS AssumeRole.
      
      // Jika Anda telah mengaktifkan pass-through parameter untuk enkripsi HLS di konsol ApsaraVideo VOD
      // dan nama parameter default adalah MtsHlsUriToken, Anda harus mengatur config dan meneruskannya ke sumber VidSts.
      // Jika fitur ini tidak diaktifkan, Anda dapat melewati kode berikut.
      VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
      [vp setHlsUriToken:yourMtsHlsUriToken];
      stsSource.playConfig = [vp generatePlayerConfig];
      // Siapkan sumber unduh.
      [downloader prepareWithVid:stsSource];
    • VidAuth

      // Buat sumber VidAuth.
      AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
      authSource.vid = @"your_video_id"; // ID video.
      authSource.playAuth = @"<yourPlayAuth>"; // Kredensial pemutaran. Untuk mendapatkan kredensial ini, panggil operasi ApsaraVideo VOD GetVideoPlayAuth.
      authSource.region = @"your_region"; // Tidak digunakan lagi di ApsaraVideo Player SDK V5.5.5.0 dan lebih baru karena pemutar secara otomatis mengurai wilayah.
      // Wajib untuk versi sebelumnya.
      // Wilayah layanan ApsaraVideo VOD Anda. Nilai default: cn-shanghai.
      // Jika Anda telah mengaktifkan pass-through parameter untuk enkripsi HLS di konsol ApsaraVideo VOD
      // dan nama parameter default adalah MtsHlsUriToken, Anda harus mengatur config dan meneruskannya ke sumber VidAuth.
      // Jika fitur ini tidak diaktifkan, Anda dapat melewati kode berikut.
      VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
      [vp setHlsUriToken:yourMtsHlsUriToken];
      authSource.playConfig = [vp generatePlayerConfig];
      // Siapkan sumber unduh.
      [downloader prepareWithVid:authSource];
    Catatan

    Jika Anda mengaktifkan pass-through parameter untuk enkripsi HLS di konsol ApsaraVideo VOD dan nama parameter default adalah MtsHlsUriToken, Anda harus mengatur nilai MtsHlsUriToken dalam sumber unduh seperti yang ditunjukkan dalam kode di atas. Untuk informasi lebih lanjut, lihat pass-through parameter untuk enkripsi HLS.

  5. Pilih track video setelah sumber disiapkan.

    Setelah sumber unduh disiapkan, metode onPrepared dipanggil. Parameter mediaInfo dari callback berisi informasi tentang setiap track video yang tersedia, seperti kualitas video. Pilih track untuk diunduh. Kode berikut memberikan contoh:

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        NSArray<AVPTrackInfo*>* tracks = info.tracks;
        // Misalnya, untuk mengunduh track pertama:
        [downloader selectTrack:[tracks objectAtIndex:0].trackIndex];
    }
  6. Perbarui sumber unduh dan mulai unduh.

    Untuk mencegah kredensial VidSts dan VidAuth kedaluwarsa, kami merekomendasikan memperbarui informasi sumber sebelum Anda memulai unduh. Kode berikut memberikan contoh:

    // Perbarui sumber unduh.
    [downloader updateWithVid:vidSource]
    // Mulai unduh.
    [downloader start];
  7. Lepaskan downloader setelah unduh selesai atau gagal.

    Panggil metode destroy untuk melepaskan downloader.

    [self.downloader destroy];
    self.downloader = nil;

Pemutaran terenkripsi

ApsaraVideo VOD mendukung enkripsi standar HLS, enkripsi eksklusif Alibaba Cloud, dan enkripsi DRM. Video langsung hanya mendukung enkripsi DRM. Untuk informasi lebih lanjut, lihat Pemutaran terenkripsi.

Pemutaran RTS native

iOS player SDK mengintegrasikan Native RTS SDK untuk mengaktifkan streaming langsung berlatensi rendah. Untuk informasi lebih lanjut, lihat Implementasikan penarikan aliran berbasis RTS di iOS.

Referensi