全部产品
Search
文档中心

ApsaraVideo VOD:Fitur lanjutan

更新时间:Dec 17, 2025

Topik ini memberikan contoh penggunaan fitur lanjutan ApsaraVideo Player SDK untuk iOS. Untuk panduan lengkap semua fitur, lihat referensi API.

Penting

Untuk menjalankan demo, Anda dapat mengunduh dan mengikuti petunjuk di Jalankan demo untuk mengompilasi dan menjalankan proyek.

Verifikasi kemampuan profesional

Catatan

Beberapa fitur ApsaraVideo Player memerlukan lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Fitur ApsaraVideo Player SDK. Untuk menggunakan fitur tersebut, Anda harus mendapatkan lisensi seperti yang dijelaskan di Dapatkan lisensi untuk ApsaraVideo Player SDK.

Anda dapat mengatur listener saat aplikasi dimulai atau sebelum memanggil operasi API player apa pun.

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

[AliPrivateService setOnPremiumLicenseVerifyCallback:premiumVeryfyCallback];

AVPPremiumBizType adalah tipe enumerasi untuk fitur premium. Saat fitur terkait digunakan, player memvalidasi fitur tersebut dan mengembalikan hasil melalui callback ini. Jika isValid bernilai false, errorMsg berisi alasan spesifiknya.

Pemutaran

List playback

ApsaraVideo Player SDK untuk iOS menyediakan fitur list playback komprehensif untuk skenario list playback khas. Fitur-fitur ini, dikombinasikan dengan mekanisme seperti preloading, secara signifikan meningkatkan kecepatan loading frame pertama untuk video pendek.

Prosedur

  1. Buat player.

    Buat player AliListPlayer. Kode berikut memberikan contohnya:

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

  2. Opsional: Atur listener.

    Saat membuat list player, Anda tidak perlu mengonfigurasi listener. Namun, tanpa listener, Anda tidak akan menerima notifikasi event dari player, seperti kegagalan pemutaran dan progres pemutaran. Kami menyarankan Anda mengatur listener.

    Player memungkinkan Anda mengatur beberapa listener. Kami menyarankan Anda mengatur listener onPlayerEvent dan onError.

    /**
     @brief Callback kesalahan.
     @param player Pointer player.
     @param errorModel Deskripsi kesalahan. Untuk informasi selengkapnya, lihat AliVcPlayerErrorModel.
     */
    - (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
        // Terjadi kesalahan dan pemutaran berhenti.
    }
    /**
     @brief Callback event player.
     @param player Pointer player.
     @param eventType Tipe event player. @see AVPEventType
     */
    -(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
        switch (eventType) {
            case AVPEventPrepareDone: {
                // Player 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:
                // Seeking selesai.
                break;
            case AVPEventLoopingStart:
                // Pemutaran loop dimulai.
                break;
            default:
                break;
        }
    }
    /**
     @brief Callback untuk posisi pemutaran saat ini.
     @param player Pointer player.
     @param position Posisi pemutaran video saat ini.
     */
    - (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // Perbarui progress bar.
    }
    /**
     @brief Callback untuk posisi buffering.
     @param player Pointer player.
     @param position Posisi buffering video saat ini.
     */
    - (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // Perbarui progres buffering.
    }
    /**
     @brief Callback untuk informasi track.
     @param player Pointer player.
     @param info Array informasi track. Untuk informasi selengkapnya, lihat AVPTrackInfo.
     */
    - (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
        // Dapatkan informasi multi-bitrate.
    }
    /**
     @brief Callback untuk menampilkan caption.
     @param player Pointer player.
     @param trackIndex Indeks track caption.
     @param subtitleID ID caption.
     @param subtitle String yang ditampilkan sebagai caption.
     */
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
        // Callback untuk menampilkan caption.
    }
    /**
     @brief Callback untuk menyembunyikan caption.
     @param player Pointer player.
     @param trackIndex Indeks track caption.
     @param subtitleID ID caption.
     */
    - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID {
        // Callback untuk menyembunyikan caption.
    }
    /**
     @brief Callback untuk snapshot.
     @param player Pointer player.
     @param image Citra.
     */
    - (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
        // Pratinjau dan simpan snapshot.
    }
    /**
     @brief Callback untuk penyelesaian pergantian track.
     @param player Pointer player.
     @param info Informasi setelah pergantian. Untuk informasi selengkapnya, lihat AVPTrackInfo.
     */
    - (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
        // Notifikasi hasil pergantian bitrate.
    }
    //...
  3. Atur jumlah video yang dipreloading.

    Anda dapat mengatur jumlah video yang dipreloading secara wajar untuk meningkatkan kecepatan loading frame pertama. Kode berikut memberikan contohnya:

    self.listPlayer.preloadCount = 2;
  4. Tambah atau hapus beberapa sumber video.

    List playback mendukung dua jenis sumber video: VidSts dan UrlSource. URL adalah URL pemutaran video. VID adalah ID file audio atau video di ApsaraVideo VOD. Kode berikut memberikan contohnya:

    • Url: URL pemutaran dapat berupa URL VOD pihak ketiga atau URL pemutaran di ApsaraVideo VOD.

      Anda dapat memanggil operasi GetPlayInfo untuk mendapatkan URL pemutaran Alibaba Cloud. Kami menyarankan Anda mengintegrasikan SDK sisi server ApsaraVideo VOD untuk mendapatkan URL pemutaran guna menghindari kerumitan penandatanganan URL. Untuk informasi selengkapnya tentang cara memanggil operasi API untuk mendapatkan URL pemutaran, lihat Developer Portal.

    • Vid: ID audio atau video. Anda dapat memperoleh ID dari konsol ApsaraVideo VOD (Pustaka Media > Audio/Video) atau dengan memanggil operasi API sisi server (SearchMedia) setelah file audio atau video diunggah.

    // Tambahkan sumber video berbasis VID.
    [self.listPlayer addVidSource:videoId uid:UUIDString];
    // Tambahkan sumber video berbasis URL.
    [self.listPlayer addUrlSource:URL uid:UUIDString];
    // Hapus sumber.
    [self.listPlayer removeSource:UUIDString];
    Catatan
    • `uid` adalah pengidentifikasi unik video yang digunakan untuk membedakan antar video. Jika video memiliki `uid` yang sama, dianggap sebagai video yang sama. Jika terjadi pencampuran aliran selama pemutaran, periksa apakah `uid` yang sama diatur pada halaman berbeda. `uid` dapat berupa string apa pun.

  5. Atur tampilan.

    Jika sumber video memiliki layar, Anda harus mengatur view di player untuk menampilkan video. Kode berikut memberikan contohnya:

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

    Setelah menambahkan satu atau beberapa sumber video, Anda dapat memanggil moveTo untuk memutar sumber video. Kode berikut memberikan contohnya:

    // Gunakan operasi API ini untuk pemutaran UrlSource.
    - (BOOL) moveTo:(NSString*)uid;
    // Gunakan operasi API ini untuk pemutaran VidSts. Anda harus meneruskan kredensial STS sementara dan pasangan AccessKey. Dapatkan terlebih dahulu. Untuk informasi selengkapnya, lihat Buat role RAM dan berikan izin akses sementara ke token 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, Anda dapat memanggil operasi API moveToPrev dan moveToNext untuk memutar video sebelumnya atau berikutnya. Sumber video dari moveTo digunakan sebagai anchor. Kode berikut memberikan contohnya:

    Catatan

    Jika Anda menggunakan view yang sama dan memanggil operasi seperti moveto atau moveToNext untuk mengganti sumber video, layar hitam berkedip mungkin muncul. Untuk mengatasi masalah ini, Anda dapat mengatur field clearShowWhenStop dari PlayerConfig ke false selama inisialisasi listPlayer, lalu panggil setConfig untuk menerapkan pengaturan.

    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 list playback yang lebih baik, kami menyarankan Anda menggunakan solusi drama video pendek kami. Untuk informasi selengkapnya, lihat Pengembangan sisi klien untuk drama video pendek.

Putar video dengan transparansi

Deskripsi fitur

ApsaraVideo Player SDK mendukung rendering saluran alpha untuk menciptakan efek dinamis hadiah transparan. Dalam skenario seperti saluran langsung, Anda dapat memutar efek dinamis hadiah transparan tanpa menghalangi konten di saluran langsung, sehingga secara signifikan meningkatkan pengalaman menonton dan interaksi pengguna.

Batasan

Fitur rendering transparan didukung di All-in-One SDK V6.8.0 ke atas atau ApsaraVideo Player SDK V6.9.0 ke atas.

Keunggulan

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

  1. Kualitas animasi lebih baik: Video MP4 dapat mempertahankan kualitas animasi asli, termasuk detail dan warna. Dibandingkan dengan format lain seperti APNG atau IXD, MP4 dapat lebih akurat mengembalikan efek animasi yang dibuat oleh desainer.

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

  3. Kompatibilitas lebih tinggi: MP4 adalah format video universal yang didukung luas di berbagai perangkat dan browser, memungkinkan pemutaran dan penontonan efek hadiah di perangkat utama.

  4. Efisiensi pengembangan lebih tinggi: Solusi teknis menggunakan video MP4 sebagai efek hadiah relatif sederhana. Developer tidak perlu meneliti dan mengimplementasikan logika parsing dan rendering yang kompleks, sehingga dapat fokus pada fitur lain dan meningkatkan efisiensi pengembangan.

Contoh kode

Operasi API baru berikut ditambahkan untuk mengatur mode alpha (posisi saluran alpha dalam materi video: atas, bawah, kiri, atau kanan). Nilai default adalah None.

Catatan
  • Posisi saluran alpha dalam materi harus konsisten dengan pengaturan parameter `setAlphaRenderMode`.

  • Ukuran view player harus proporsional dengan resolusi materi.

/**
 @brief Mode rendering alpha. Mendukung alpha di kanan, kiri, atas, dan bawah. Nilai default adalah none.
 @see AVPAlphaRenderMode
 */
@property(nonatomic) AVPAlphaRenderMode alphaRenderMode;
//--------------Penggunaan View-------------
// Untuk View, Anda perlu mengatur clearColor.
@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 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];

// Opsional: Jika terjadi masalah koneksi setelah pemutaran instance tunggal selesai, Anda dapat mengosongkan 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

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

Catatan

Saat ini, hanya fitur warna latar, mode penskalaan, dan Picture-in-Picture (PiP) yang didukung.

Item konfigurasi

/**
 @brief Tipe rendering video. 0 menunjukkan renderer default. 1 menunjukkan renderer campuran. Nilai default: 0.
 */
@property(nonatomic, assign) int videoRenderType;

Contoh penggunaan

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

Caption eksternal

Catatan

Untuk contoh kode detail, lihat modul Demo Subtitle Eksternal dan Pergantian (ExternalSubtitle) di API-Example. Proyek ini adalah proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.

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

Kode berikut memberikan contohnya:

  1. Buat view untuk menampilkan caption.

    Anda dapat membuat view berbeda untuk format caption berbeda.

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

    // Caption eksternal ditambahkan.
    - (void)onSubtitleExtAdded:(AliPlayer*)player trackIndex:(int)trackIndex URL:(NSString *)URL {}
    // Callback untuk informasi header caption.
    - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header{}
    // Callback untuk menampilkan caption.
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
     subTitleLabel.text =subtitle;
     subTitleLabel.tag =subtitleID;
    }
    // Callback untuk menyembunyikan caption.
    - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID{
      [subTitleLabel removeFromSuperview];
    }
  3. Tambahkan caption.

    [self.player addExtSubtitle:URL];
  4. Ganti caption.

    [self.player selectExtSubtitle:trackIndexenable:YES];

Pemutaran hanya audio

Anda dapat menonaktifkan pemutaran video untuk mencapai pemutaran hanya audio. Anda harus mengonfigurasi PlayerConfig sebelum menyiapkan player.

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

Ganti antara decoding software dan hardware

ApsaraVideo Player SDK untuk iOS menyediakan kemampuan decoding hardware untuk H.264 dan H.265. SDK juga menyediakan sakelar enableHardwareDecoder yang diaktifkan secara default. Jika inisialisasi decoding hardware gagal, player secara otomatis beralih ke decoding software untuk memastikan pemutaran video normal. Kode berikut memberikan contohnya:

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

Jika player secara otomatis beralih dari decoding hardware ke decoding software, callback onPlayerEvent dipanggil. Kode berikut memberikan contohnya:

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

Pemutaran H.265 adaptif

Jika model perangkat saat ini berada dalam pustaka model daftar hitam H.265 berbasis cloud atau jika decoding hardware aliran H.265 gagal, fallback adaptif dipicu. Proses fallback sebagai berikut: Jika aliran cadangan H.264 diatur, aliran cadangan H.264 diputar secara otomatis. Jika tidak ada aliran cadangan H.264 yang diatur, player secara otomatis fallback ke decoding software H.265.

Catatan
  • Fitur ini hanya diaktifkan setelah Anda mengaktifkan layanan bernilai tambah decoding adaptif yang dikombinasikan dengan cloud dan klien. Anda harus mengirimkan formulir Yida untuk mengajukan lisensi.

  • Layanan bernilai tambah decoding adaptif yang dikombinasikan dengan cloud dan klien terutama mencakup: 1. Pengiriman dinamis data kompatibilitas decoding hardware berbasis cloud. 2. Fallback adaptif dari aliran H.265 ke aliran H.264.

  • SDK masih dapat secara otomatis beralih ke decoding software saat decoding hardware gagal, bahkan jika layanan bernilai tambah tidak diaktifkan.

Kode berikut menunjukkan cara mengatur aliran cadangan:

// Lapisan aplikasi memelihara peta yang menyimpan semua pasangan kunci-nilai URL asli dan URL cadangan. Saat beralih, kueri URL cadangan di peta berdasarkan URL asli.
NSString* getBackupUrlCallback(AVPBizScene scene, AVPCodecType codecType, NSString* oriurl){
    NSMutableDictionary *globalMap = [AliPlayerViewController getGlobalBackupUrlMap];
    NSString *backupUrl = globalMap[oriurl];
    return backupUrl; 
}

[AliPlayerGlobalSettings setAdaptiveDecoderGetBackupURLCallback:getBackupUrlCallback];

Ganti definisi video secara adaptif berdasarkan kondisi jaringan

Catatan
  • Anda dapat menghasilkan aliran video adaptif multi-bitrate HLS dengan mentranskode menggunakan kelompok template transkoding pengemasan video di ApsaraVideo VOD. Untuk informasi selengkapnya, lihat Konfigurasikan adaptive bitrate streaming untuk ApsaraVideo VOD.

  • Jika Anda memutar aliran adaptif yang ditranskode oleh ApsaraVideo VOD menggunakan metode Vid, Anda harus mengatur daftar definisi pemutaran default ke AUTO untuk mendapatkan dan memutar aliran video adaptif. Jika tidak, player memilih aliran video definisi rendah untuk pemutaran berdasarkan logika default. Untuk informasi selengkapnya tentang urutan pemutaran default definisi, lihat Jika video ditranskode menjadi beberapa definisi, definisi mana yang diputar oleh SDK player secara default?. Kode berikut menunjukkan cara menentukan daftar definisi untuk pemutaran VidAuth:

    AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
    authSource.definitions = @"AUTO";

ApsaraVideo Player SDK untuk iOS mendukung aliran video adaptif multi-bitrate HLS dan DASH. Setelah prepare berhasil, Anda dapat memanggil getMediaInfo untuk mendapatkan informasi setiap aliran bitrate, yaitu TrackInfo. Kode berikut memberikan contohnya:

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

Selama pemutaran, Anda dapat memanggil metode selectTrack player untuk mengganti aliran bitrate pemutaran. Jika nilainya SELECT_AVPTRACK_TYPE_VIDEO_AUTO, aliran tersebut bersifat adaptif multi-bitrate. Kode berikut memberikan contohnya:// Ganti bitrate. [self.player selectTrack:track.trackIndex]; // Ganti bitrate dan adaptasi. [self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];

// Ganti bitrate.
[self.player selectTrack:track.trackIndex];
// Aktifkan adaptive bitrate streaming.
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];

Hasil pergantian dikembalikan dalam callback listener onTrackChanged. Kode berikut memberikan contohnya:

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

Opsional: Sebelum memanggil metode selectTrack player untuk mengganti aliran bitrate pemutaran ke ABR, Anda dapat mengatur batas atas definisi untuk pergantian ABR melalui config. Hal ini mencegah player secara otomatis beralih ke bitrate yang tidak diharapkan. Kode berikut memberikan contohnya: (Kami menyarankan Anda memanggil kode berikut sebelum player memanggil metode prepare atau list player memanggil metode moveTo agar berlaku.)

AVPConfig *config = [self.player getConfig];
config.maxAllowedAbrVideoPixelNumber = 921600; // Atur jumlah maksimum piksel untuk definisi ABR menjadi 921600 (lebar × tinggi = 1280 × 720), sehingga jumlah piksel untuk definisi yang dapat dialihkan ABR kurang dari atau sama dengan nilai ini.
[self.player setConfig:config];

Ambil snapshot

ApsaraVideo Player SDK untuk iOS menyediakan fitur untuk mengambil snapshot video saat ini. Fitur ini diimplementasikan oleh operasi API snapShot. Data asli ditangkap, dikonversi ke bitmap, lalu dikembalikan. Antarmuka callback adalah onCaptureScreen. Kode berikut memberikan contohnya:

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

Snapshot tidak termasuk antarmuka.

Pratinjau

ApsaraVideo Player SDK untuk iOS, bersama dengan konfigurasi ApsaraVideo VOD, dapat mengimplementasikan fitur pratinjau. SDK mendukung metode pemutaran VidSts dan VidAuth (direkomendasikan untuk ApsaraVideo VOD). Untuk informasi selengkapnya tentang cara mengonfigurasi dan menggunakan fitur pratinjau, lihat Pratinjau video.

Setelah mengonfigurasi fitur pratinjau, Anda dapat menggunakan metode setPreviewTime dari antarmuka VidPlayerConfigGen untuk mengatur durasi pratinjau untuk player. Kode berikut menunjukkan contoh untuk pemutaran VidSts:

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

Saat Anda mengatur durasi pratinjau dan memutar video menggunakan ApsaraVideo Player SDK untuk iOS, server tidak mengembalikan konten video lengkap. Sebaliknya, server mengembalikan konten untuk periode pratinjau.

Catatan

VidPlayerConfigGen mendukung pengaturan parameter permintaan yang didukung oleh server. Untuk informasi selengkapnya, lihat Parameter permintaan.

Atur Referer

ApsaraVideo Player SDK untuk iOS memungkinkan Anda mengatur Referer. Bersama dengan daftar hitam dan daftar putih Referer di konsol, Anda dapat mengontrol izin akses. Anda dapat menggunakan metode AVPConfig untuk mengatur Referer permintaan. Kode berikut menunjukkan contoh untuk ApsaraVideo Player SDK untuk iOS:

// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur Referer.
config.referer = referer;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];

Atur User-Agent

ApsaraVideo Player SDK untuk iOS menyediakan AVPConfig untuk mengatur User-Agent (UA) permintaan. Setelah mengatur UA, permintaan player menyertakan informasi UA. Kode berikut memberikan contohnya:

// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur User-Agent.
config.userAgent = userAgent;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];

Konfigurasikan waktu dan jumlah retry jaringan

Anda dapat mengatur timeout jaringan dan jumlah retry untuk ApsaraVideo Player SDK untuk iOS menggunakan metode AVPConfig. Kode berikut memberikan contohnya:

// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur timeout jaringan dalam milidetik.
config.networkTimeout = 5000;
// Atur jumlah upaya retry saat timeout. Interval setiap retry adalah networkTimeout. networkRetryCount=0 berarti tidak ada retry, dan kebijakan retry ditentukan oleh aplikasi. Nilai default adalah 2.
config.networkRetryCount = 2;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];
Catatan
  • Jika Anda mengatur networkRetryCount, player akan mencoba ulang sebanyak networkRetryCount kali jika terjadi masalah jaringan dan menyebabkan status loading. Interval setiap retry adalah networkTimeout.

  • Jika status loading berlanjut setelah beberapa kali retry, event onError dipanggil. Dalam kasus ini, AVPErrorModel.code adalah ERROR_LOADING_TIMEOUT.

  • Jika networkRetryCount diatur ke 0, saat waktu retry jaringan habis, player memanggil onPlayerEvent dengan parameter eventWithString diatur ke EVENT_PLAYER_NETWORK_RETRY. Pada titik ini, Anda dapat memanggil metode reload player untuk memuat ulang jaringan atau melakukan tindakan lain.

Konfigurasikan kontrol cache dan latensi

Kontrol cache sangat penting untuk player. Konfigurasi yang tepat dapat secara efektif mempercepat loading frame pertama dan mengurangi tersendat. ApsaraVideo Player SDK untuk iOS menyediakan antarmuka untuk mengatur kontrol cache dan latensi melalui AVPConfig. Kode berikut memberikan contohnya:

// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Latensi maksimum. Catatan: Ini efektif untuk streaming langsung. Saat latensi tinggi, SDK player akan melakukan sinkronisasi frame untuk memastikan latensi berada dalam rentang ini.
config.maxDelayTime = 5000;
// Durasi buffer maksimum dalam milidetik. Player memuat paling banyak durasi data buffered ini setiap kali.
config.maxBufferDuration = 50000;
// Durasi buffer tinggi dalam milidetik. Saat data sedang dimuat karena kondisi jaringan buruk, jika durasi buffer yang dimuat mencapai nilai ini, status loading berakhir.
config.highBufferDuration = 3000;
// Durasi buffer awal dalam milidetik. Semakin pendek waktu ini diatur, semakin cepat frame pertama dimuat. Namun, juga dapat menyebabkan player memasuki status loading segera setelah pemutaran dimulai.
config.startBufferDuration = 500;
// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];
Penting
  • Hubungan antara tiga durasi buffer harus: startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration.

  • Jika durasi buffer maksimum (mMaxBufferDuration) lebih dari 5 menit, sistem secara default menggunakan 5 menit untuk mencegah pengecualian memori yang disebabkan oleh buffer terlalu besar.

Atur Header HTTP

Menggunakan metode AVPConfig, Anda dapat menambahkan parameter header HTTP ke permintaan player. Kode berikut memberikan contohnya:

// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Definisikan header.
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
// Misalnya, saat menggunakan HTTPDNS, Anda perlu mengatur Host.
[httpHeaders addObject:@"Host:example.com"];
// Atur header.
config.httpHeaders = httpHeaders;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];

Picture-in-Picture (PiP)

Catatan

Untuk contoh kode detail, lihat modul Picture-in-Picture (PictureInPicture) di API-Example. Proyek ini adalah proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.

Catatan
  • Persyaratan lingkungan untuk fitur PiP: iOS 15 ke atas, ApsaraVideo Player SDK untuk iOS V5.4.9.0 ke atas.

  • Versi ApsaraVideo Player SDK untuk iOS sebelum 5.5.2.0 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 pengaturan delegate PiP dari luar, yang memungkinkan pengembangan fitur PiP yang lebih personal.

  • Untuk mengaktifkan fitur PiP, pastikan fungsi PiP diaktifkan di pengaturan ponsel Anda (Settings > General > Picture in Picture).

Enable PiP

Setelah mengaktifkan fitur PiP, video terus diputar di jendela PiP kecil saat aplikasi dipindahkan ke latar belakang. Saat aplikasi dibawa kembali ke latar depan, video melanjutkan format pemutaran aslinya. Fitur PiP dikontrol oleh sakelar setPictureInPictureEnable. Untuk mengaktifkan fitur PiP, Anda perlu melakukannya dalam status AVPEventPrepareDone. Kode berikut menunjukkan contoh cara mengaktifkan fitur PiP:

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

Saat player memanggil stop untuk menghentikan pemutaran, jendela PiP tidak lagi diperlukan. Anda harus terlebih dahulu menonaktifkan PiP menggunakan sakelar setPictureInPictureEnable, lalu panggil stop.

Set the PiP delegate

Bagian berikut hanya memberikan beberapa contoh kode umum untuk interaksi antara jendela Picture-in-Picture (PiP) dan jendela player. Contoh ini mencakup logika untuk tombol jeda, putar, maju cepat, dan mundur cepat di jendela PiP, serta pemutaran ulang. Untuk detail tentang metode delegate, lihat konten file header AliPlayerPictureInPictureDelegate.h di AliyunPlayer.framework folder SDK di Demo SDK Player.

  1. Atur delegate PiP.

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

    1. Tambahkan variabel global untuk mengontrol perubahan status player.

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

      pipController harus dimodifikasi dengan weak atau assign. Jika Anda menggunakan assign, perhatikan kapan variabel diatur ke null.

    2. Saat mendengarkan callback antarmuka perubahan status event pemutaran, Anda harus secara aktif memanggil metode berikut untuk memperbarui status terkait controller PiP.

      - (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
          self.currentPlayerStatus = newStatus;
      
        if (_pipController) {
           [self.pipController invalidatePlaybackState];
         }
      }
    3. Saat mendengarkan antarmuka callback event pemutaran, Anda harus secara aktif memanggil metode berikut untuk memperbarui status terkait controller 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) {
          // Seeking selesai.
            if (_pipController) {
             [self.pipController invalidatePlaybackState];
          }
        }
      }
    4. Atur listener.

      • Dengarkan callback yang dipanggil sebelum PiP dimulai.

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

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

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

        /**
         @brief Memberi tahu controller PiP tentang rentang waktu yang dapat diputar saat ini.
         @param pictureInPictureController Controller PiP.
         @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);
            }
        }
      • Dengarkan callback yang menunjukkan apakah video dijeda dalam mode PiP.

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

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

      • Dengarkan callback yang dipanggil saat pengguna menekan tombol maju cepat atau mundur cepat dalam mode PiP dan sinkronkan status player.

        /**
         @brief Pengguna menekan tombol maju cepat atau mundur cepat.
         @param pictureInPictureController Controller PiP.
         @param skipInterval Interval waktu untuk maju cepat atau mundur cepat.
         @param completionHandler Closure yang harus dipanggil untuk menunjukkan bahwa operasi seeking 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 yang dipanggil saat pengguna menekan tombol jeda atau putar dalam mode PiP.

        /**
         @brief Pengguna menekan tombol jeda dalam mode PiP.
         @param pictureInPictureController Controller PiP.
         @param playing Apakah video 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 tambahan dalam pernyataan if berikut.
              if (self.currentPlayerStatus == AVPStatusCompletion) {
                 [self.player seekToTime:0 seekMode:AVP_SEEKMODE_ACCURATE];
              }
        
              [self.player start];
              self.isPipPaused = NO;
          }
          [pictureInPictureController invalidatePlaybackState];
        }

Picture-in-Picture dalam aplikasi

Saat menggunakan fitur PiP, secara default merupakan PiP di luar aplikasi. Untuk mengimplementasikan PiP dalam aplikasi, Anda dapat terlebih dahulu menggunakan operasi API berikut untuk menentukan apakah fitur PiP diaktifkan:

/**
 @brief Menunjukkan apakah PiP diaktifkan.
 @param pictureInPictureController Controller PiP.
 @param isEnable Apakah PiP diaktifkan.
 */
- (void)pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *)pictureInPictureController isEnable:(BOOL)isEnable;

Saat fitur PiP diaktifkan, Anda dapat menonaktifkan start otomatis PiP dan mengontrol aktivasi fitur secara manual. Kode berikut memberikan contohnya:

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

Fallback streaming langsung RTS

Catatan

Untuk contoh kode lengkap, lihat modul Streaming Langsung RTS (RtsLiveStream) di API-Example. Proyek ini merupakan proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.

Untuk informasi selengkapnya, lihat Streaming langsung RTS.

Ganti antara saluran suara kiri dan kanan

ApsaraVideo Player SDK untuk iOS menggunakan properti outputAudioChannel untuk mengatur saluran audio output. Anda dapat beralih ke saluran kiri atau kanan jika sumber input berupa dual-channel. Pengaturan ini tidak berpengaruh jika sumber input berupa single-channel.

Catatan

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

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

Atur warna latar video

ApsaraVideo Player SDK untuk iOS memungkinkan Anda mengatur warna latar pemutar saat rendering. Bagian berikut menampilkan contoh API dan petunjuk penggunaannya:

Contoh API

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

Petunjuk Penggunaan

// Parameter adalah data heksadesimal 8-bit. Data 8-bit dibagi menjadi kelompok dua, mewakili A (transparansi alpha), R (merah), G (hijau), dan B (biru) secara berurutan.
// Misalnya, 0x0000ff00 merepresentasikan hijau.
[self.player setVideoBackgroundColor:0x0000ff00]

Tentukan nama domain pemutaran untuk VidAuth

Dengan metode VidAuth, Anda dapat menentukan bidang seperti nama domain yang sesuai dengan VID. Untuk detail bidang yang didukung, lihat Parameter Permintaan GetPlayInfo. Bagian berikut menunjukkan operasi API dan petunjuk penggunaannya:

Contoh API

/**
 @brief Putar menggunakan VID + PlayAuth. Untuk informasi selengkapnya, lihat https://www.alibabacloud.com/help/en/vod/user-guide/use-playback-credentials-to-play-videos
 @param source Tipe input AVPVidAuthSource.
 @see AVPVidAuthSource
 */
- (void)setAuthSource:(AVPVidAuthSource*)source;

Petunjuk Penggunaan

Anda dapat menambahkan bidang playDomain melalui addVidPlayerConfigByStringValue dari antarmuka VidPlayerConfigGenerator.

VidPlayerConfigGenerator* gen = [[VidPlayerConfigGenerator alloc]init];
// Tambahkan bidang playDomain. Untuk bidang yang dapat ditambahkan, lihat
// https://www.alibabacloud.com/help/en/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 V6.12.0, ApsaraVideo Player SDK mendukung decoding latar belakang. Saat fitur ini diaktifkan, player tetap dapat mendekode dan memutar aliran video serta memicu callback meskipun berada di latar belakang. Kode berikut menunjukkan contoh penggunaannya:

// 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 dekode H.266

H.266, juga dikenal sebagai Versatile Video Coding (VVC), merupakan standar pengkodean video generasi baru yang secara signifikan mengurangi bitrate tanpa mengorbankan kualitas gambar. Untuk mengoptimalkan performa dan mengontrol ukuran SDK utama, kemampuan decoding H.266 dikemas secara terpisah sebagai plugin yang mendukung integrasi sesuai kebutuhan.

Prasyarat

  1. ApsaraVideo Player SDK atau All-in-One SDK versi 7.6.0 ke atas.

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

  3. ApsaraVideo Player dengan plugin decoding H.266 hanya mendukung pemutaran video H.266 yang ditranskode oleh Transkode Alibaba Cloud.

Integrasikan plugin

ApsaraVideo Player SDK

Integrasi CocoaPods (direkomendasikan)

Pada file Podfile, tambahkan dependensi untuk versi plugin yang ditentukan:

Catatan

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

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

Integrasi lokal

Anda dapat mengunduh SDK player iOS terbaru, menambahkan vvcCodecPlugin.framework ke bagian Frameworks, Libraries, and Embedded Content, mengatur Embed menjadi Embed & Sign, serta mengonfigurasi Framework Search Paths yang sesuai. Untuk informasi selengkapnya, lihat Integrasi Lokal.

All-in-One SDK

Integrasi CocoaPods (direkomendasikan)

Pada file Podfile, tambahkan dependensi untuk versi plugin yang ditentukan:

// x.x.x harus konsisten dengan nomor versi All-in-One SDK yang Anda gunakan.
pod 'AliVCSDK_Standard/AliPlayerSDK_iOS_VVC_CODEC', 'x.x.x'

Integrasi lokal

Anda dapat mengunduh dan mengekstrak paket all-in-one iOS versi terbaru. Tambahkan plugins/vvcCodecPlugin.framework ke bagian Frameworks, Libraries, and Embedded Content proyek Anda, atur Embed menjadi Embed & Sign, lalu konfigurasi Framework Search Paths. Untuk informasi selengkapnya, lihat Integrasikan SDK dengan menambahkan file lokal.

Aktifkan plugin

Catatan

Mulai dari ApsaraVideo Player SDK untuk iOS versi 7.7.0, plugin diaktifkan secara default dan tidak perlu diaktifkan secara manual.

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

Kode kesalahan terkait

Untuk informasi selengkapnya mengenai kode kesalahan terkait plugin decoding H.266, lihat FAQ Umum untuk player di berbagai klien.

Segarkan otomatis sumber pemutaran

Mengaktifkan fitur segarkan otomatis untuk sumber pemutaran mencegah gangguan akibat kedaluwarsa berdasarkan mekanisme penandatanganan. Fitur ini memicu listener untuk memperoleh alamat baru saat sumber menjadi tidak valid, sehingga menjamin pemutaran video yang berkelanjutan dan lancar.

Prasyarat

  1. ApsaraVideo Player SDK atau All-in-One SDK versi 7.9.0 ke atas.

  2. Anda menggunakan sumber VidAuth untuk pemutaran atau layanan Anda telah mengonfigurasi penandatanganan URL.

Sumber VidAuth

Contoh API

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

 Metode ini dipicu saat player mendeteksi bahwa sumber VidAuth saat ini telah kedaluwarsa.
 Anda dapat menyegarkan 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 memberikan objek `VidAuth` yang valid untuk memperbarui player.
 */
-(void)setOnVidAuthExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;

Deskripsi komponen

Deskripsi Komponen

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

 Protokol ini memberi tahu developer saat player meminta penyegaran sumber pemutaran, seperti saat resource
 telah kedaluwarsa atau perlu diperbarui. Metode dalam protokol ini dipanggil untuk memberikan hasil penyegaran kepada developer,
 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 player saat operasi penyegaran berhasil.
 
 @param newSource Objek sumber pemutaran baru yang berisi informasi yang diperbarui.

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

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

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

@end

Petunjuk penggunaan

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

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

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

Sumber UrlSource

Contoh API

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

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

 @note Untuk informasi tentang mengonfigurasi mekanisme penandatanganan URL, lihat dokumentasi resmi 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.
 Gunakan callback ini untuk memberikan objek `URLSource` yang valid untuk memperbarui player.
 */
-(void)setOnURLSourceExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;

Deskripsi komponen

Deskripsi Komponen

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

 Protokol ini memberi tahu developer saat player meminta penyegaran sumber pemutaran, seperti saat resource
 telah kedaluwarsa atau perlu diperbarui. Metode dalam protokol ini dipanggil untuk memberikan hasil penyegaran kepada developer,
 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 player saat operasi penyegaran berhasil.
 
 @param newSource Objek sumber pemutaran baru yang berisi informasi yang diperbarui.

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

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

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

@end

Petunjuk 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 mengandung 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 penandatanganan 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 adalah 3600 detik
        NSTimeInterval newExpireTime = [[NSDate date] timeIntervalSince1970] + validTime;

         // 3. Gunakan CdnAuthUtil untuk menghasilkan URL bertanda tangan baru (Tipe 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 utilitas tambahan

Contoh ini menggunakan penandatanganan tipe A.

Fungsi Utilitas Tambahan

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

@implementation CdnAuthUtil

#pragma mark - Metode Auth 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 - Helper Pribadi: 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 - Helper Pribadi: Pencocokan Regex
+ (NSDictionary *)matchUri:(NSString *)uri {
    NSError *error = nil;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^(https?://)?([^/?]+)(/[^?]*)?(\\?.*)?$"
                                  options:0
                                  error:&error];
    if (error) {
        NSLog(@"Kesalahan regex: %@", 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

Performa

Atur skenario pemutaran

Mengatur skenario pemutaran secara otomatis mengonfigurasi parameter optimal, seperti pengaturan buffer dan toggle fitur, berdasarkan skenario tersebut. Pengaturan ini juga kompatibel dengan pengaturan parameter kustom yang dikonfigurasi menggunakan antarmuka setConfig. Pengaturan kustom memiliki prioritas lebih tinggi.

Catatan
  • Setelah mengatur skenario pemutaran, Anda dapat menggunakan antarmuka getConfig untuk melihat pengaturan parameter.

Contoh API

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

Skenario pemutaran

typedef enum _AVPScene {
    /**
     * Skenario: Tidak ada
     */
    SceneNone,
    /**
     * Skenario video panjang: berlaku untuk video lebih dari 30 menit
     */
    SceneLong,
    /**
     * Skenario video sedang: berlaku untuk video antara 5 hingga 30 menit
     */
    SceneMedium,
    /**
     * Skenario video pendek: berlaku untuk video antara 0 detik hingga 5 menit
     */
    SceneShort,
    /**
     * Skenario streaming langsung
     */
    SceneLive,
    /**
     * Skenario langsung RTS
     */
    SceneRTSLive
} AVPScene;

Petunjuk penggunaan

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

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

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

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

Pre-rendering

ApsaraVideo Player SDK untuk iOS mendukung rendering cepat frame pertama sebelum pemutaran dimulai, yang dapat meningkatkan kecepatan loading frame pertama.

Catatan
  1. Fitur ini dinonaktifkan secara default.

  2. Setelah fitur ini diaktifkan, memengaruhi urutan pemicu event keberhasilan persiapan dan rendering frame pertama. Jika fitur dinonaktifkan, event keberhasilan persiapan dipanggil balik sebelum event rendering frame pertama. Jika fitur diaktifkan, rendering frame pertama mungkin dipicu sebelum event keberhasilan persiapan karena perbedaan kecepatan decoding dan rendering. Namun, hal ini tidak memengaruhi pemutaran.

Kode berikut memberikan contohnya:

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

Cache lokal

Catatan

Untuk contoh kode detail, lihat modul Preload Video (PreloadUrl) di API-Example. Proyek ini adalah proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.

ApsaraVideo Player SDK untuk iOS menyediakan fitur cache lokal. Fitur ini meningkatkan kecepatan loading frame pertama, kecepatan seek, dan mengurangi tersendat saat pengguna memutar video berulang kali. Fitur ini juga membantu menghemat trafik.

Enable local caching

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

/**
 * Aktifkan cache lokal. Setelah diaktifkan, video akan di-cache ke file lokal.
 * @param enable: Sakelar fitur cache lokal. true: aktifkan, false: nonaktifkan. Default adalah false.
 * @param maxBufferMemoryKB: Ditinggalkan sejak V5.4.7.1, tidak berpengaruh.
 * @param localCacheDir: Harus diatur. 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: Ditinggalkan 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 akses terakhir item cache, hingga total kapasitas kurang dari atau sama dengan kapasitas maksimum.
 @param freeStorageMB: Ruang disk bebas 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 ruang bebas lebih besar dari atau sama dengan nilai ini atau semua cache dihapus.
 */
[AliPlayerGlobalSettings setCacheFileClearConfig:0 maxCapacityMB:0 freeStorageMB:0];

/**
 * Callback untuk mendapatkan nilai hash URL yang dimuat, digunakan sebagai ID unik untuk URL. Harus dipastikan bahwa setiap URL unik.
 */

// 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 video memiliki parameter autentikasi, parameter autentikasi berubah selama caching lokal dan pemutaran. Untuk meningkatkan rasio hit cache untuk URL yang sama dengan autentikasi berbeda, Anda dapat menghapus parameter autentikasi dari URL sebelum menghitung nilai hash (misalnya, MD5) melalui antarmuka setCacheUrlHashCallback. Misalnya, jika URL pemutaran video dengan parameter autentikasi adalah http://****.mp4?aaa, gunakan http://****.mp4 untuk menghitung nilai hash saat memuat. Namun, jika video adalah video m3u8 terenkripsi dan keyURL-nya diproses dengan menghapus parameter autentikasi sebelum menghitung nilai hash, cache video berbeda mungkin mengenai kunci yang sama, yang menyebabkan kegagalan pemutaran. Solusi: Dalam callback setCacheUrlHashCallback, Anda dapat melakukan pemeriksaan nama domain dan hanya menghapus parameter autentikasi untuk domain pemutaran (http(s)://xxxxx.m3u8?aaaa), dan tidak menghapusnya untuk domain yang sesuai dengan keyURL (http(s)://yyyyy?bbbb).进阶功能-本地缓存.png

  • Jika server mendukung protokol HTTP dan HTTPS, tetapi protokol berbeda mengarah ke file media yang sama, Anda dapat menghapus atau menyatukan header permintaan sebelum menghitung nilai MD5. Misalnya:

    • Jika URL pemutaran video adalah https://****.mp4 dan http://****.mp4, Anda dapat menggunakan ****.mp4 untuk menghitung nilai MD5 saat memuat.

    • Jika URL pemutaran video adalah https://****.mp4, Anda dapat menyatukannya ke http://****.mp4 sebelum menghitung nilai MD5 saat memuat.

  • Untuk ApsaraVideo Player SDK V5.5.4.0 ke atas, jika URL pemutaran video memiliki parameter penandatanganan dan protokol pemutaran adalah HLS, Anda dapat mengatur field AVPConfig.enableStrictAuthMode untuk memilih mode penandatanganan berbeda. Nilai default adalah false untuk versi 5.5.4.0 hingga 6.21.0. Nilai default adalah true untuk versi 7.0.0 ke atas.

    • Penandatanganan tidak ketat (false): Penandatanganan juga di-cache. Jika hanya bagian media yang di-cache terakhir kali, player menggunakan penandatanganan yang di-cache untuk memulai permintaan saat memutar bagian yang tidak di-cache berikutnya. Jika periode validitas penandatanganan URL sangat singkat, hal ini menyebabkan pengecualian pemutaran.

    • Penandatanganan ketat (true): Penandatanganan tidak di-cache. Penandatanganan dilakukan setiap kali pemutaran dimulai. Hal ini menyebabkan pemutaran gagal tanpa koneksi jaringan.

Enable or disable local caching for a single URL

Jika Anda ingin menonaktifkan cache lokal untuk URL tunggal, Anda dapat mengaturnya di konfigurasi player. Kode berikut memberikan contohnya:

// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Apakah akan mengaktifkan cache lokal untuk URL pemutaran. Nilai default adalah true. Saat cache lokal diaktifkan di AliPlayerGlobalSettings, dan cache lokal juga diaktifkan di sini (diatur ke true), cache lokal untuk URL ini akan berlaku. Jika diatur ke false di sini, cache lokal untuk URL ini dinonaktifkan.
config.enableLocalCache = false;
....// Pengaturan lainnya.

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

Use the default cache path

Jika Anda ingin menggunakan jalur default untuk caching, Anda dapat melakukan pengaturan berikut melalui AliPlayerGlobalSettings.

[AliPlayerGlobalSettings enableLocalCache:true];

Preloading

ApsaraVideo Player SDK untuk iOS menyediakan fitur preloading, yang merupakan peningkatan dari fitur caching lokal. Dengan mengatur ukuran memori yang ditempati oleh cache video, Anda dapat lebih meningkatkan kecepatan loading frame pertama video.

Batasan fitur preloading sebagai berikut:

  • Saat ini mendukung pemuatan file media tunggal seperti MP4, MP3, FLV, dan HLS.

Catatan

Secara default, ApsaraVideo Player SDK untuk iOS menyediakan kemampuan penjadwalan otomatis untuk sumber daya jaringan selama preloading. Hal ini untuk mengurangi dampak permintaan jaringan preloading terhadap permintaan jaringan video yang sedang diputar. Kebijakan penjadwalan otomatis adalah bahwa preloading hanya diizinkan membuat permintaan setelah buffer video yang sedang diputar mencapai ambang batas tertentu. Untuk mengontrol permintaan real-time untuk preloading, Anda dapat menonaktifkan kebijakan ini menggunakan metode berikut:

[AliPlayerGlobalSettings enableNetworkBalance:false];
  1. Aktifkan fitur caching lokal. Untuk informasi selengkapnya, lihat Caching lokal.

  2. Atur sumber data.

    VidAuth (direkomendasikan)

    AVPVidAuthSource* vidAuthSource = [[AVPVidAuthSource alloc] init];
    [vidAuthSource setVid:@"Informasi Vid"]; // Wajib. ID video.
    [vidAuthSource setPlayAuth:@"<yourPlayAuth>"]; // Wajib. Kredensial pemutaran. Anda perlu memanggil operasi API GetVideoPlayAuth ApsaraVideo VOD untuk menghasilkannya.
    [vidAuthSource setRegion:@"Wilayah akses"]; // Untuk SDK player V5.5.5.0 ke atas, parameter ini ditinggalkan. Anda tidak perlu mengatur wilayah; player akan menguraikannya secara otomatis. Untuk SDK player sebelum V5.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.
    [vidStsSource setRegion:@"Wilayah akses"]; // Wajib. Wilayah akses ApsaraVideo VOD, default adalah cn-shanghai.
    [vidStsSource setSecurityToken: @"<yourSecurityToken>"]; // Wajib. Token STS. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya.
    [vidStsSource setAccessKeySecret: @"<yourAccessKeySecret>"]; // Wajib. Rahasia AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya.
    [vidStsSource setAccessKeyId: @"<yourAccessKeyId>"]; // Wajib. ID AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya.
    [vidStsSource setQuality:@"Definisi yang dipilih"]; // "AUTO" merepresentasikan bitrate adaptif.

    UrlSource

    NSString* url = @"URL Pemutaran"; // Wajib. URL pemutaran, yang dapat berupa URL VOD pihak ketiga atau URL pemutaran di ApsaraVideo VOD.
    AVPUrlSource* urlSource = [[AVPUrlSource alloc]urlWithString:url];
  3. Atur parameter tugas.

    Catatan

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

    AVPPreloadConfig *config = [[AVPPreloadConfig alloc]init];
    // Atur bitrate preload untuk aliran multi-bitrate.
    [config setDefaultBandWidth:400000];
    // Atur resolusi preload untuk aliran multi-bitrate.
    [config setDefaultResolution:640 * 480];
    // Atur kualitas preload untuk aliran multi-bitrate.
    [config setDefaultQuality:@"FD"];
    // Atur 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 dan tambahkan ke instans MediaLoaderV2 untuk memulai 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. Opsional: 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. Opsional: Hapus file yang dimuat.

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

Preloading dinamis

Kebijakan preloading dinamis memungkinkan integrator mengontrol cache video yang sedang diputar dan jumlah serta cache video yang dipreloading, menyeimbangkan pengalaman pemutaran dengan overhead biaya untuk kebutuhan bisnis.

Perluas untuk melihat kode

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

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

// Konfigurasikan jumlah preload, mendukung kedua arah.
// 1 adalah jumlah preload mundur, 3 adalah jumlah preload 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

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

Perluas untuk melihat mode preload yang didukung

typedef enum AVPMultiBitratesMode : NSUInteger {
    /**
     * Mode default, putar dan preload bitrate default aliran.
     */
    AVPMultiBitratesMode_Default = 0,
    /**
     * Prioritas biaya frame pertama (FC), kurangi biaya frame pertama. hanya putar bitrate aliran hls yang telah dipreloading.
     */
    AVPMultiBitratesMode_FCPrio = 1,
    /**
     * Seimbangkan biaya frame pertama dan kelancaran pemutaran, putar bitrate yang sama sebelum dan sesudah moveToNext.
     */
    AVPMultiBitratesMode_FC_AND_SMOOTH = 2,
    /**
     * Prioritas kelancaran pemutaran, 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 awal.
[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 unduhan

Anda dapat memperoleh kecepatan unduhan video yang sedang diputar. Anda dapat memperoleh kecepatan dalam callback onCurrentDownloadSpeed. Kode berikut memberikan contohnya:

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

Fitur jaringan

HTTPDNS

HTTPDNS mengirim permintaan resolusi nama domain ke server HTTPDNS tertentu untuk mendapatkan hasil resolusi nama domain yang lebih cepat dan stabil, yang mengurangi risiko pembajakan DNS.

ApsaraVideo Player SDK menyediakan fitur HTTPDNS yang ditingkatkan yang menawarkan layanan HTTPDNS khusus untuk nama domain CDN Alibaba Cloud. Fitur ini mendukung penjadwalan presisi dan resolusi real-time untuk jaringan CDN Alibaba Cloud, yang secara efektif meningkatkan performa jaringan.

Contoh penggunaan HTTPDNS yang ditingkatkan

HTTPDNS yang ditingkatkan hanya menyediakan layanan HTTPDNS untuk nama domain CDN Alibaba Cloud. Pastikan nama domain yang Anda konfigurasikan adalah nama domain CDN Alibaba Cloud dan konfigurasi nama domain lengkap serta siap digunakan. Untuk informasi selengkapnya tentang cara menambah dan mengonfigurasi nama domain CDN di ApsaraVideo VOD, lihat Tambahkan nama domain yang dipercepat. Untuk informasi selengkapnya tentang nama domain CDN, lihat CDN Alibaba Cloud.

// 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, ApsaraVideo Player SDK untuk iOS mengaktifkan HTTP/2 secara default.

ApsaraVideo Player SDK untuk iOS mendukung protokol HTTP/2. Protokol ini menggunakan multiplexing untuk menghindari blokir kepala antrian dan meningkatkan performa pemutaran. Kode berikut memberikan contohnya:

[AliPlayerGlobalSettings setUseHttp2:true];

Pra-buat koneksi TCP untuk HTTP

Untuk permintaan pemutaran video HTTP (bukan HTTPS), pra-membuat koneksi TCP secara signifikan dapat meningkatkan pengalaman pengguna, mengurangi waktu koneksi jaringan, memastikan pemutaran segera dan berkelanjutan, serta mengoptimalkan penggunaan sumber daya jaringan dan sistem. Penggunaannya sebagai berikut:

// Format domain adalah host[:port], di mana port opsional. Nama domain ganda dipisahkan dengan titik koma (;).
// Pengaturan global
// Antarmuka lengkap menggunakan string saat ini setiap kali diatur (lebih - tambah, kurang - hapus). String kosong menghentikan pra-koneksi.
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];

Unduhan video

Catatan

Untuk contoh kode detail, lihat modul Unduhan Video dan Pemutaran Offline (Download) di API-Example. Proyek ini adalah proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.

ApsaraVideo Player SDK untuk iOS menyediakan fitur unduhan video untuk ApsaraVideo VOD. Fitur ini memungkinkan pengguna menyimpan video secara lokal untuk ditonton dengan ApsaraVideo Player. SDK menawarkan dua metode unduhan: unduhan standar dan unduhan aman.

  • Unduhan standar: Data video yang diunduh tidak dienkripsi oleh Alibaba Cloud. Pengguna dapat memutarnya dengan player pihak ketiga.

  • Unduhan aman: Data video yang diunduh dienkripsi oleh Alibaba Cloud. Player pihak ketiga tidak dapat memutarnya. Data hanya dapat diputar menggunakan ApsaraVideo Player.

Catatan penggunaan

  • Fitur unduhan video hanya didukung untuk metode VidSts dan VidAuth.

  • Untuk menggunakan fitur unduhan video player, Anda perlu mengaktifkan dan mengonfigurasi mode unduhan di konsol ApsaraVideo VOD. Untuk informasi selengkapnya, lihat Unduhan offline.

  • Unduhan video mendukung unduhan yang dapat dilanjutkan.

Prosedur

  1. Opsional: Konfigurasikan file verifikasi enkripsi untuk unduhan aman. Ini hanya diperlukan untuk unduhan aman, bukan untuk unduhan standar.

    Catatan

    Pastikan file verifikasi enkripsi yang dikonfigurasi konsisten dengan informasi aplikasi. Jika tidak, unduhan video gagal.

    Jika Anda mengatur metode unduhan ke unduhan aman, Anda harus mengonfigurasi file kunci yang dihasilkan di konsol ApsaraVideo VOD ke SDK player untuk dekripsi dan verifikasi selama unduhan dan pemutaran video. Untuk informasi selengkapnya tentang cara menghasilkan file kunci, lihat Aktifkan unduhan aman.

    Kami menyarankan Anda mengonfigurasi file kunci sekali di Application. Kode berikut memberikan contohnya:

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

    Kode berikut memberikan contohnya:

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

    Downloader menyediakan beberapa listener event. Kode berikut memberikan contohnya:

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        // Item unduhan berhasil disiapkan.
    }
    -(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. Siapkan sumber unduhan.

    Anda dapat menggunakan metode prepare untuk menyiapkan sumber unduhan. Metode VidSts dan VidAuth didukung. Kode berikut memberikan contohnya:

    • VidSts

      // Buat VidSts.
      AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init];
      stsSource.region = @"Wilayah akses"; // Wilayah akses ApsaraVideo VOD. Default adalah cn-shanghai.
      stsSource.vid = @"Informasi Vid"; // ID video.
      stsSource.securityToken = @"<yourSecurityToken>"; // Token STS. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya.
      stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // Rahasia AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya.
      stsSource.accessKeyId = @"<yourAccessKeyId>"; // ID AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya.
      
      // Jika Anda telah mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, dan nama parameter default adalah MtsHlsUriToken, Anda perlu mengatur config dan meneruskannya ke vid, seperti yang ditunjukkan di bawah.
      // Jika Anda belum mengaktifkan pass-through 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.
      authSource.playAuth = @"<yourPlayAuth>"; // Kredensial pemutaran. Anda perlu memanggil operasi API GetVideoPlayAuth ApsaraVideo VOD untuk menghasilkannya.
      authSource.region = @"Wilayah akses"; // Untuk SDK player V5.5.5.0 ke atas, parameter ini ditinggalkan. Anda tidak perlu mengatur wilayah; player akan menguraikannya secara otomatis. Untuk SDK player sebelum V5.5.5.0, parameter ini wajib. Wilayah akses ApsaraVideo VOD, default adalah cn-shanghai.
      // Jika Anda telah mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, dan nama parameter default adalah MtsHlsUriToken, Anda perlu mengatur config dan meneruskannya ke vid, seperti yang ditunjukkan di bawah.
      // Jika Anda belum mengaktifkan 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 telah mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, dan nama parameter default adalah MtsHIsUriToken (untuk informasi selengkapnya, lihat Pass-through parameter enkripsi standar HLS), harap atur nilai MtsHIsUriToken ke sumber VOD seperti yang ditunjukkan dalam kode di atas.

  5. Setelah persiapan berhasil, pilih item unduhan.

    Setelah persiapan berhasil, metode onPrepared dipanggil balik. TrackInfo yang dikembalikan berisi informasi seperti definisi setiap aliran video. Anda dapat memilih track untuk diunduh. Kode berikut memberikan contohnya:

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

    Untuk mencegah VidSts dan VidAuth kedaluwarsa, kami menyarankan Anda memperbarui informasi sumber unduhan sebelum memulai unduhan. Kode berikut memberikan contohnya:

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

    Setelah unduhan berhasil, Anda dapat memanggil destroy untuk melepaskan downloader.

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

Pemutaran video terenkripsi

ApsaraVideo VOD mendukung enkripsi HLS, enkripsi privat Alibaba Cloud, dan enkripsi DRM. Video streaming langsung hanya mendukung enkripsi DRM. Untuk informasi selengkapnya tentang pemutaran terenkripsi, lihat Pemutaran video terenkripsi.

Pemutaran Native RTS

ApsaraVideo Player SDK untuk iOS mengintegrasikan Native RTS SDK untuk mengimplementasikan fitur streaming langsung latensi rendah native. Untuk informasi selengkapnya, lihat Implementasikan penarikan aliran RTS di iOS.

Referensi