Topik ini menjelaskan cara menggunakan fitur lanjutan ApsaraVideo Player SDK untuk iOS. Untuk deskripsi lengkap semua fitur, lihat Referensi API.
Untuk mencoba demo, unduh dan ikuti petunjuk di Jalankan demo untuk mengompilasi dan menjalankan proyek.
Konfirmasi keterampilan profesional
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.
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.
Kualitas animasi lebih baik: Video MP4 mempertahankan detail dan warna animasi asli lebih akurat dibanding format lain.
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.
Kompatibilitas lebih tinggi: Format MP4 didukung luas di berbagai perangkat dan browser.
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.
Rendering Metal
ApsaraVideo Player SDK untuk iOS mendukung rendering video menggunakan framework Metal.
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
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:
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];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]; }Tambahkan track subtitle.
[self.player addExtSubtitle:URL];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.
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.
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
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(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); } }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];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.
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
Hasilkan stream HLS multi-bitrate menggunakan templat pengemasan video di ApsaraVideo VOD. Untuk petunjuk, lihat Konfigurasi streaming bitrate adaptif untuk video sesuai permintaan.
Stream adaptif yang dihasilkan oleh transkoding ApsaraVideo VOD mengharuskan Anda menentukan daftar definisi pemutaran default sebagai
AUTOsaat menggunakan pemutaran Vid untuk memutar stream video adaptif. Jika tidak, sistem memilih stream video definisi lebih rendah sesuai logika default. Untuk urutan pemutaran default definisi, lihat Definisi mana yang diputar SDK pemutar secara default saat beberapa definisi dihasilkan oleh transkoding video?. Misalnya, saat menggunakan pemutaran VidAuth, berikut cara menentukan daftar definisi:AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.definitions = @"AUTO";
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];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.
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];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
onErrordipicu denganAVPErrorModel.codediatur keERROR_LOADING_TIMEOUT.Jika Anda menyetel
networkRetryCountke 0, pemutar memicu callbackonPlayerEventdenganeventWithStringdiatur keEVENT_PLAYER_NETWORK_RETRYsaat retry jaringan timeout. Anda kemudian dapat memanggil metodereloadpemutar 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];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
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.
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;
}
}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.
Tetapkan delegate PiP.
/** * @brief Tetapkan delegate PiP. */ -(void) setPictureinPictureDelegate:(id<AliPlayerPictureInPictureDelegate>)delegate; // Tetapkan delegate PiP. [self.player setPictureinPictureDelegate:self];Tambahkan variabel dan implementasikan antarmuka delegate.
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; @endCatatanAnda harus menggunakan pengubah weak atau assign untuk pipController. Jika menggunakan pengubah assign, pastikan Anda menyetel variabel yang benar ke null.
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]; } }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]; } } }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; }CatatanCallback 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
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.
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
Gunakan Player atau SDK all-in-one versi 7.6.0 atau lebih tinggi.
Anda telah menyelesaikan otorisasi lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Mendapatkan Lisensi SDK Pemutar.
ApsaraVideo Player dengan plugin decoding H.266 hanya mendukung video H.266 yang dikodekan oleh Transkoding ApsaraVideo.
Integrasikan plugin
Aktifkan plugin
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
Gunakan Player atau SDK all-in-one versi V7.9.0 atau yang lebih baru.
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
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
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.
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).
Setelah menyetel skenario pemutaran, gunakan antarmuka
getConfiguntuk 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.
Fitur ini dinonaktifkan secara default.
Anda harus menyetel
Viewsebelum memanggilPrepareuntuk memastikan frame siap dirender diView.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
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];Jika URL pemutaran file video berisi parameter autentikasi, nilai parameter autentikasi berubah selama caching lokal dan pemutaran file video. Anda dapat memanggil operasi
setCacheUrlHashCallbackuntuk menghitung nilai hash MD5 setelah menghapus parameter autentikasi. Misalnya,http://****.mp4?aaaadalah URL pemutaran file video yang berisi parameter autentikasi. Dalam hal ini, URLhttp://****.mp4digunakan 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 pemutaranhttp(s)://xxxxx.m3u8?aaaatetapi jangan hapus dari URL kuncihttp(s)://yyyyy?bbbbdalam callbacksetCacheUrlHashCallback.
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://****.mp4danhttp://****.mp4, gunakan****.mp4untuk menghitung nilai MD5.Jika URL pemutaran video adalah
https://****.mp4, satukan kehttp://****.mp4sebelum 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.enableStrictAuthModeuntuk 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.
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];Aktifkan cache lokal seperti dijelaskan di Cache lokal.
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];Tetapkan parameter tugas.
CatatanIni hanya berlaku untuk video multi-bitrate. Anda dapat memilih salah satu dari
setDefaultBandWidth,setDefaultResolution, atausetDefaultQuality.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];Tambahkan listener tugas.
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];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.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.
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.
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
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
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
Opsi: Konfigurasikan file verifikasi enkripsi untuk unduhan aman. Konfigurasikan file ini hanya untuk unduhan aman. Unduhan standar tidak memerlukannya.
CatatanPastikan 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];Buat dan siapkan downloader.
Contoh:
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self];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. }Persiapkan sumber unduhan.
Panggil metode
prepareuntuk 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];
CatatanJika 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.
Pilih item download.
Setelah persiapan berhasil, metode
onPrepareddipanggil. 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]; }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];Setelah pengunduhan berhasil atau gagal, lepaskan downloader.
Setelah pengunduhan berhasil, panggil
destroyuntuk 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.