All Products
Search
Document Center

ApsaraVideo VOD:Fitur lanjutan

Last Updated:Mar 13, 2026

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

Penting

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

Konfirmasi keterampilan profesional

Catatan

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

Tetapkan listener saat aplikasi Anda dimulai atau sebelum memanggil operasi 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 kemampuan profesional. Saat Anda menggunakan fitur terkait, pemutar memverifikasi kemampuan tersebut dan mengembalikan hasil verifikasi melalui callback ini. Jika isValid bernilai false, errorMsg berisi alasan spesifiknya.

Pemutaran

Pemutaran daftar

ApsaraVideo Player SDK untuk iOS menyediakan kemampuan pemutaran daftar lengkap. SDK menggunakan mekanisme seperti preload untuk meminimalkan time-to-first-frame (TTTF) pada video pendek.

Prosedur

  1. Buat pemutar.

    Buat instans AliListPlayer.

    self.listPlayer = [[AliListPlayer alloc] init];
    [self.listPlayer setTraceID:@"xxxxxx"];  // TraceID adalah pengidentifikasi unik untuk perangkat atau pengguna, seperti IMEI atau IDFA.

  2. Opsi: Tetapkan listener.

    Saat membuat pemutaran daftar, listener bersifat opsional. Namun, jika tidak dikonfigurasikan, Anda tidak akan menerima notifikasi event seperti kegagalan pemutaran atau progres pemutaran dari pemutar. Oleh karena itu, kami menyarankan Anda mengonfigurasinya.

    Pemutar mendukung penyetelan beberapa listener. Kami menyarankan Anda menyetel onPlayerEvent dan onError karena keduanya sangat penting.

    /**
     @brief Callback kesalahan.
     @param player Pointer pemutar.
     @param errorModel Deskripsi kesalahan pemutar. Lihat AliVcPlayerErrorModel.
     */
    - (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
        // Tampilkan pesan kesalahan dan hentikan pemutaran.
    }
    /**
     @brief Callback event pemutar.
     @param player Pointer pemutar.
     @param eventType Jenis event pemutar. Lihat AVPEventType.
     */
    -(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
        switch (eventType) {
            case AVPEventPrepareDone: {
                // Pemutar telah siap.
            }
                break;
            case AVPEventAutoPlayStart:
                // Putar otomatis 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:
                // Pemutaran berulang 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 {
        // Perbarui bilah progres.
    }
    /**
     @brief Callback untuk posisi buffering video.
     @param player Pointer pemutar.
     @param position Posisi buffering saat ini.
     */
    - (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // Perbarui progres buffer.
    }
    /**
     @brief Callback untuk informasi track.
     @param player Pointer pemutar.
     @param info Array informasi stream track. Lihat AVPTrackInfo.
     */
    - (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
        // Dapatkan 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 yang akan ditampilkan sebagai subtitle.
     */
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
        // Tampilkan subtitle.
    }
    /**
     @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 {
        // Sembunyikan subtitle.
    }
    /**
     @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 saat pergantian track selesai.
     @param player Pointer pemutar.
     @param info Informasi track baru. Lihat AVPTrackInfo.
     */
    - (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
        // Notifikasi hasil pergantian bitrate.
    }
    //...
  3. Tetapkan jumlah preload.

    Menyetel jumlah preload yang wajar dapat secara efektif meningkatkan kecepatan startup.

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

    Pemutaran daftar mendukung dua jenis sumber: VidSts dan UrlSource. Url adalah URL pemutaran. Vid adalah ID audio/video (VideoId) untuk video sesuai permintaan.

    • UrlSource: URL pemutaran dari ApsaraVideo VOD atau layanan pihak ketiga.

      Anda dapat mengambil URL untuk aset media di ApsaraVideo VOD dengan memanggil operasi GetPlayInfo. Kami menyarankan mengintegrasikan SDK sisi server ApsaraVideo VOD untuk mengambil URL pemutaran. Ini menyederhanakan proses dengan menangani penandatanganan URL secara otomatis. Untuk contoh, lihat OpenAPI Explorer.

    • Vid: ID file audio atau video. Anda dapat memperoleh ID ini dari Konsol (jalur: Pustaka Media > Audio/Video) atau dengan memanggil API sisi server (Cari informasi media) setelah file diunggah.

    // Tambahkan sumber VidSts.
    [self.listPlayer addVidSource:videoId uid:UUIDString];
    // Tambahkan sumber UrlSource.
    [self.listPlayer addUrlSource:URL uid:UUIDString];
    // Hapus sumber.
    [self.listPlayer removeSource:UUIDString];
    Catatan
    • UID adalah pengidentifikasi unik untuk video. UID membedakan apakah video identik atau tidak. Jika UID cocok, video dianggap identik. Jika video diputar tidak berurutan, periksa apakah UID yang sama ditetapkan untuk video berbeda. UID tidak memiliki batasan format dan dapat berupa string apa pun.

  5. Tetapkan tampilan.

    Jika sumber berisi konten video, tetapkan view di pemutar untuk menampilkannya.

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

    Setelah menambahkan satu atau beberapa sumber video, memanggil moveTo mengaktifkan putar otomatis untuk sumber video tertentu. Contoh berikut menunjukkan cara melakukannya:

    // Gunakan API ini untuk pemutaran UrlSource.
    - (BOOL) moveTo:(NSString*)uid;
    // Gunakan API ini untuk pemutaran VidSts. Anda harus meneruskan kredensial STS sementara dan pasangan AccessKey sementara. Dapatkan terlebih dahulu. Untuk informasi selengkapnya, lihat Buat peran RAM dan lakukan otorisasi sementara STS.
    - (BOOL) moveTo:(NSString*)uid accId:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
  7. Putar video sebelumnya atau berikutnya.

    Setelah memanggil moveTo untuk memutar sumber video, panggil moveToPrev atau moveToNext untuk memutar video sebelumnya atau berikutnya, menggunakan sumber video dari panggilan moveTo sebagai acuan. Berikut contohnya:

    Catatan

    Saat menggunakan view yang sama dan memanggil moveTo atau moveToNext untuk mengganti sumber video, layar mungkin berkedip atau sejenak menjadi hitam. Untuk mencegah hal ini, tetapkan field clearShowWhenStop dari PlayerConfig ke false saat menginisialisasi listPlayer dan panggil setConfig untuk menerapkan perubahan.

    Sumber pemutaran UrlSource

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

    Sumber Pemutaran 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 pemutaran daftar yang lebih baik, gunakan solusi drama pendek kami. Untuk informasi selengkapnya, lihat Pengembangan Klien Mini-Drama.

Putar video dengan saluran alpha

Ikhtisar

ApsaraVideo Player SDK mendukung rendering saluran alpha untuk menciptakan efek dinamis, seperti hadiah animasi. Selama streaming langsung, Anda dapat memutar hadiah animasi tanpa menghalangi konten utama, meningkatkan pengalaman pengguna.

Batasan

Rendering saluran alpha didukung di SDK all-in-one V6.8.0 ke atas, atau ApsaraVideo Player SDK V6.9.0 ke atas.

Manfaat

Menggunakan video MP4 dengan transparansi untuk efek hadiah memberikan kualitas animasi yang lebih baik, ukuran file lebih kecil, kompatibilitas lebih tinggi, dan efisiensi pengembangan lebih besar. Hal ini memungkinkan efek hadiah ditampilkan lebih efektif kepada pengguna, meningkatkan pengalaman pengguna.

  1. Kualitas animasi lebih baik: Video MP4 mempertahankan detail dan warna animasi asli lebih akurat dibanding format lain.

  2. Ukuran file lebih kecil: File video MP4 dikompresi lebih efektif dibanding format lain seperti APNG atau IXD, sehingga waktu pemuatan lebih cepat dan konsumsi bandwidth jaringan lebih rendah.

  3. Kompatibilitas lebih tinggi: Format MP4 didukung luas di berbagai perangkat dan browser.

  4. Menggunakan video MP4 untuk efek hadiah meningkatkan efisiensi pengembangan. Solusi teknis ini sederhana, membebaskan developer dari penelitian dan implementasi logika parsing serta rendering yang kompleks sehingga mereka dapat fokus pada fitur lain.

Kode contoh

Gunakan properti alphaRenderMode untuk menyetel posisi saluran alpha dalam materi video (atas, bawah, kiri, atau kanan). Nilai default adalah None.

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

  • Ukuran view harus proporsional dengan resolusi materi.

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

//-----------Penggunaan AliPlayer-----------
// Tetapkan mode alpha.
[self.player setAlphaRenderMode:AVP_RENDERMODE_ALPHA_AT_LEFT];
// Tetapkan materi yang sesuai dengan mode alpha.
AVPUrlSource *source = [[AVPUrlSource alloc] urlWithString:@"https://alivc-player.oss-cn-shanghai.aliyuncs.com/video/%E4%B8%9A%E5%8A%A1%E9%9C%80%E6%B1%82%E6%A0%B7%E6%9C%AC/alpha%E9%80%9A%E9%81%93/alpha_left.mp4"];
[self.player setUrlSource:source];

// Opsi: Bersihkan layar setelah pemutaran selesai untuk mencegah artefak visual.
#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

ApsaraVideo Player SDK untuk iOS mendukung rendering video menggunakan framework Metal.

Catatan

Saat ini, hanya penyetelan warna latar belakang, mode penskalaan, dan Picture-in-Picture (PiP) yang didukung dengan rendering Metal.

Konfigurasi

/**
 @brief Jenis render video, 0 berarti render default; 1 berarti render campuran. Default adalah 0.
 */
/****
 @brief jenis render video, 0 berarti render default; 1 berarti render campuran.
 */
@property(nonatomic, assign) int videoRenderType;

Contoh penggunaan

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

Subtitle eksternal

Catatan

Untuk contoh kode lengkap, lihat modul ExternalSubtitle di proyek API-Example. Proyek ini berbasis Objective-C dan menunjukkan integrasi inti SDK untuk ApsaraVideo Player SDK untuk iOS.

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

Contoh:

  1. Buat view untuk menampilkan subtitle.

    Buat view berbeda untuk format berbeda.

    // Inisialisasi subTitleLabel kustom.
    UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame];
    // Tambahkan label subtitle ke superView kustom. superView adalah view induk yang ada di antarmuka kustom.
    [superView addSubview:subTitleLabel];
  2. Tetapkan listener terkait subtitle.

    // Subtitle eksternal ditambahkan.
    - (void)onSubtitleExtAdded:(AliPlayer*)player trackIndex:(int)trackIndex URL:(NSString *)URL {}
    // Callback informasi header subtitle.
    - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header{}
    // Callback tampilan subtitle.
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
     subTitleLabel.text =subtitle;
     subTitleLabel.tag =subtitleID;
    }
    // Callback sembunyikan subtitle.
    - (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:trackIndexenable:YES];

Subtitle eksternal (rendering kustom dengan komponen rendering)

Dukungan penuh untuk subtitle eksternal WebVTT diimplementasikan menggunakan AliVttSubtitleView dan AliVttRenderImpl, memungkinkan kustomisasi fleksibel ukuran font, warna, dan font spesifik.

Catatan

Kasus penggunaan:

  • Kustomisasi gaya subtitle WebVTT seperti font, warna, dan ukuran.

  • Integrasikan ApsaraVideo Player SDK 7.11.0 dan gunakan AliVttSubtitleView.

  • Dukung subtitle multibahasa (seperti Arab, Tiongkok, Jepang, dan Korea) dengan pencocokan font otomatis.

Penting

Prasyarat:

  • File font (.ttf) ditambahkan ke proyek Xcode.

  • Listener subtitle ditambahkan dan konten WebVTT dapat diambil.

  • Metode loadFontFromBundle berhasil memuat font.

Langkah-langkah menyesuaikan gaya subtitle

  1. Buat kelas implementasi rendering kustom (AliVttRenderImpl).

    // CustomFontVttRenderImpl.h
    @interface CustomFontVttRenderImpl : AliVttRenderImpl
    @end
    
    // CustomFontVttRenderImpl.m
    @implementation CustomFontVttRenderImpl
    
    // Opsi: Timpa logika pembuatan font
    - (UIFont *)customizeFont:(UIFont *)originalFont
             contentAttribute:(VttContentAttribute *)contentAttribute
                  contentText:(NSString *)text {
        
        // Contoh: Pilih font otomatis 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;
    }
    
    // Opsi: Paksa perubahan warna
    - (void)applyColorStyle:(NSMutableDictionary *)attrs
           contentAttribute:(VttContentAttribute *)contentAttribute {
        // Paksa warna merah
        attrs[NSForegroundColorAttributeName] = [UIColor redColor];
    }
    
    // Opsi: Perbesar font
    - (void)applyFontStyle:(NSMutableDictionary *)attrs
          contentAttribute:(VttContentAttribute *)contentAttribute
                   context:(RenderContext *)context {
        
        CGFloat originalSize = contentAttribute.fontSizePx / context.contentsScale;
        CGFloat newSize = originalSize * 2.0; // Gandakan ukuran
        
        UIFont *font = [self generateFontWithName:contentAttribute.fontName
                                        fontSize:newSize
                                          isBold:contentAttribute.mBold
                                        isItalic:contentAttribute.mItalic];
        
        attrs[NSFontAttributeName] = font;
    }
    
    // Metode bantu: 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;
    }
    
    // Metode bantu: 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) ||   // Tiongkok
                (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(@"Pendaftaran font berhasil: %@", fontName);
            } else {
                NSLog(@"Pendaftaran font gagal: %@", fontName);
            }
            
            CGFontRelease(fontRef);
            CGDataProviderRelease(provider);
        }
    }
  3. Inisialisasi view subtitle dan ikat renderer kustom.

    // Buat view subtitle
    AliVttSubtitleView *subtitleView = [[AliVttSubtitleView alloc] init];
    
    // Tetapkan factory renderer kustom
    [subtitleView setRenderImplFactory:^AliVttRenderImpl*() {
        CustomFontVttRenderImpl *impl = [[CustomFontVttRenderImpl alloc] init];
        
        // Opsi: Preload font
        [impl loadCustomFontFromBundle:@"LongCang-Regular"];
        
        return impl;
    }];
    
    // Asosiasikan dengan pemutar
    [player setExternalSubtitleView:subtitleView];
  4. Tangani callback subtitle pemutar.

    Implementasikan metode berikut di AVPDelegate:

    // Header subtitle (termasuk 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];
    }
    
    // Subtitle ditambahkan (digunakan untuk mengaktifkan track)
    - (void)onSubtitleExtAdded:(AliPlayer *)player trackIndex:(int)trackIndex URL:(NSString *)URL {
        [player selectExtSubtitle:trackIndex enable:YES];
    }

Pemutaran audio saja

Nonaktifkan pemutaran video untuk memutar hanya track audio. Konfigurasikan pengaturan ini sebelum memanggil prepare.

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

Beralih antara decoding perangkat lunak dan perangkat keras

SDK pemutar iOS menyediakan kemampuan decoding perangkat keras untuk H.264 dan H.265, dan mencakup toggle: enableHardwareDecoder. Toggle ini diaktifkan secara default, dan SDK secara otomatis beralih ke decoding perangkat lunak jika inisialisasi decoding perangkat keras gagal, memastikan pemutaran video normal. Contoh berikut menunjukkan konfigurasi ini:

// Aktifkan decoding perangkat keras. Diaktifkan secara default.
self.player.enableHardwareDecoder = YES;

Jika pemutar secara otomatis beralih dari decoding perangkat keras ke decoding perangkat lunak, notifikasi dikirim melalui callback onPlayerEvent. Berikut contohnya:

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

Pemutaran adaptif H.265

Fallback adaptif dipicu ketika model perangkat saat ini berada dalam daftar hitam H.265 berbasis cloud atau jika decoding perangkat keras H.265 gagal. Jika stream cadangan H.264 dikonfigurasi, stream tersebut akan diputar. Jika tidak, pemutar fallback ke decoding perangkat lunak H.265.

Catatan
  • Fitur ini hanya diaktifkan setelah Anda mengaktifkan layanan bernilai tambah decoding adaptif cloud-native. Anda perlu mengirimkan formulir Yida untuk meminta otorisasi lisensi.

  • Layanan bernilai tambah decoding adaptif cloud-native mencakup pengiriman dinamis data kompatibilitas decoding perangkat keras dan fallback adaptif dari stream H.265 ke H.264.

  • SDK tetap secara otomatis beralih ke decoding perangkat lunak saat decoding perangkat keras gagal, bahkan jika layanan bernilai tambah ini tidak diaktifkan.

Contoh konfigurasi stream cadangan:

// Lapisan aplikasi memelihara peta URL asli ke URL cadangan.
NSString* getBackupUrlCallback(AVPBizScene scene, AVPCodecType codecType, NSString* oriurl){
    NSMutableDictionary *globalMap = [AliPlayerViewController getGlobalBackupUrlMap];
    NSString *backupUrl = globalMap[oriurl];
    return backupUrl; 
}

[AliPlayerGlobalSettings setAdaptiveDecoderGetBackupURLCallback:getBackupUrlCallback];

Ganti definisi video berdasarkan kondisi jaringan

Catatan

iOS Player SDK mendukung stream video HLS dan DASH bitrate adaptif. Setelah metode prepare berhasil, Anda dapat mengambil informasi untuk setiap stream bitrate dengan memanggil getMediaInfo, yang mengambil objek TrackInfo. Contoh berikut menunjukkan cara melakukannya:

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

Selama pemutaran, Anda dapat mengganti stream yang sedang diputar dengan memanggil metode selectTrack pemutar. Saat nilainya SELECT_AVPTRACK_TYPE_VIDEO_AUTO, streaming bitrate adaptif diaktifkan. Contoh berikut menunjukkan hal ini:

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

Hasil pergantian dikembalikan dalam callback onTrackChanged. Berikut contohnya:

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

Opsi: Sebelum memanggil metode selectTrack pemutar untuk mengganti stream pemutaran ke streaming bitrate adaptif, Anda dapat menyetel batas atas untuk definisi dalam pergantian ABR melalui config untuk mencegah pergantian otomatis ke bitrate yang terlalu tinggi. Contoh: (Kami menyarankan memanggil kode berikut sebelum pemutar memanggil metode prepare atau pemutar daftar memanggil metode moveTo agar konfigurasi berlaku.)

AVPConfig *config = [self.player getConfig];
config.maxAllowedAbrVideoPixelNumber = 921600;// Tetapkan jumlah piksel maksimum yang diizinkan untuk ABR ke 1280x720. Pemutar hanya akan beralih ke definisi dengan jumlah piksel kurang dari atau sama dengan nilai ini.
[self.player setConfig:config];

Ambil snapshot

iOS Player SDK menyediakan metode snapShot untuk mengambil tangkapan layar video saat ini. Metode ini menangkap data mentah dan mengembalikannya sebagai bitmap. Metode 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 termasuk UI.

Pratinjau

Dalam kombinasi dengan konfigurasi ApsaraVideo VOD, Anda dapat mengimplementasikan fitur pratinjau. Fitur ini didukung untuk pemutaran VidSts dan VidAuth (disarankan). Untuk petunjuk konfigurasi, lihat Pratinjau video.

Setelah mengonfigurasi fitur pratinjau, gunakan metode setPreviewTime dari antarmuka VidPlayerConfigGen untuk menyetel durasi pratinjau. Contoh berikut menggunakan metode pemutaran VidSts:

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

Saat durasi pratinjau ditetapkan, server hanya mengembalikan konten untuk periode waktu tersebut.

Catatan

VidPlayerConfigGen mendukung penyetelan berbagai parameter permintaan sisi server. Lihat Deskripsi parameter permintaan.

Tetapkan Referer

iOS Player SDK mendukung penyetelan Referer. Saat digunakan bersama daftar hitam dan daftar putih Referer di Konsol, fitur ini dapat mengontrol izin akses. Anda dapat menyetel Referer permintaan menggunakan metode AVPConfig. Berikut contoh konfigurasi iOS Player SDK:

// Dapatkan konfigurasi terlebih dahulu.
AVPConfig *config = [self.player getConfig];
// Tetapkan Referer.
config.referer = referer;
....// Pengaturan lain
// Tetapkan konfigurasi untuk pemutar.
[self.player setConfig:config];

Tetapkan User-Agent

SDK pemutar iOS menyediakan AVPConfig untuk menyetel header User-Agent (UA). Setelah menyetel header ini, pemutar menyertakan header UA dalam permintaan HTTP-nya. Contoh berikut menunjukkan hal ini:

// Dapatkan konfigurasi terlebih dahulu.
AVPConfig *config = [self.player getConfig];
// Tetapkan User-Agent.
config.userAgent = userAgent;
....// Pengaturan lain
// Tetapkan konfigurasi untuk pemutar.
[self.player setConfig:config];

Konfigurasi jumlah retry jaringan dan timeout

Anda dapat menyetel durasi timeout jaringan dan jumlah retry untuk iOS player SDK menggunakan metode AVPConfig. Berikut contohnya:

// Dapatkan konfigurasi saat ini.
AVPConfig *config = [self.player getConfig];
// Tentukan periode timeout jaringan. Satuan: milidetik.
config.networkTimeout = 5000;
// Tentukan jumlah maksimum retry saat terjadi timeout jaringan. Interval retry adalah nilai parameter networkTimeout. Nilai 0 berarti tidak ada retry. Aplikasi menentukan kebijakan retry. Nilai default adalah 2.
config.networkRetryCount = 2;
....// Konfigurasi pengaturan lain.
// Konfigurasikan pengaturan untuk pemutar.
[self.player setConfig:config];
Catatan
  • Jika networkRetryCount lebih besar dari 0, pemutar melakukan retry sebanyak networkRetryCount kali saat terjadi masalah jaringan, dengan interval networkTimeout antar retry.

  • Jika status loading berlanjut setelah semua retry, event onError dipicu dengan AVPErrorModel.code diatur ke ERROR_LOADING_TIMEOUT.

  • Jika Anda menyetel networkRetryCount ke 0, pemutar memicu callback onPlayerEvent dengan eventWithString diatur ke EVENT_PLAYER_NETWORK_RETRY saat retry jaringan timeout. Anda kemudian dapat memanggil metode reload pemutar untuk memuat ulang jaringan atau melakukan tindakan lain.

Konfigurasi cache dan kontrol latensi

Untuk pemutar, kontrol cache sangat penting. Konfigurasi yang tepat dapat secara efektif meningkatkan kecepatan startup dan mengurangi tersendat. iOS player SDK menyediakan antarmuka kontrol untuk mengonfigurasi cache dan latensi melalui AVPConfig. Contoh berikut menunjukkan cara melakukannya:

// Ambil konfigurasi.
AVPConfig *config = [self.player getConfig];
// Tentukan latensi maksimum. Catatan: Parameter ini hanya berlaku untuk streaming langsung. Jika latensi tinggi, Player SDK menyinkronkan frame untuk memastikan latensi berada dalam batas yang ditentukan.
config.maxDelayTime = 5000;
// Tentukan durasi buffer maksimum. Satuan: milidetik. Parameter ini menentukan durasi maksimum data yang dapat dibuffer pemutar sekaligus.
config.maxBufferDuration = 50000;
// Tentukan durasi buffer puncak. Satuan: milidetik. Saat pemutar memuat data karena kondisi jaringan buruk, pemutar berhenti memuat setelah durasi data yang dibuffer mencapai nilai ini.
config.highBufferDuration = 3000;
// Tentukan durasi buffer startup. Satuan: milidetik. Nilai lebih kecil menunjukkan durasi loading startup lebih pendek. Namun, pemutar mungkin segera memasuki status loading setelah pemutaran dimulai.
config.startBufferDuration = 500;
// Konfigurasi pengaturan lain.
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];
Penting
  • Durasi buffer harus memenuhi: startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration.

  • Saat durasi buffer maksimum (maxBufferDuration) lebih dari 5 menit, sistem secara default menggunakan durasi 5 menit untuk mencegah penggunaan memori berlebihan.

Tetapkan header HTTP

Anda dapat menggunakan metode AVPConfig untuk menambahkan parameter header HTTP ke permintaan dalam pemutar. Misalnya:

// Ambil konfigurasi.
AVPConfig *config = [self.player getConfig];
// Definisikan header.
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
// Misalnya, konfigurasikan host saat menggunakan HTTPDNS.
[httpHeaders addObject:@"Host:example.com"];
// Konfigurasikan header.
config.httpHeaders = httpHeaders;
....// Konfigurasi pengaturan lain.
// Konfigurasikan pengaturan untuk pemutar.
[self.player setConfig:config];

Gambar-dalam-Gambar

Catatan

Untuk contoh kode lengkap, lihat modul PictureInPicture di proyek API-Example. Proyek ini berbasis Objective-C dan menunjukkan integrasi inti SDK untuk ApsaraVideo Player SDK untuk iOS.

Catatan
  • PiP memerlukan iOS 15 ke atas dan ApsaraVideo Player SDK untuk iOS 5.4.9.0 ke atas.

  • Untuk versi ApsaraVideo Player SDK untuk iOS sebelum 5.5.2.0, fitur PiP hanya menyediakan metode untuk mengaktifkan dan menonaktifkan PiP serta menampilkan jendela PiP saat aplikasi berada di latar belakang. Mulai versi 5.5.2.0, SDK mendukung penyetelan delegate PiP dari luar, yang memungkinkan pengembangan fitur PiP yang lebih personal.

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

Aktifkan PiP

Setelah mengaktifkan fitur Gambar-dalam-Gambar (PiP), video terus diputar di jendela kecil saat aplikasi dipindahkan ke latar belakang. Saat aplikasi dibawa kembali ke latar depan, video kembali ke format pemutaran aslinya dan terus diputar. Fitur PiP dikontrol oleh switch setPictureInPictureEnable dan harus diaktifkan saat pemutar berada dalam status AVPEventPrepareDone. Contoh berikut menunjukkan cara mengaktifkan fitur PiP:

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

Saat memanggil stop untuk menghentikan pemutaran, Anda harus terlebih dahulu menonaktifkan Gambar-dalam-Gambar (PiP) dengan memanggil setPictureInPictureEnable, lalu memanggil stop.

Atur delegate PiP

Bagian ini menyediakan contoh kode umum untuk interaksi antara jendela Gambar-dalam-Gambar (PiP) dan jendela pemutar. Contoh ini mencakup logika untuk menampilkan tombol jeda, pemutaran, maju cepat, mundur cepat, dan putar ulang PiP. Untuk detail tentang metode delegate, lihat Demo SDK Pemutar, khususnya file header AliPlayerPictureInPictureDelegate.h di folder AliyunPlayer.framework.

  1. Tetapkan delegate PiP.

    /**
    * @brief Tetapkan delegate PiP.
    */
    -(void) setPictureinPictureDelegate:(id<AliPlayerPictureInPictureDelegate>)delegate;
    
    
    // Tetapkan delegate PiP.
    [self.player setPictureinPictureDelegate:self];
  2. Tambahkan variabel dan implementasikan antarmuka delegate.

    1. Tambahkan variabel global untuk mengelola status pemutar dan PiP.

      #import "YourUIViewController.h"
      #import <AliyunPlayer/AliyunPlayer.h>
      
      @interface YourUIViewController () <AVPDelegate, AliPlayerPictureInPictureDelegate>
      // Instans pemutar.
      @property (nonatomic, strong) AliPlayer *player;
      // Kontainer view pemutar.
      @property (nonatomic, strong) UIView *playerView;
      // Dengarkan apakah PiP sedang dijeda.
      @property (nonatomic, assign) BOOL isPipPaused;
      // Dengarkan status pemutaran saat ini pemutar. Tetapkan melalui callback newStatus dari listener perubahan status event pemutaran.
      @property (nonatomic, assign) AVPStatus currentPlayerStatus;
      // Tetapkan controller PiP. Tetapkan dalam metode callback saat PiP akan dimulai. Anda perlu secara aktif menyetelnya ke nil saat halaman akan dihancurkan. Kami menyarankan menyetelnya.
      @property (nonatomic, weak) AVPictureInPictureController *pipController;
      // Dengarkan progres pemutaran saat ini pemutar. Tetapkan currentPosition ke nilai parameter position dalam callback untuk posisi pemutaran video saat ini.
      @property (nonatomic, assign) int64_t currentPosition;
      
      @end
      Catatan

      Anda harus menggunakan pengubah weak atau assign untuk pipController. Jika menggunakan pengubah assign, pastikan Anda menyetel variabel yang benar ke null.

    2. Perbarui status controller PiP saat mendengarkan event onPlayerStatusChanged.

      - (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
          self.currentPlayerStatus = newStatus;
      
        if (_pipController) {
           [self.pipController invalidatePlaybackState];
         }
      }
    3. Saat mendengarkan callback event pemutaran, panggil metode berikut untuk memperbarui status controller Gambar-dalam-Gambar (PiP).

      - (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
          if (eventType == AVPEventCompletion) {
            if (_pipController) {
             self.isPipPaused = YES; // Setelah pemutaran berakhir, ubah status PiP ke dijeda.
             [self.pipController invalidatePlaybackState];
          }
        } else if (eventType == AVPEventSeekEnd) {
          // Pencarian selesai.
            if (_pipController) {
             [self.pipController invalidatePlaybackState];
          }
        }
      }
    4. Tetapkan listener.

      • Dengarkan callback saat PiP akan dimulai.

        /**
         @brief Gambar-dalam-Gambar akan dimulai.
         @param pictureInPictureController Controller Gambar-dalam-Gambar.
         */
        - (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
            if (!_pipController) {
             self.pipController = pictureInPictureController;
          }
            self.isPipPaused = !(self.currentPlayerStatus == AVPStatusStarted);
          [pictureInPictureController invalidatePlaybackState];
        }
      • Dengarkan callback saat PiP akan berhenti.

        /**
         @brief Gambar-dalam-Gambar sedang bersiap berhenti.
         @param pictureInPictureController Controller Gambar-dalam-Gambar.
         */
        - (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
            self.isPipPaused = NO;
          [pictureInPictureController invalidatePlaybackState];
        }
      • Dengarkan callback yang menginstruksikan delegate untuk memulihkan antarmuka pengguna sebelum PiP berhenti.

        /**
         @brief Memberi tahu delegate untuk memulihkan antarmuka pengguna sebelum Gambar-dalam-Gambar berhenti.
         @param pictureInPictureController Controller Gambar-dalam-Gambar.
         @param completionHandler Panggil dan teruskan YES untuk mengizinkan sistem menyelesaikan pemulihan antarmuka pengguna pemutar.
         */
        - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler {
            if (_pipController) {
              _pipController = nil;
          }
          completionHandler(YES);
        }
      • Dengarkan callback yang menyetel rentang waktu yang dapat diputar saat ini untuk PiP.

        /**
         @brief Memberi tahu controller Gambar-dalam-Gambar tentang rentang waktu yang dapat diputar saat ini.
         @param pictureInPictureController Controller Gambar-dalam-Gambar.
         @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);
            }
        }
      • Callback untuk memantau apakah Gambar-dalam-Gambar (PiP) dijeda atau diputar.

        /**
         @brief Mencerminkan status dijeda atau diputar di UI.
         @param pictureInPictureController Controller Gambar-dalam-Gambar.
         @return Dijeda atau diputar.
         */
        - (BOOL)pictureInPictureControllerIsPlaybackPaused:(nonnull AVPictureInPictureController *)pictureInPictureController{
            return self.isPipPaused;
        }
        Catatan

        Callback ini dipicu sebelum PiP dimulai. Pastikan nilai kembalian callback ini false pada saat ini. Jika tidak, PiP tidak dapat diaktifkan.

      • Dengarkan callback saat pengguna melewati maju atau mundur untuk menyinkronkan progres pemutaran ke pemutar.

        /**
         @brief Tombol maju cepat atau mundur cepat diklik.
         @param pictureInPictureController Controller Gambar-dalam-Gambar.
         @param skipInterval Interval waktu untuk maju cepat atau mundur cepat.
         @param completionHandler Closure yang harus dipanggil untuk menunjukkan bahwa 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];
        }
      • Dengarkan callback saat tombol jeda atau putar diklik di PiP, dan lakukan operasi yang diperlukan.

        /**
         @brief Tombol jeda di Gambar-dalam-Gambar diklik.
         @param pictureInPictureController Controller Gambar-dalam-Gambar.
         @param playing Apakah sedang diputar.
         */
        - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController setPlaying:(BOOL)playing {
            if (!playing){
              [self.player pause];
              self.isPipPaused = YES;
            } else {
              // Rekomendasi: Jika pemutaran PiP selesai dan perlu diputar ulang, Anda dapat mengeksekusi kode dalam pernyataan if 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

Secara default, PiP diaktifkan saat aplikasi berpindah ke latar belakang. Untuk mengimplementasikan PiP dalam aplikasi, Anda dapat mengontrol aktivasi secara manual. Pertama, tentukan apakah PiP telah dimulai.

/**
 @brief Apakah PiP dimulai.
 @param pictureInPictureController Controller PiP.
 @param isEnable Apakah PiP dimulai.
 */
/****
 @brief pictureInPicture diaktifkan atau tidak
 @param pictureInPictureController controller gambar dalam gambar
 @param isEnable diaktifkan atau tidak
 */
- (void)pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *)pictureInPictureController isEnable:(BOOL)isEnable;

Saat PiP diaktifkan, nonaktifkan aktivasi otomatis dan kendalikan secara manual.

- (void) pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *) pictureInPictureController isEnable:(BOOL) isEnable
{
    if (isEnable && pictureInPictureController) {
        _pipController = pictureInPictureController;
        // tutup pemulaan otomatis 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 {
        // tutup pip
        [_pipController stopPictureInPicture];
    }
}

Live RTS fallback

Catatan

Untuk contoh kode lengkap, lihat modul RtsLiveStream dalam proyek API-Example. Proyek ini berbasis Objective-C dan menunjukkan integrasi inti SDK untuk ApsaraVideo Player SDK untuk iOS.

Untuk informasi selengkapnya, lihat Pemutaran Streaming Langsung RTS.

Ganti saluran suara kiri dan kanan

Di SDK Pemutar iOS, Anda dapat menggunakan properti outputAudioChannel untuk mengatur saluran audio keluaran. Jika sumber input berupa stereo, Anda dapat menerapkan metode yang dijelaskan di bawah ini untuk beralih ke saluran audio kiri atau kanan. Pengaturan ini tidak berlaku jika sumber input berupa mono.

Catatan

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

// Tetapkan nilai enumerasi AVPOutputAudioChannel untuk mengganti saluran.
// AVP_AUDIO_CHANNEL_NONE: Jangan tentukan saluran. Putar dengan saluran audio sumber input. Ini adalah nilai default.
// AVP_AUDIO_CHANNEL_LEFT: Beralih ke saluran audio kiri untuk pemutaran.
// AVP_AUDIO_CHANNEL_RIGHT: Beralih ke saluran audio kanan untuk pemutaran.
self.player.outputAudioChannel = AVP_AUDIO_CHANNEL_NONE;

Tetapkan warna latar belakang video

Anda dapat menggunakan Player SDK untuk iOS guna menyetel warna latar belakang rendering. Berikut ini adalah API yang tersedia beserta contoh penggunaannya:

Contoh API

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

Penggunaan

// Parameter adalah nilai heksadesimal 8 digit. 8 digit dikelompokkan berpasangan, mewakili A (alpha/transparansi), R (merah), G (hijau), dan B (biru) secara berurutan.
// Misalnya, 0x0000ff00 merepresentasikan hijau.
[self.player setVideoBackgroundColor:0x0000ff00]

Tentukan domain pemutaran untuk VidAuth

Dengan metode VidAuth, Anda dapat menentukan parameter seperti domain pemutaran. Untuk daftar field yang didukung, lihat GetPlayInfo. Antarmuka dan petunjuk penggunaannya adalah sebagai berikut:

Contoh API

/**
 @brief Putar menggunakan metode vid+playauth. Lihat https://www.alibabacloud.com/help/zh/vod/user-guide/use-playback-credentials-to-play-videos
 @param source Jenis input AVPVidAuthSource.
 @see AVPVidAuthSource
 */
- (void)setAuthSource:(AVPVidAuthSource*)source;

Penggunaan

Tambahkan field playDomain melalui antarmuka VidPlayerConfigGenerator.

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

Decoding latar belakang

Mulai versi 6.12.0, SDK mendukung decoding latar belakang. Saat diaktifkan, pemutar dapat terus mendekode dan memutar stream video meskipun aplikasi berada di latar belakang.

// Nilai 1 mengaktifkan decoding latar belakang. Nilai 0 menonaktifkan decoding latar belakang. Nilai default adalah 0.
[self.player setOption:ALLOW_DECODE_BACKGROUND valueInt:1];

Plugin decoding H.266

H.266, juga dikenal sebagai Versatile Video Coding (VVC), merupakan standar pengkodean video generasi berikutnya yang menawarkan bitrate jauh lebih rendah dengan kualitas yang setara. Kemampuan decoding H.266 disediakan sebagai plugin terpisah untuk integrasi sesuai kebutuhan.

Prasyarat

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

  2. Anda telah menyelesaikan otorisasi lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Mendapatkan Lisensi SDK Pemutar.

  3. ApsaraVideo Player dengan plugin decoding H.266 hanya mendukung video H.266 yang dikodekan oleh Transkoding ApsaraVideo.

Integrasikan plugin

SDK Pemutar

CocoaPods (disarankan)

Tambahkan dependensi ke Podfile Anda.

Catatan

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

// x.x.x harus sama dengan nomor versi ApsaraVideo Player SDK.
pod 'AliPlayerSDK_iOS_VVC_CODEC_PLUGIN', 'x.x.x'

Integrasi lokal

Unduh SDK ApsaraVideo Player iOS terbaru. Tambahkan vvcCodecPlugin.framework ke Frameworks, Libraries, and Embedded Content. Tetapkan Embed ke Embed & Sign. Konfigurasikan Framework Search Paths. Untuk detailnya, lihat Integrasi lokal.

SDK all-in-one

CocoaPods (disarankan)

Tambahkan dependensi ke Podfile Anda.

// x.x.x harus sama dengan nomor versi SDK terintegrasi yang Anda gunakan.
pod 'AliVCSDK_Standard/AliPlayerSDK_iOS_VVC_CODEC', 'x.x.x'

Integrasi lokal

Unduh paket all-in-one iOS terbaru. Ekstrak dan tambahkan plugins/vvcCodecPlugin.framework ke Frameworks, Libraries, and Embedded Content. Tetapkan Embed ke Embed & Sign. Konfigurasikan Framework Search Paths. Untuk detailnya, lihat Integrasi lokal.

Aktifkan plugin

Catatan

Mulai versi 7.7.0, plugin diaktifkan secara default dan tidak perlu diaktifkan secara manual.

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

Kode kesalahan terkait

Untuk kode kesalahan terkait plugin H.266, lihat FAQ Umum untuk pemutar di berbagai platform.

Pembaruan otomatis sumber pemutaran

Mengaktifkan pembaruan otomatis mencegah gangguan pemutaran akibat kedaluwarsa autentikasi. Saat sumber kedaluwarsa, pemutar memicu listener untuk mengambil URL baru, sehingga memastikan pemutaran berlangsung terus-menerus dan lancar.

Prasyarat

  1. Gunakan Player atau SDK all-in-one versi V7.9.0 atau yang lebih baru.

  2. Gunakan sumber VidAuth atau konfigurasikan penandatanganan URL.

Sumber VidAuth

Contoh API

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

 Saat pemutar mendeteksi bahwa sumber VidAuth saat ini telah kedaluwarsa, callback ini dipicu. Kedaluwarsa sumber VidAuth mencakup kedaluwarsa PlayAuth dan URL pemutaran.
 Anda dapat memperbarui sumber VidAuth dalam callback dan mengirimkan objek VidAuth baru melalui `callback` untuk memastikan pemutaran video stabil dan lancar.

 @param callback Blok callback yang dipicu saat sumber VidAuth kedaluwarsa.
 Anda dapat menggunakan callback ini untuk mengembalikan objek `VidAuth` yang valid untuk memperbarui pemutar.
 */
/****
 @brief Tetapkan callback untuk notifikasi kedaluwarsa sumber VidAuth.

 Metode ini dipicu saat pemutar mendeteksi bahwa sumber VidAuth saat ini telah kedaluwarsa.
 Anda dapat memperbarui sumber VidAuth dalam callback dan menggunakan `callback` untuk mengembalikan sumber VidAuth yang diperbarui,
 memastikan pemutaran video tidak terganggu dan lancar.

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

Komposisi fungsi

Komposisi fungsi

/**
 @protocol AVPSourceRefreshCallback
 @brief Protokol untuk menangani hasil refresh sumber pemutaran, yang perlu diimplementasikan developer.

 Protokol ini memberi tahu developer saat pemutar meminta refresh sumber pemutaran, seperti saat resource
 telah kedaluwarsa atau perlu diperbarui. Metode dalam protokol ini dipanggil untuk memberikan hasil refresh kepada developer,
 termasuk keberhasilan atau kegagalan.

 @note Protokol ini berlaku untuk sumber URL, sumber VidAuth, dan skenario serupa yang memerlukan logika refresh.
 */
 /****
 @brief Protokol untuk menangani hasil refresh sumber pemutaran, yang perlu diimplementasikan developer.

 Protokol ini memberi tahu developer saat pemutar meminta refresh sumber pemutaran, seperti saat resource
 telah kedaluwarsa atau perlu diperbarui. Metode dalam protokol ini dipanggil untuk memberikan hasil refresh kepada developer,
 termasuk keberhasilan atau kegagalan.

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

/**
 @brief Dipanggil oleh pemutar saat operasi refresh berhasil.
 @param newSource Objek sumber pemutaran baru yang berisi informasi terbaru.

 Metode ini menunjukkan bahwa operasi refresh telah berhasil diselesaikan. Developer perlu meneruskan
 `newSource` yang diperbarui kembali ke pemutar agar dapat memuat resource terbaru.
 */
 /****
 @brief Dipanggil oleh pemutar saat operasi refresh berhasil.
 
 @param newSource Objek sumber pemutaran baru yang berisi informasi terbaru.

 Metode ini menunjukkan bahwa operasi refresh telah berhasil diselesaikan. Developer perlu meneruskan
 `newSource` yang diperbarui kembali ke pemutar agar dapat memuat resource terbaru.
 */
- (void)onSuccess:(id)newSource;

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

 Metode ini menunjukkan bahwa operasi refresh telah gagal. Developer dapat menggunakan `errorMsg` untuk menangkap detail kegagalan
 dan menangani pemrosesan selanjutnya sesuai kebutuhan.
 */
 /****
 @brief Dipanggil oleh pemutar saat operasi refresh gagal.
 
 @param errorMsg String yang menjelaskan alasan kegagalan.

 Metode ini menunjukkan bahwa operasi refresh telah gagal. Developer dapat menggunakan `errorMsg` untuk menangkap detail kegagalan
 dan menangani pemrosesan selanjutnya sesuai kebutuhan.
 */
- (void)onError:(NSString *)errorMsg;

@end

Penggunaan

Anda dapat memperoleh kredensial pemutaran video dengan memanggil operasi GetVideoPlayAuth. Kami menyarankan untuk mengintegrasikan SDK sisi server ApsaraVideo VOD guna mendapatkan kredensial dan menghindari penandatanganan manual. Untuk informasi selengkapnya, lihat OpenAPI Explorer.

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

        // ------------------- Implementasi pengguna dimulai -------------------
        // Panggil fungsi Anda sendiri untuk mendapatkan PlayAuth baru dari server aplikasi Anda.
        // clinetGetPlayAuthFunction adalah nama fungsi contoh. Ganti dengan implementasi Anda sendiri.
        [self clinetGetPlayAuthFunction:vid success:^(NSString* newPlayAuth){
            // 1. Callback untuk pengambilan kredensial baru berhasil
            [vidAuth setPlayAuth:newPlayAuth];
            // 2. Kembalikan objek yang diperbarui ke pemutar melalui callback SDK
            [callback onSuccess:vidAuth];
        } failure:^(NSString* errorMsg) {
            // Callback untuk pengambilan kredensial gagal.
            // errorMsg berisi informasi kesalahan detail.
            [callback onError:errorMsg];
        }];
        // ------------------- Implementasi pengguna berakhir -------------------
    }
}];

Sumber URL

Contoh API

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

 Saat pemutar mendeteksi bahwa sumber URL saat ini telah kedaluwarsa, callback ini dipicu.
 Anda dapat memperbarui sumber URL dalam callback dan menggunakan `callback` untuk mengembalikan sumber URL baru, memastikan pemutaran video tidak terganggu.

 @note Untuk informasi tentang konfigurasi penandatanganan URL, lihat dokumentasi Alibaba Cloud:
 https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW
 
 @param callback Blok callback yang dipicu saat sumber URL kedaluwarsa.
 Anda dapat menggunakan callback ini untuk menyediakan objek `URLSource` yang valid untuk memperbarui pemutar.
 */
 /****
 @brief Tetapkan callback untuk notifikasi kedaluwarsa sumber URL.

 Metode ini dipicu saat pemutar mendeteksi bahwa sumber URL saat ini telah kedaluwarsa.
 Anda dapat memperbarui sumber URL dalam callback dan menggunakan `callback` untuk mengembalikan sumber URL yang diperbarui,
 memastikan pemutaran video tidak terganggu.

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

Komposisi fungsi

Komposisi fungsi

/**
 @protocol AVPSourceRefreshCallback
 @brief Protokol untuk menangani hasil refresh sumber pemutaran, yang perlu diimplementasikan developer.

 Protokol ini memberi tahu developer saat pemutar meminta refresh sumber pemutaran, seperti saat resource
 telah kedaluwarsa atau perlu diperbarui. Metode dalam protokol ini dipanggil untuk memberikan hasil refresh kepada developer,
 termasuk keberhasilan atau kegagalan.

 @note Protokol ini berlaku untuk sumber URL, sumber VidAuth, dan skenario serupa yang memerlukan logika refresh.
 */
 /****
 @brief Protokol untuk menangani hasil refresh sumber pemutaran, yang perlu diimplementasikan developer.

 Protokol ini memberi tahu developer saat pemutar meminta refresh sumber pemutaran, seperti saat resource
 telah kedaluwarsa atau perlu diperbarui. Metode dalam protokol ini dipanggil untuk memberikan hasil refresh kepada developer,
 termasuk keberhasilan atau kegagalan.

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

/**
 @brief Dipanggil oleh pemutar saat operasi refresh berhasil.
 @param newSource Objek sumber pemutaran baru yang berisi informasi terbaru.

 Metode ini menunjukkan bahwa operasi refresh telah berhasil diselesaikan. Developer perlu meneruskan
 `newSource` yang diperbarui kembali ke pemutar agar dapat memuat resource terbaru.
 */
 /****
 @brief Dipanggil oleh pemutar saat operasi refresh berhasil.
 
 @param newSource Objek sumber pemutaran baru yang berisi informasi terbaru.

 Metode ini menunjukkan bahwa operasi refresh telah berhasil diselesaikan. Developer perlu meneruskan
 `newSource` yang diperbarui kembali ke pemutar agar dapat memuat resource terbaru.
 */
- (void)onSuccess:(id)newSource;

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

 Metode ini menunjukkan bahwa operasi refresh telah gagal. Developer dapat menggunakan `errorMsg` untuk menangkap detail kegagalan
 dan menangani pemrosesan selanjutnya sesuai kebutuhan.
 */
 /****
 @brief Dipanggil oleh pemutar saat operasi refresh gagal.
 
 @param errorMsg String yang menjelaskan alasan kegagalan.

 Metode ini menunjukkan bahwa operasi refresh telah gagal. Developer dapat menggunakan `errorMsg` untuk menangkap detail kegagalan
 dan menangani pemrosesan selanjutnya sesuai kebutuhan.
 */
- (void)onError:(NSString *)errorMsg;

@end

Penggunaan

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

        // Periksa apakah auth_key disertakan
        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 sebagai URL asli
            originalUrl = expiredUrl;
        }

        // 2. Siapkan parameter autentikasi baru: authKey dan waktu kedaluwarsa
        // Jika anggota kelas authKey valid, gunakan authKey
        NSString *key = (self.authKey.length > 0) ? self.authKey : @"";
        if (!NOT_EMPTY(key)) {
            [callback onError:@"REFRESH_ERROR:key fail"];
            return;
        }       
        
        // Jika anggota kelas validTime valid, gunakan validTime; 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 terautentikasi baru menggunakan CdnAuthUtil (Metode A)
        NSString *newAuthUrl = [CdnAuthUtil aAuthWithUri:originalUrl key:key exp:newExpireTime];
        AVPUrlSource *resultSource = [[AVPUrlSource alloc] urlWithString:newAuthUrl];

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

Fungsi utilitas

Misalnya, menggunakan metode penandatanganan A.

Fungsi utilitas

#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);

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

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

Kinerja

Tetapkan skenario pemutaran

Menyetel skenario pemutaran secara otomatis mengonfigurasi parameter optimal (termasuk pengaturan buffer dan toggle fitur) sambil mempertahankan pengaturan kustom yang dibuat melalui antarmuka setConfig (pengaturan kustom memiliki prioritas lebih tinggi).

Catatan
  • Setelah menyetel skenario pemutaran, gunakan antarmuka getConfig untuk melihat konfigurasi parameter.

Contoh API

/**
 Ringkasan: Mengatur skenario pemutar.
 Parameter scene: Skenario pemutar.
 Lihat juga: AVPScenario
 */
/****
 Ringkasan: Mengatur pemandangan pemutar.
 Parameter scene: Pemandangan pemutar.
 Lihat juga: AVPScene
 */
-(void) setPlayerScene:(AVPScene)scene;

Skenario pemutaran

typedef enum _AVPScene {
    /**
     * Skenario: Tidak ada
     */
    /****
     * tidak ada skenario
     */
    SceneNone,
    /**
     * Skenario video panjang: Berlaku untuk video lebih dari 30 menit
     */
    /****
     * skenario panjang: berlaku untuk lebih dari 30 menit
     */
    SceneLong,
    /**
     * Skenario video menengah: Berlaku untuk video 5–30 menit
     */
    /****
     * skenario menengah: berlaku untuk 5 menit-30 menit
     */
    SceneMedium,
    /**
     * Skenario video pendek: Berlaku untuk video hingga 5 menit
     */
    /****
     * skenario pendek: berlaku untuk 0 detik-5 menit
     */
    SceneShort,
    /**
     * Skenario streaming langsung
     */
    /****
     * skenario langsung
     */
    SceneLive,
    /**
     * Skenario streaming langsung latensi ultra-rendah
     */
    /****
     * skenario langsung RTS
     */
    SceneRTSLive
} AVPScene;

Penggunaan

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

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

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

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

Pre-rendering

ApsaraVideo Player SDK untuk iOS mendukung rendering frame pertama dengan cepat sebelum pemutaran dimulai, meningkatkan kecepatan startup.

Catatan
  1. Fitur ini dinonaktifkan secara default.

  2. Anda harus menyetel View sebelum memanggil Prepare untuk memastikan frame siap dirender di View.

  3. Saat diaktifkan, fitur ini mengubah urutan event keberhasilan persiapan dan rendering frame pertama: Tanpa fitur ini, keberhasilan persiapan dipicu terlebih dahulu, lalu rendering frame pertama. Dengan fitur ini, rendering frame pertama mungkin dipicu sebelum keberhasilan persiapan, tergantung pada kecepatan decoding dan rendering. Hal ini tidak memengaruhi pemutaran.

Contoh:

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

Cache lokal

Catatan

Untuk contoh kode lengkap, lihat modul PreloadUrl di proyek API-Example. Proyek ini berbasis Objective-C dan menunjukkan integrasi inti SDK untuk ApsaraVideo Player SDK untuk iOS.

ApsaraVideo Player SDK untuk iOS menyediakan caching lokal untuk meningkatkan kecepatan startup, kecepatan pencarian, dan mengurangi tersendat untuk pemutaran video berulang. Fitur ini juga menghemat bandwidth.

Aktifkan cache lokal

Fitur caching lokal dinonaktifkan secara default. Untuk menggunakan fitur ini, Anda harus mengaktifkannya secara manual. Anda dapat mengontrol fitur ini di AliPlayerGlobalSettings menggunakan enableLocalCache. Berikut contohnya:

/**
 * Aktifkan cache lokal. Setelah diaktifkan, akan menyimpan cache ke file lokal.
 * @param enable: Saklar fitur cache lokal. true: aktifkan, false: nonaktifkan. Default adalah nonaktifkan.
 * @param maxBufferMemoryKB: Tidak berlaku sejak V5.4.7.1. Tidak berpengaruh.
 * @param localCacheDir: Harus ditetapkan. Direktori untuk file cache lokal. Harus berupa jalur mutlak.
 */
[AliPlayerGlobalSettings enableLocalCache:true maxBufferMemoryKB:1024 localCacheDir:@""];

/**
 @brief Pengaturan untuk pembersihan otomatis file cache lokal.
 @param expireMin: Tidak berlaku sejak V5.4.7.1. Tidak berpengaruh.
 @param maxCapacityMB: Kapasitas cache maksimum dalam megabyte. Default adalah 20 GB. Selama pembersihan, jika total kapasitas cache melebihi ukuran ini, file cache tertua akan dihapus satu per satu, diurutkan berdasarkan waktu cache terakhir dari cacheItem, hingga kapasitas kurang dari atau sama dengan kapasitas cache maksimum.
 @param freeStorageMB: Ruang disk kosong minimum dalam megabyte. Default adalah 0. Selama pembersihan, mirip dengan kapasitas cache maksimum, jika ruang disk saat ini kurang dari nilai ini, file cache juga akan dihapus satu per satu sesuai aturan hingga freeStorage lebih besar dari atau sama dengan nilai ini atau semua cache dihapus.
 */
[AliPlayerGlobalSettings setCacheFileClearConfig:0 maxCapacityMB:0 freeStorageMB:0];

/**
 * Callback untuk mendapatkan nilai hash dari URL yang dimuat. Digunakan sebagai ID unik untuk URL. Anda harus memastikan setiap URL berbeda.
 */

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

[AliPlayerGlobalSettings setCacheUrlHashCallback:&CaheUrlHashHandle];
Catatan
  • Jika URL pemutaran file video berisi parameter autentikasi, nilai parameter autentikasi berubah selama caching lokal dan pemutaran file video. Anda dapat memanggil operasi setCacheUrlHashCallback untuk menghitung nilai hash MD5 setelah menghapus parameter autentikasi. Misalnya, http://****.mp4?aaa adalah URL pemutaran file video yang berisi parameter autentikasi. Dalam hal ini, URL http://****.mp4 digunakan untuk menghitung nilai hash MD5 saat file video dimuat. Namun, jika Anda menghitung nilai hash MD5 setelah menghapus parameter autentikasi di URL kunci video M3U8 terenkripsi, pemutaran gagal karena video berbeda terkena URL kunci yang sama. Solusi: Hanya hapus parameter autentikasi dari URL pemutaran http(s)://xxxxx.m3u8?aaaa tetapi jangan hapus dari URL kunci http(s)://yyyyy?bbbb dalam callback setCacheUrlHashCallback.进阶功能-本地缓存.png

  • Jika server mendukung protokol HTTP dan HTTPS tetapi mengarah ke file media yang sama, hapus atau satukan header permintaan sebelum menghitung nilai MD5. Misalnya:

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

    • Jika URL pemutaran video adalah https://****.mp4, satukan ke http://****.mp4 sebelum menghitung nilai MD5.

  • Untuk Player SDK 5.5.4.0 ke atas, jika URL pemutaran video berisi parameter autentikasi dan protokol pemutaran adalah HLS, Anda dapat menyetel field AVPConfig.enableStrictAuthMode untuk memilih mode autentikasi berbeda (Nilai default adalah false untuk versi sebelumnya. Nilai default adalah true untuk 7.13.0 ke atas.):

    • Autentikasi non-ketat (false): Autentikasi di-cache. Jika hanya bagian media yang di-cache sebelumnya, pemutar menggunakan autentikasi yang di-cache untuk meminta bagian yang tidak di-cache. Jika periode validitas autentikasi URL pendek, atau pemutaran dilanjutkan lama setelah dijeda, autentikasi mungkin kedaluwarsa. Gabungkan dengan fitur pembaruan otomatis sumber pemutaran untuk menangani autentikasi kedaluwarsa saat melanjutkan.

    • Autentikasi ketat (true): Autentikasi tidak di-cache. Autentikasi terjadi setiap startup, menyebabkan kegagalan startup tanpa konektivitas jaringan.

Aktifkan atau nonaktifkan cache lokal untuk URL tunggal

Jika Anda ingin menonaktifkan fitur cache lokal untuk URL tunggal, Anda dapat menyetelnya di konfigurasi pemutar. Berikut contohnya:

// Dapatkan konfigurasi terlebih dahulu.
AVPConfig *config = [self.player getConfig];
// Apakah akan mengaktifkan cache lokal untuk URL pemutaran. Default adalah true. Saat cache lokal diaktifkan di AliPlayerGlobalSettings dan juga diaktifkan di sini (ditetapkan ke true), cache lokal untuk URL ini berlaku. Jika ditetapkan ke false di sini, cache lokal untuk URL ini dinonaktifkan.
config.enableLocalCache = false;
....// Pengaturan lain

// Tetapkan konfigurasi untuk pemutar.
[self.player setConfig:config];

Gunakan jalur cache default

Jika Anda ingin menggunakan jalur default untuk caching, Anda dapat mengonfigurasi AliPlayerGlobalSettings sebagai berikut.

[AliPlayerGlobalSettings enableLocalCache:true];

Preloading

ApsaraVideo Player SDK untuk iOS menyediakan preloading, peningkatan dari caching lokal yang meningkatkan kecepatan startup dengan mengunduh sebagian video ke cache sebelum pemutaran dimulai.

Batasan preloading:

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

Catatan

Secara default, SDK menjadwalkan permintaan preload jaringan untuk menghindari gangguan pada video yang sedang diputar. Permintaan preload dikirim hanya setelah konten yang dibuffer mencapai ambang batas tertentu. Untuk menonaktifkan ini dan mengelola permintaan secara real-time, gunakan:

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

  2. Tetapkan sumber data.

    VidAuth (disarankan)

    AVPVidAuthSource* vidAuthSource = [[AVPVidAuthSource alloc] init];
    [vidAuthSource setVid:@"Informasi Vid"]; // Wajib. ID video (VideoId).
    [vidAuthSource setPlayAuth:@"<yourPlayAuth>"]; // Wajib. Kredensial pemutaran. Anda perlu memanggil operasi GetVideoPlayAuth ApsaraVideo VOD untuk menghasilkannya.
    [vidAuthSource setRegion:@"Wilayah akses"]; // Untuk player SDK V5.5.5.0 ke atas, parameter ini tidak berlaku. Anda tidak perlu menyetel wilayah. Pemutar akan mengurai wilayah secara otomatis. Untuk versi player SDK sebelum 5.5.5.0, parameter ini wajib. Wilayah akses ApsaraVideo VOD. Default adalah cn-shanghai.
    [vidAuthSource setQuality:@"Definisi yang dipilih"]; //"AUTO" merepresentasikan bitrate adaptif.

    VidSts

    AVPVidStsSource* vidStsSource = [[AVPVidStsSource alloc] init];
    [vidStsSource setVid: @"Informasi Vid"]; // Wajib. ID video (VideoId).
    [vidStsSource setRegion:@"Wilayah akses"]; // Wajib. Wilayah akses ApsaraVideo VOD. Default adalah cn-shanghai.
    [vidStsSource setSecurityToken: @"<yourSecurityToken>"]; // Wajib. Token keamanan STS. Anda perlu memanggil operasi AssumeRole STS untuk menghasilkannya.
    [vidStsSource setAccessKeySecret: @"<yourAccessKeySecret>"]; // Wajib. Rahasia AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi AssumeRole STS untuk menghasilkannya.
    [vidStsSource setAccessKeyId: @"<yourAccessKeyId>"]; // Wajib. ID AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi AssumeRole STS untuk menghasilkannya.
    [vidStsSource setQuality:@"Definisi yang dipilih"]; //"AUTO" merepresentasikan bitrate adaptif.

    UrlSource

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

    Catatan

    Ini hanya berlaku untuk video multi-bitrate. Anda dapat memilih salah satu dari setDefaultBandWidth, setDefaultResolution, atau setDefaultQuality.

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

    Perluas untuk melihat 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 url
    @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 pengecualian:%@", urlOrVid);
    }
    
    - (void)onCanceled:(NSString *)taskId urlOrVid:(NSString *)urlOrVid {
        NSLog(@"Tugas dibatalkan:%@", urlOrVid);
    }
    
    @end
  5. Buat tugas, tambahkan ke instans MediaLoaderV2, dan mulai preloading.

    VidAuth (disarankan)

    // 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 tugas tertentu.
    [vodMedialoader pauseTask:taskId];// Jeda tugas preload dengan ID tugas tertentu.
    [vodMedialoader resumeTask:taskId];// Lanjutkan tugas preload dengan ID tugas tertentu.
  7. Opsi: Hapus file yang dimuat.

    Anda dapat menghapus file yang dimuat sesuai kebutuhan untuk menghemat ruang. SDK tidak menyediakan antarmuka penghapusan. Anda perlu menghapus file di direktori pemuatan dalam aplikasi.

Preloading dinamis

Kebijakan preloading dinamis memungkinkan Anda menyeimbangkan pengalaman pemutaran dan biaya dengan mengontrol cache video saat ini dan jumlah item yang dipreloading.

Perluas untuk melihat kode

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

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

// Konfigurasikan jumlah item yang akan dipreloading. Mendukung kedua arah.
// 1 adalah jumlah item yang akan dipreloading mundur, 3 adalah jumlah item yang akan dipreloading maju.
[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\"}"];

Preload video HLS multi-bitrate

Untuk video HLS multi-bitrate di listPlayer, Anda dapat mempreloading stream yang sesuai dengan definisi pemutaran saat ini dan memilih mode preload.

Perluas untuk melihat mode preload yang didukung

typedef enum AVPMultiBitratesMode : NSUInteger {
    /**
     * Konfigurasi default. Putar dan preload bitrate default.
     */
    /****
     * mode default, putar dan preload bitrate default stream
     */
    AVPMultiBitratesMode_Default = 0,
    /**
     * Konfigurasi prioritas frame pertama. Video mulai diputar pada bitrate yang telah selesai dipreloading.
     */
    /****
     * Prioritas biaya frame pertama (FC), kurangi biaya frame pertama. hanya putar bitrate stream hls yang telah dipreloading.
     */
    AVPMultiBitratesMode_FCPrio = 1,
    /**
     * Menyeimbangkan frame pertama dan pemutaran lancar. Bitrate video konsisten sebelum dan sesudah pergantian (moveToNext), dan kinerja frame pertama juga dipertimbangkan.
     */
    /****
     * Frame pertama dan pemutaran lancar, putar bitrate yang sama sebelum dan sesudah moveToNext
     */
    AVPMultiBitratesMode_FC_AND_SMOOTH = 2,
    /**
     * Konfigurasi prioritas pemutaran lancar. Video mulai diputar pada bitrate video sebelumnya.
     */
    /****
     * Prioritas pemutaran lancar, putar bitrate yang sama sebelum dan sesudah moveToNext.
     */
    AVPMultiBitratesMode_SmoothPrio = 3,
} AVPMultiBitratesMode;

Perluas untuk melihat kode integrasi

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

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

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

Dapatkan kecepatan unduh

Ambil kecepatan unduh video yang sedang diputar dalam callback onCurrentDownloadSpeed.

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

Fitur jaringan

HTTPDNS

Fitur HTTPDNS menggunakan teknologi resolusi DNS untuk mengirim permintaan resolusi nama domain ke server HTTPDNS tertentu dan mendapatkan hasil resolusi dengan cepat dan stabil. Hal ini mencegah pembajakan DNS.

ApsaraVideo Player SDK menyediakan layanan HTTPDNS untuk nama domain yang dipercepat oleh Alibaba Cloud CDN. Anda dapat menggunakan fitur HTTPDNS yang disempurnakan untuk mengimplementasikan penjadwalan presisi dan memastikan hasil resolusi domain real-time segera berlaku. Hal ini meningkatkan kinerja jaringan.

Contoh penggunaan HTTPDNS yang disempurnakan

Anda hanya dapat menggunakan fitur HTTPDNS yang disempurnakan untuk nama domain yang dipercepat. Sebelum menggunakan fitur ini, pastikan nama domain yang dipercepat telah ditambahkan dan dikonfigurasi. Untuk informasi selengkapnya tentang cara menambahkan dan mengonfigurasi nama domain untuk CDN di ApsaraVideo VOD, lihat Tambahkan nama domain yang dipercepat. Untuk informasi selengkapnya tentang nama domain yang dipercepat, lihat Apa itu Alibaba Cloud CDN?.

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

HTTP/2

Catatan

ApsaraVideo Player SDK untuk iOS mengaktifkan HTTP/2 secara default mulai dari V5.5.0.0.

ApsaraVideo Player SDK untuk iOS mendukung HTTP/2. Protokol ini menggunakan multiplexing untuk menghindari blokir kepala antrian dan meningkatkan kinerja pemutaran.

[AliPlayerGlobalSettings setUseHttp2:true];

Koneksi TCP pra-dibangun HTTP

Untuk permintaan pemutaran video HTTP (bukan HTTPS), membangun koneksi TCP sebelumnya secara signifikan meningkatkan pengalaman pengguna, mengurangi waktu koneksi, memastikan kecepatan dan kelangsungan pemutaran, serta mengoptimalkan penggunaan sumber daya jaringan dan sistem.

// Format domain adalah host[:port]. Port opsional. Beberapa domain dipisahkan dengan titik koma (;).
// Pengaturan global.
// Setiap kali antarmuka lengkap diatur, string saat ini digunakan (tambah untuk lebih banyak, hapus untuk lebih sedikit). String kosong menghentikan pra-koneksi.
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];

Unduh video

Catatan

Untuk contoh kode lengkap, lihat modul Download di proyek API-Example. Proyek ini berbasis Objective-C dan menunjukkan integrasi inti SDK untuk ApsaraVideo Player SDK untuk iOS.

ApsaraVideo Player SDK untuk iOS menyediakan fitur unduh video untuk konten ApsaraVideo VOD, dengan mode standar dan aman.

  • Unduhan standar: Video yang diunduh tidak dienkripsi dan dapat diputar oleh pemutar pihak ketiga.

  • Unduhan aman: Video yang diunduh dienkripsi dan hanya dapat diputar oleh ApsaraVideo Player.

Catatan penggunaan

  • Fitur ini hanya untuk sumber VidSts dan VidAuth.

  • Aktifkan dan konfigurasikan mode unduhan di Konsol ApsaraVideo VOD. Untuk informasi selengkapnya, lihat Unduhan offline.

  • Anda dapat melanjutkan unduhan video dari breakpoint.

Prosedur

  1. Opsi: Konfigurasikan file verifikasi enkripsi untuk unduhan aman. Konfigurasikan file ini hanya untuk unduhan aman. Unduhan standar tidak memerlukannya.

    Catatan

    Pastikan file verifikasi enkripsi sesuai dengan informasi aplikasi Anda. Jika tidak, unduhan video gagal.

    Jika Anda menggunakan unduhan aman, konfigurasikan file kunci yang dihasilkan di Konsol ApsaraVideo VOD di Player SDK. File kunci digunakan untuk mendekripsi dan memverifikasi video untuk diunduh dan diputar. Untuk informasi selengkapnya tentang menghasilkan file kunci, lihat Aktifkan unduhan aman.

    Anda hanya perlu mengonfigurasi ini sekali dalam aplikasi. Berikut contohnya:

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

    Contoh:

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

    Objek unduh menyediakan beberapa listener.

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        // Item unduhan berhasil dipersiapkan.
    }
    -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel {
        // Terjadi kesalahan unduhan.
    }
    -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        // Persentase progres unduhan.
    }
    -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        // Persentase progres pemrosesan.
    }
    -(void)onCompletion:(AliMediaDownloader *)downloader {
        // Unduhan berhasil.
    }
  4. Persiapkan sumber unduhan.

    Panggil metode prepare untuk mempersiapkan sumber unduhan. Jenis sumber yang didukung termasuk VidStsSource dan VidAuthSource. Contoh berikut:

    • VidSts

      // Buat VidSts.
      AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init];
      stsSource.region = @"Access region"; // Wilayah akses ApsaraVideo VOD. Nilai default-nya adalah cn-shanghai.
      stsSource.vid = @"Vid information"; // ID video (VideoId).
      stsSource.securityToken = @"<yourSecurityToken>"; // Token keamanan STS. Anda perlu memanggil operasi AssumeRole dari STS untuk menghasilkannya.
      stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // Rahasia AccessKey dari pasangan Kunci Akses STS temporary. Anda perlu memanggil operasi AssumeRole dari STS untuk menghasilkannya.
      stsSource.accessKeyId = @"<yourAccessKeyId>"; // ID AccessKey dari pasangan Kunci Akses STS temporary. Anda perlu memanggil operasi AssumeRole dari STS untuk menghasilkannya.
      
      // Jika Anda telah mengaktifkan transmisi langsung parameter enkripsi standar HLS di konsol VOD, dan nama parameter default-nya adalah MtsHlsUriToken, Anda perlu mengatur konfigurasi tersebut dan meneruskannya ke vid. Lihat contoh berikut.
      // Jika Anda belum mengaktifkan transmisi langsung parameter enkripsi standar HLS di konsol VOD, Anda tidak perlu mengintegrasikan kode berikut.
      VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
      [vp setHlsUriToken:yourMtsHlsUriToken];
      stsSource.playConfig = [vp generatePlayerConfig];
      // Siapkan sumber unduhan.
      [downloader prepareWithVid:stsSource];
    • VidAuth

      // Buat VidAuth.
      AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
      authSource.vid = @"Informasi Vid"; // ID video (VideoId).
      authSource.playAuth = @"<yourPlayAuth>"; // Kredensial pemutaran. Anda perlu memanggil operasi GetVideoPlayAuth dari ApsaraVideo VOD untuk menghasilkannya.
      authSource.region = @"Wilayah akses"; // Untuk Player SDK versi V5.5.5.0 dan yang lebih baru, parameter ini sudah tidak digunakan lagi. Anda tidak perlu mengatur wilayah. Pemutar akan secara otomatis mengurai wilayah tersebut. Untuk versi Player SDK sebelum 5.5.5.0, parameter ini wajib diisi. Wilayah akses ApsaraVideo VOD. Nilai default-nya adalah cn-shanghai.
      // Jika Anda telah mengaktifkan fitur pass-through parameter enkripsi standar HLS di Konsol VOD, dan nama parameter default-nya adalah MtsHlsUriToken, Anda perlu mengatur konfigurasi dan meneruskannya ke dalam vid. Lihat contoh berikut.
      // Jika Anda belum mengaktifkan fitur pass-through parameter enkripsi standar HLS di Konsol VOD, Anda tidak perlu mengintegrasikan kode berikut.
      VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
      [vp setHlsUriToken:yourMtsHlsUriToken];
      authSource.playConfig = [vp generatePlayerConfig];
      // Siapkan sumber unduhan.
      [downloader prepareWithVid:authSource];
    Catatan

    Jika Anda mengaktifkan parameter pass-through untuk HLS encryption di ApsaraVideo VOD console, parameter default-nya adalah MtsHIsUriToken. Untuk informasi selengkapnya, lihat Parameter pass-through for HLS encryption. Kemudian, atur nilai MtsHIsUriToken ke sumber ApsaraVideo VOD dengan mengikuti kode sebelumnya.

  5. Pilih item download.

    Setelah persiapan berhasil, metode onPrepared dipanggil. TrackInfo yang dikembalikan mencakup informasi seperti definisi setiap aliran video. Pilih track yang akan didownload. Berikut ini contohnya:

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

    VidSts atau VidAuth mungkin kedaluwarsa sebelum unduhan dimulai. Oleh karena itu, kami menyarankan untuk memperbarui sumber unduhan sebelum Anda memulai unduhan.

    // Perbarui sumber unduhan.
    [downloader updateWithVid:vidSource]
    // Mulai unduhan.
    [downloader start];
  7. Setelah pengunduhan berhasil atau gagal, lepaskan downloader.

    Setelah pengunduhan berhasil, panggil destroy untuk melepaskan downloader.

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

Pemutaran terenkripsi

ApsaraVideo VOD mendukung enkripsi standar HLS, enkripsi proprietary Alibaba Cloud, dan Enkripsi DRM. Untuk petunjuknya, lihat Putar video terenkripsi.

Native RTS playback

SDK mengintegrasikan Native RTS SDK untuk mengimplementasikan live streaming berlatensi rendah. Untuk informasi selengkapnya, lihat Implement RTS-based stream pulling on iOS.

Referensi