Topik ini menjelaskan cara menggunakan fitur lanjutan ApsaraVideo Player SDK untuk iOS. Untuk panduan lengkap semua fitur, lihat referensi API.
Untuk mencoba demo, unduh dan ikuti petunjuk di Jalankan demo untuk mengompilasi dan menjalankannya.
Verifikasi fitur lanjutan
Beberapa fitur pemutar memerlukan lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Fitur. Untuk mendapatkan lisensi, lihat Dapatkan lisensi.
Atur listener saat startup aplikasi atau sebelum melakukan panggilan API pemutar apa pun:
void premiumVeryfyCallback(AVPPremiumBizType biztype, bool isValid, NSString* errorMsg) {
NSLog(@"onPremiumLicenseVerifyCallback: %d, isValid: %d, errorMsg: %@", biztype, isValid, errorMsg);
}
[AliPrivateService setOnPremiumLicenseVerifyCallback:premiumVeryfyCallback];Di sini, AVPPremiumBizType adalah enumerasi fitur lanjutan. Saat Anda menggunakan fitur lanjutan, pemutar memverifikasi lisensi dan mengembalikan hasilnya melalui callback ini. Jika isValid bernilai false, errorMsg berisi alasan kegagalannya.
Pemutaran
Putar balik daftar
Player SDK for iOS menyediakan fitur putar balik daftar yang komprehensif untuk skenario video pendek dan menggunakan teknik seperti preloading guna mengurangi Time-to-First-Frame (TTTF) secara signifikan.
Untuk pengalaman putar balik daftar yang lebih baik, pertimbangkan menggunakan solusi drama format pendek kami. Untuk detailnya, lihat Pengembangan Sisi Klien untuk Drama Format Pendek.
Putar video dengan saluran alpha
Ikhtisar
ApsaraVideo Player SDK mendukung rendering saluran alpha untuk menciptakan efek dinamis, seperti hadiah animasi. Di ruang streaming langsung, Anda dapat memutar efek animasi ini di atas konten utama untuk secara signifikan meningkatkan pengalaman pengguna.
Batasan
Rendering saluran alpha didukung di SDK all-in-one versi 6.8.0 atau lebih baru, atau ApsaraVideo Player SDK versi 6.9.0 atau lebih baru.
Manfaat
Menggunakan video MP4 dengan saluran alpha untuk efek animasi menawarkan kualitas animasi yang lebih baik, ukuran file yang lebih kecil, kompatibilitas yang lebih tinggi, dan efisiensi pengembangan yang lebih besar.
Kualitas animasi yang lebih baik: Video MP4 mempertahankan detail dan warna animasi asli lebih akurat dibandingkan format lain seperti APNG atau IXD.
Ukuran file yang lebih kecil: File MP4 dapat dikompresi lebih efektif daripada format lain seperti APNG atau IXD, yang meningkatkan kecepatan pemuatan dan mengurangi konsumsi lebar pita jaringan.
Kompatibilitas yang lebih tinggi: Sebagai format video universal, MP4 didukung secara luas di sebagian besar perangkat dan browser.
Efisiensi pengembangan yang lebih tinggi: Implementasinya sederhana dan tidak memerlukan developer untuk membangun logika parsing atau rendering yang kompleks. Hal ini memungkinkan mereka fokus pada fitur lainnya.
Rendering Metal
Alibaba Cloud Player SDK untuk iOS mendukung rendering video menggunakan framework Metal.
Saat ini, rendering Metal hanya mendukung warna latar belakang, mode penskalaan, dan Gambar-dalam-Gambar (PiP).
Parameter
/**
@brief Menentukan jenis render video. Nilai valid: 0 (renderer default) dan 1 (renderer campuran). Default: 0.
*/
@property(nonatomic, assign) int videoRenderType;Contoh
AVPConfig *config = [self.player getConfig];
// Aktifkan rendering Metal.
config.videoRenderType = 1;
[self.player setConfig:config];
[self.player prepare];Subtitle eksternal
Untuk contoh kode terperinci, lihat modul ExternalSubtitle di API-Example. Proyek sampel Objective-C ini menunjukkan cara mengintegrasikan fitur inti ApsaraVideo Player SDK untuk iOS.
ApsaraVideo Player SDK untuk iOS mendukung penambahan dan pergantian subtitle eksternal dalam format SRT, SSA, ASS, dan VTT.
Contoh berikut menunjukkan cara mengimplementasikan fitur ini.
Buat tampilan untuk menampilkan subtitle.
Buat tampilan berdasarkan format subtitle.
// Inisialisasi subTitleLabel kustom. UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame]; // Tambahkan label subtitle ke superView kustom. [superView addSubview:subTitleLabel];Atur listener terkait subtitle.
// Dipanggil saat track subtitle eksternal ditambahkan. - (void)onSubtitleExtAdded:(AliPlayer*)player trackIndex:(int)trackIndex URL:(NSString *)URL {} // Callback untuk header subtitle. - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header{} // Dipanggil saat subtitle ditampilkan. - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle { subTitleLabel.text =subtitle; subTitleLabel.tag =subtitleID; } // Dipanggil saat subtitle disembunyikan. - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID{ [subTitleLabel removeFromSuperview]; }Tambahkan track subtitle.
[self.player addExtSubtitle:URL];Ganti track subtitle.
[self.player selectExtSubtitle:trackIndex enable:YES];
Subtitle eksternal (rendering kustom)
Menggunakan AliVttSubtitleView dan AliVttRenderImpl, fitur ini sepenuhnya mendukung subtitle eksternal WebVTT dan memungkinkan Anda menyesuaikan gaya seperti font, warna, dan ukuran.
Kasus penggunaan:
Anda ingin menyesuaikan gaya subtitle WebVTT, seperti font, warna, dan ukuran.
Integrasi Anda menggunakan Alibaba Cloud Player SDK v7.11.0 atau lebih baru dan AliVttSubtitleView.
Mendukung subtitle multibahasa (seperti Arab, Tionghoa, Jepang, dan Korea) dan secara otomatis mencocokkan font yang sesuai.
Prasyarat:
Anda telah menambahkan file font yang diperlukan (.ttf) ke proyek Xcode Anda.
Anda telah mengonfigurasi listener subtitle untuk menerima konten WebVTT.
Font yang diperlukan dimuat dengan memanggil metode loadFontFromBundle.
Menyesuaikan gaya subtitle
Buat kelas implementasi rendering kustom yang mewarisi dari AliVttRenderImpl.
// CustomFontVttRenderImpl.h @interface CustomFontVttRenderImpl : AliVttRenderImpl @end // CustomFontVttRenderImpl.m @implementation CustomFontVttRenderImpl // Opsional: Ganti logika pembuatan font. - (UIFont *)customizeFont:(UIFont *)originalFont contentAttribute:(VttContentAttribute *)contentAttribute contentText:(NSString *)text { // Contoh: Secara otomatis memilih font berdasarkan konten. if ([self containsArabicCharacters:text]) { return [UIFont fontWithName:@"NotoSansArabic-Regular" size:originalFont.pointSize]; } if ([self containsCJKCharacters:text]) { return [UIFont fontWithName:@"NotoSansCJKsc-Regular" size:originalFont.pointSize]; } return originalFont; } // Opsional: Paksa warna tertentu. - (void)applyColorStyle:(NSMutableDictionary *)attrs contentAttribute:(VttContentAttribute *)contentAttribute { // Paksa warna menjadi merah. attrs[NSForegroundColorAttributeName] = [UIColor redColor]; } // Opsional: Perbesar font. - (void)applyFontStyle:(NSMutableDictionary *)attrs contentAttribute:(VttContentAttribute *)contentAttribute context:(RenderContext *)context { CGFloat originalSize = contentAttribute.fontSizePx / context.contentsScale; CGFloat newSize = originalSize * 2.0; // Perbesar 2x. UIFont *font = [self generateFontWithName:contentAttribute.fontName fontSize:newSize isBold:contentAttribute.mBold isItalic:contentAttribute.mItalic]; attrs[NSFontAttributeName] = font; } // Helper: Deteksi karakter Arab. - (BOOL)containsArabicCharacters:(NSString *)text { for (NSUInteger i = 0; i < text.length; i++) { unichar c = [text characterAtIndex:i]; if ((c >= 0x0600 && c <= 0x06FF) || (c >= 0x0750 && c <= 0x077F)) { return YES; } } return NO; } // Helper: Deteksi karakter CJK. - (BOOL)containsCJKCharacters:(NSString *)text { for (NSUInteger i = 0; i < text.length; i++) { unichar c = [text characterAtIndex:i]; if ((c >= 0x4E00 && c <= 0x9FFF) || // Tionghoa (c >= 0x3040 && c <= 0x309F) || // Hiragana Jepang (c >= 0xAC00 && c <= 0xD7AF)) { // Korea return YES; } } return NO; } @end(Opsional) Muat font kustom secara dinamis.
- (void)loadCustomFontFromBundle:(NSString *)fontName { NSString *path = [[NSBundle mainBundle] pathForResource:fontName ofType:@"ttf"]; if (path) { NSData *fontData = [NSData dataWithContentsOfFile:path]; CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)fontData); CGFontRef fontRef = CGFontCreateWithDataProvider(provider); if (CTFontManagerRegisterGraphicsFont(fontRef, NULL)) { NSLog(@"Font berhasil didaftarkan: %@", fontName); } else { NSLog(@"Pendaftaran font gagal: %@", fontName); } CGFontRelease(fontRef); CGDataProviderRelease(provider); } }Inisialisasi tampilan subtitle dan ikat renderer kustom.
// Buat tampilan subtitle. AliVttSubtitleView *subtitleView = [[AliVttSubtitleView alloc] init]; // Atur factory renderer kustom. [subtitleView setRenderImplFactory:^AliVttRenderImpl*() { CustomFontVttRenderImpl *impl = [[CustomFontVttRenderImpl alloc] init]; // Opsional: Pra-muat font. [impl loadCustomFontFromBundle:@"LongCang-Regular"]; return impl; }]; // Lampirkan ke pemutar. [player setExternalSubtitleView:subtitleView];Tangani callback subtitle pemutar.
Implementasikan metode berikut pada AVPDelegate Anda:
// Header subtitle (berisi definisi gaya dan wilayah). - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header { [self.subtitleView setVttHeader:player trackIndex:trackIndex Header:header]; } // Tampilkan subtitle. - (void)onSubtitleShow:(AliPlayer *)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle { [self.subtitleView show:player trackIndex:trackIndex subtitleID:subtitleID subtitle:subtitle]; } // Sembunyikan subtitle. - (void)onSubtitleHide:(AliPlayer *)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID { [self.subtitleView hide:player trackIndex:trackIndex subtitleID:subtitleID]; } // Track subtitle berhasil ditambahkan. Gunakan callback ini untuk mengaktifkan track. - (void)onSubtitleExtAdded:(AliPlayer *)player trackIndex:(int)trackIndex URL:(NSString *)URL { [player selectExtSubtitle:trackIndex enable:YES]; }
Pemutaran hanya audio
Untuk mengaktifkan pemutaran hanya audio, nonaktifkan track video. Konfigurasikan PlayerConfig sebelum memanggil prepare.
AVPConfig *config = [self.player getConfig];
config.disableVideo = YES;
[self.player setConfig:config];Pergantian decoder
Player SDK untuk iOS mendukung decoding hardware untuk H.264 dan H.265. Fitur ini diaktifkan secara default dan dikontrol oleh properti enableHardwareDecoder. Jika inisialisasi decoding hardware gagal, pemutar secara otomatis beralih ke decoding software untuk memastikan pemutaran berlanjut.
// Aktifkan decoding hardware (diaktifkan secara default).
self.player.enableHardwareDecoder = YES;Saat pemutar secara otomatis beralih dari decoding hardware ke software, callback onPlayerEvent dipicu, seperti pada contoh berikut:
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_SWITCH_TO_SOFTWARE_DECODER) {
// Beralih ke decoding software.
}
}Pemutaran adaptif H.265
Jika model perangkat berada dalam blacklist H.265 berbasis cloud atau jika decoding hardware H.265 gagal, fallback adaptif dipicu. Jika stream cadangan H.264 dikonfigurasi, pemutar secara otomatis memutarnya. Jika tidak, pemutar kembali ke decoding software H.265.
Fitur ini hanya tersedia setelah mengaktifkan layanan decoding adaptif cloud-native. Anda perlu mengirimkan formulir Yida untuk mengajukan lisensi.
Layanan decoding adaptif cloud-native menyediakan dua kemampuan utama: 1. Pengiriman dinamis data kompatibilitas decoding hardware dari cloud. 2. Fallback adaptif dari stream H.265 ke H.264.
SDK masih dapat secara otomatis beralih ke decoding software jika decoding hardware gagal, bahkan tanpa layanan bernilai tambah ini.
Contoh berikut menunjukkan cara mengatur stream cadangan:
// Lapisan aplikasi harus mempertahankan dictionary untuk memetakan URL asli ke URL cadangannya.
NSString* getBackupUrlCallback(AVPBizScene scene, AVPCodecType codecType, NSString* oriurl){
NSMutableDictionary *globalMap = [AliPlayerViewController getGlobalBackupUrlMap];
NSString *backupUrl = globalMap[oriurl];
return backupUrl;
}
[AliPlayerGlobalSettings setAdaptiveDecoderGetBackupURLCallback:getBackupUrlCallback];Streaming bitrate adaptif
Anda dapat menghasilkan stream adaptif multi-bitrate menggunakan kelompok template transkoding dan pengemasan video di ApsaraVideo VOD. Untuk informasi lebih lanjut, lihat Konfigurasikan streaming bitrate adaptif untuk ApsaraVideo VOD.
Untuk memutar stream adaptif dari ApsaraVideo VOD dengan metode pemutaran VidAuth, atur daftar definisi ke
AUTO. Jika tidak, pemutar memilih stream definisi rendah secara default. Untuk informasi lebih lanjut tentang urutan pemutaran default untuk definisi, lihat Jika video ditranskode ke beberapa definisi, definisi mana yang diputar secara default oleh ApsaraVideo Player SDK? Contoh berikut menunjukkan caranya:AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.definitions = @"AUTO";
ApsaraVideo Player SDK untuk iOS mendukung stream multi-bitrate adaptif. Setelah metode prepare berhasil, Anda dapat memanggil metode getMediaInfo untuk mendapatkan TrackInfo untuk setiap stream.
AVPMediaInfo *info = [self.player getMediaInfo];
NSArray<AVPTrackInfo*>* tracks = info.tracks;Selama pemutaran, Anda dapat mengganti stream dengan memanggil metode selectTrack pemutar. Untuk mengaktifkan streaming bitrate adaptif, teruskan SELECT_AVPTRACK_TYPE_VIDEO_AUTO.
// Ganti ke stream tertentu.
[self.player selectTrack:track.trackIndex];
// Aktifkan streaming bitrate adaptif.
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];Callback onTrackChanged mengonfirmasi pergantian stream.
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
if (info.trackType == AVPTRACK_TYPE_VIDEO) {
// Track video telah berubah.
}
// dll
}Opsi: Sebelum memanggil metode selectTrack untuk mengaktifkan streaming bitrate adaptif, Anda dapat membatasi definisi video untuk mencegah pemutar beralih ke bitrate yang terlalu tinggi. Terapkan konfigurasi ini sebelum memanggil metode prepare atau metode moveTo untuk putar balik daftar.
AVPConfig *config = [self.player getConfig];
config.maxAllowedAbrVideoPixelNumber = 921600; // Atur jumlah piksel maksimum untuk ABR menjadi 921600 (1280 * 720). Ini memastikan bahwa pemutar hanya beralih ke definisi dengan jumlah piksel kurang dari atau sama dengan nilai ini.
[self.player setConfig:config];Snapshot
Player SDK untuk iOS menyediakan fitur untuk mengambil snapshot video saat ini. Fitur ini diimplementasikan oleh API snapShot. Fitur ini menangkap data mentah dan mengembalikannya sebagai bitmap. Callback-nya adalah onCaptureScreen. Berikut contohnya:
// Callback snapshot
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
// Proses snapshot.
}
// Ambil snapshot frame saat ini.
[self.player snapShot];Snapshot tidak menyertakan UI.
Pratinjau
ApsaraVideo Player SDK untuk iOS mendukung fitur pratinjau saat dikonfigurasi dengan ApsaraVideo VOD. SDK mendukung pemutaran VidSts dan VidAuth. VidAuth adalah metode yang direkomendasikan. Untuk informasi lebih lanjut, lihat Pratinjau video.
Setelah Anda mengonfigurasi fitur pratinjau, gunakan metode setPreviewTime dari antarmuka VidPlayerConfigGen untuk mengatur durasi pratinjau pemutar. Berikut contoh pemutaran VidSts:
AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
....
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setPreviewTime:20]; // Pratinjau 20 detik
source.playConfig = [vp generatePlayerConfig]; // Terapkan konfigurasi ke sumber pemutaran.
...Saat Anda mengatur durasi pratinjau dan menggunakan iOS player SDK untuk memutar video, server hanya mengembalikan konten video untuk periode pratinjau, bukan konten video lengkap.
Anda dapat menggunakan kelas VidPlayerConfigGenerator untuk mengatur parameter permintaan sisi server. Untuk informasi lebih lanjut, lihat Deskripsi parameter permintaan.
Atur Referer
Player SDK untuk iOS memungkinkan Anda mengatur Referer untuk mengimplementasikan kontrol akses. Fitur ini bekerja dengan Daftar hitam Referer dan daftar putih yang Anda konfigurasi di konsol ApsaraVideo VOD. Anda dapat mengatur Referer dalam objek AVPConfig, seperti pada contoh berikut:
// Dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur Referer.
config.referer = referer;
....// Pengaturan lainnya.
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];User-Agent
iOS player SDK menyediakan AVPConfig untuk mengatur User-Agent kustom, yang kemudian disertakan pemutar dalam semua permintaan jaringan berikutnya. Contoh berikut menunjukkan caranya:
// Dapatkan konfigurasi saat ini.
AVPConfig *config = [self.player getConfig];
// Atur User-Agent.
config.userAgent = userAgent;
//... pengaturan lainnya
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];Konfigurasikan jumlah retry jaringan dan timeout
Untuk mengonfigurasi timeout jaringan dan jumlah retry untuk iOS player SDK, gunakan objek AVPConfig. Contohnya:
// Dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur timeout jaringan dalam milidetik.
config.networkTimeout = 5000;
// Atur jumlah maksimum retry. Interval retry ditentukan oleh networkTimeout. Nilai 0 menonaktifkan retry, memungkinkan aplikasi mengimplementasikan kebijakan retry sendiri. Default adalah 2.
config.networkRetryCount = 2;
//... Pengaturan lainnya
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];Jika
networkRetryCountlebih besar dari 0, pemutar mencoba ulang hingganetworkRetryCountkali saat terjadi masalah jaringan selama pemuatan. Interval retry ditentukan olehnetworkTimeout.Jika pemutar gagal memuat setelah semua upaya retry, callback
onErrordipicu, dan AVPErrorModel.code adalah ERROR_LOADING_TIMEOUT.Jika
networkRetryCountadalah 0, timeout jaringan memicu callbackonPlayerEventdengan parametereventWithStringdiatur keEVENT_PLAYER_NETWORK_RETRY. Anda kemudian dapat memanggil metodereloadpemutar untuk mencoba ulang permintaan jaringan atau melakukan tindakan lain.
Kontrol cache dan latensi
Kontrol cache sangat penting untuk kinerja pemutar. Konfigurasi yang tepat dapat meningkatkan kecepatan startup dan mengurangi tersendat. Player SDK untuk iOS menyediakan antarmuka untuk mengonfigurasi pengaturan cache dan latensi dalam objek AVPConfig:
// Ambil konfigurasi.
AVPConfig *config = [self.player getConfig];
// Latensi maksimum dalam milidetik. Catatan: Parameter ini hanya untuk streaming langsung. Jika latensi menjadi tinggi, Player SDK menyinkronkan frame untuk menjaganya dalam batas ini.
config.maxDelayTime = 5000;
// Durasi maksimum (dalam milidetik) data yang dapat dibuffer oleh pemutar.
config.maxBufferDuration = 50000;
// Durasi buffer tinggi dalam milidetik. Saat kondisi jaringan buruk, pemutar berhenti memuat data begitu buffer mencapai durasi ini.
config.highBufferDuration = 3000;
// Durasi buffer startup dalam milidetik. Nilai yang lebih kecil menghasilkan kecepatan startup yang lebih cepat tetapi dapat menyebabkan tersendat segera setelah pemutaran dimulai.
config.startBufferDuration = 500;
// Pengaturan lainnya.
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];Durasi buffer harus memenuhi hubungan ini: startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration.
Jika durasi buffer maksimum (maxBufferDuration) melebihi 5 menit, sistem memberlakukan batas 5 menit untuk mencegah pengecualian memori akibat buffer yang terlalu besar.
Atur Header HTTP
Gunakan objek AVPConfig untuk menambahkan header HTTP ke permintaan pemutar:
// Dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Definisikan header.
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
// Misalnya, atur header Host saat Anda menggunakan HTTPDNS.
[httpHeaders addObject:@"Host:example.com"];
// Atur header.
config.httpHeaders = httpHeaders;
....// Pengaturan lainnya.
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];Gambar-dalam-Gambar
Lihat modul PictureInPicture di proyek API-Example untuk contoh kode terperinci. Proyek sampel Objective-C ini menunjukkan cara mengintegrasikan fitur inti Alibaba Cloud Player SDK untuk iOS.
Gambar dalam gambar (PiP) memerlukan iOS 15 atau lebih baru dan ApsaraVideo Player SDK untuk iOS 5.4.9.0 atau lebih baru.
Versi ApsaraVideo Player SDK untuk iOS sebelum 5.5.2.0 hanya menyediakan metode untuk mengaktifkan atau menonaktifkan PiP dan menampilkan jendela PiP saat aplikasi masuk ke latar belakang. Mulai versi 5.5.2.0, Anda juga dapat mengatur delegasi PiP eksternal untuk menyesuaikan perilaku PiP.
Untuk menggunakan PiP, pastikan fitur tersebut diaktifkan di pengaturan perangkat Anda (Pengaturan > Umum > Gambar dalam Gambar).
Aktifkan PiP
Setelah Anda mengaktifkan picture-in-picture, video terus diputar di jendela kecil saat aplikasi masuk ke latar belakang. Saat aplikasi kembali ke latar depan, video kembali ke tampilan aslinya. Untuk mengaktifkan picture-in-picture, panggil setPictureInPictureEnable setelah pemutar memasuki status AVPEventPrepareDone. Contoh berikut menunjukkan caranya:
- (void)onPlayerEvent:(AliPlayer *)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone:
{
[self.player setPictureInPictureEnable:YES];
}
break;
default:
break;
}
}Memanggil metode stop pemutar tidak secara otomatis menutup jendela picture-in-picture. Oleh karena itu, Anda harus menonaktifkan picture-in-picture dengan memanggil setPictureInPictureEnable sebelum memanggil stop.
Tetapkan delegate PiP
Contoh kode berikut menunjukkan interaksi umum antara jendela Picture-in-Picture (PiP) dan pemutar. Interaksi ini mencakup menampilkan kontrol pemutaran seperti jeda, putar, maju cepat, dan mundur cepat, serta mengimplementasikan logika putar ulang. Untuk referensi lengkap metode delegasi, lihat file header AliPlayerPictureInPictureDelegate.h, yang terletak di AliyunPlayer.framework dalam folder SDK dari demo player SDK.
Atur delegasi Picture-in-Picture.
/** * @brief Mengatur delegasi untuk event Picture-in-Picture. */ -(void) setPictureinPictureDelegate:(id<AliPlayerPictureInPictureDelegate>)delegate; // Atur delegasi Picture-in-Picture. [self.player setPictureinPictureDelegate:self];Tambahkan properti dan implementasikan metode delegasi.
Tambahkan properti ke view controller Anda untuk mengelola status pemutar dan jendela Picture-in-Picture.
#import "YourUIViewController.h" #import <AliyunPlayer/AliyunPlayer.h> @interface YourUIViewController () <AVPDelegate, AliPlayerPictureInPictureDelegate> // Instans pemutar. @property (nonatomic, strong) AliPlayer *player; // Tampilan kontainer untuk pemutar. @property (nonatomic, strong) UIView *playerView; // Melacak apakah jendela Picture-in-Picture dijeda. @property (nonatomic, assign) BOOL isPipPaused; // Melacak status pemutaran saat ini pemutar, diperbarui oleh callback onPlayerStatusChanged:oldStatus:newStatus:. @property (nonatomic, assign) AVPStatus currentPlayerStatus; // Referensi lemah ke pengontrol picture-in-picture. Ini diatur dalam callback pictureInPictureControllerWillStartPictureInPicture: dan harus diatur ke nil sebelum view controller dealokasi. Menggunakan referensi lemah direkomendasikan. @property (nonatomic, weak) AVPictureInPictureController *pipController; // Melacak progres pemutaran, diperbarui oleh parameter 'position' dalam callback progres pemutaran. @property (nonatomic, assign) int64_t currentPosition; @endCatatanProperti
pipControllerharus dideklarasikan dengan atributweakatauassignuntuk mencegah siklus retensi. Jika Anda menggunakanassign, atur properti tersebut kenilsecara manual pada waktu yang tepat.Dalam metode delegasi
onPlayerStatusChanged:Anda, beri tahu pengontrol picture-in-picture untuk memperbarui statusnya.- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus { self.currentPlayerStatus = newStatus; if (_pipController) { [self.pipController invalidatePlaybackState]; } }Dalam metode delegasi
onPlayerEvent:Anda, perbarui status Picture-in-Picture sebagai respons terhadap event pemutaran.- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType { if (eventType == AVPEventCompletion) { if (_pipController) { self.isPipPaused = YES; // Saat pemutaran selesai, atur status PiP ke dijeda. [self.pipController invalidatePlaybackState]; } } else if (eventType == AVPEventSeekEnd) { // Operasi pencarian selesai. if (_pipController) { [self.pipController invalidatePlaybackState]; } } }Implementasikan metode delegasi.
Implementasikan callback untuk saat Picture-in-Picture akan dimulai.
/** @brief Memberi tahu delegasi bahwa Picture-in-Picture akan dimulai. @param pictureInPictureController Pengontrol picture-in-picture. */ - (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController { if (!_pipController) { self.pipController = pictureInPictureController; } self.isPipPaused = !(self.currentPlayerStatus == AVPStatusStarted); [pictureInPictureController invalidatePlaybackState]; }Implementasikan callback untuk saat Picture-in-Picture akan dihentikan.
/** @brief Memberi tahu delegasi bahwa Picture-in-Picture akan dihentikan. @param pictureInPictureController Pengontrol picture-in-picture. */ - (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController { self.isPipPaused = NO; [pictureInPictureController invalidatePlaybackState]; }Implementasikan callback untuk memulihkan UI sebelum Picture-in-Picture dihentikan.
/** @brief Memberi tahu delegasi untuk memulihkan antarmuka pengguna sebelum Picture-in-Picture dihentikan. @param pictureInPictureController Pengontrol picture-in-picture. @param completionHandler Handler penyelesaian yang dipanggil dengan YES untuk mengizinkan sistem menyelesaikan pemulihan. */ - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler { if (_pipController) { _pipController = nil; } completionHandler(YES); }Implementasikan callback yang menyediakan rentang waktu yang dapat diputar.
/** @brief Meminta delegasi untuk rentang waktu yang dapat diputar saat ini. @param pictureInPictureController Pengontrol picture-in-picture. @return Rentang waktu yang dapat diputar saat ini. */ - (CMTimeRange)pictureInPictureControllerTimeRangeForPlayback:(nonnull AVPictureInPictureController *)pictureInPictureController layerTime:(CMTime)layerTime{ Float64 current64 = CMTimeGetSeconds(layerTime); Float64 start; Float64 end; if (currentPosition <= self.player.duration) { double curPostion = self.currentPosition / 1000.0; double duration = self.player.duration / 1000.0; double interval = duration - curPostion; start = current64 - curPostion; end = current64 + interval; CMTime t1 = CMTimeMakeWithSeconds(start, layerTime.timescale); CMTime t2 = CMTimeMakeWithSeconds(end, layerTime.timescale); return CMTimeRangeFromTimeToTime(t1, t2); } else { return CMTimeRangeMake(kCMTimeNegativeInfinity, kCMTimePositiveInfinity); } }Implementasikan callback yang melaporkan apakah pemutaran dijeda.
/** @brief Meminta delegasi apakah pemutaran saat ini dijeda. @param pictureInPictureController Pengontrol picture-in-picture. @return Nilai Boolean yang menunjukkan apakah pemutaran dijeda. */ - (BOOL)pictureInPictureControllerIsPlaybackPaused:(nonnull AVPictureInPictureController *)pictureInPictureController{ return self.isPipPaused; }CatatanCallback ini dipanggil sebelum Picture-in-Picture dimulai. Callback ini harus mengembalikan
falsepada titik ini agar jendela PiP dapat diluncurkan. Mengembalikantruemencegah Picture-in-Picture dimulai.Implementasikan callback untuk menangani tindakan maju cepat dan mundur cepat dari kontrol Picture-in-Picture.
/** @brief Memberi tahu delegasi bahwa pengguna telah meminta untuk maju cepat atau mundur cepat. @param pictureInPictureController Pengontrol picture-in-picture. @param skipInterval Interval waktu untuk dilewati. @param completionHandler Handler penyelesaian yang harus Anda panggil setelah operasi pencarian selesai. */ - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController skipByInterval:(CMTime)skipInterval completionHandler:(nonnull void (^)(void))completionHandler { int64_t skipTime = skipInterval.value / skipInterval.timescale; int64_t skipPosition = self.currentPosition + skipTime * 1000; if (skipPosition < 0) { skipPosition = 0; } else if (skipPosition > self.player.duration) { skipPosition = self.player.duration; } [self.player seekToTime:skipPosition seekMode:AVP_SEEKMODE_INACCURATE]; [pictureInPictureController invalidatePlaybackState]; }Implementasikan callback untuk menangani tindakan putar dan jeda dari kontrol Picture-in-Picture.
/** @brief Memberi tahu delegasi bahwa pengguna telah mengaktifkan/menonaktifkan tombol putar/jeda. @param pictureInPictureController Pengontrol picture-in-picture. @param playing Nilai Boolean yang menunjukkan apakah pemutaran harus dimulai. */ - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController setPlaying:(BOOL)playing { if (!playing){ [self.player pause]; self.isPipPaused = YES; } else { // Tips: Jika Anda ingin tombol putar memulai ulang video setelah pemutaran selesai, tambahkan blok berikut. if (self.currentPlayerStatus == AVPStatusCompletion) { [self.player seekToTime:0 seekMode:AVP_SEEKMODE_ACCURATE]; } [self.player start]; self.isPipPaused = NO; } [pictureInPictureController invalidatePlaybackState]; }
Gambar-dalam-gambar dalam aplikasi
Gambar-dalam-gambar secara default di luar aplikasi. Untuk mengimplementasikan gambar-dalam-gambar dalam aplikasi, pertama-tama panggil antarmuka berikut untuk memeriksa apakah gambar-dalam-gambar aktif:
/**
@brief Memberi tahu delegasi apakah gambar-dalam-gambar diaktifkan.
@param pictureInPictureController Pengontrol picture-in-picture yang melaporkan statusnya.
@param isEnable `YES` jika gambar-dalam-gambar diaktifkan; `NO` jika tidak.
*/
- (void)pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *)pictureInPictureController isEnable:(BOOL)isEnable;Untuk menonaktifkan startup otomatis dan beralih ke aktivasi manual saat gambar-dalam-gambar berjalan, gunakan kode sampel berikut:
- (void) pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *) pictureInPictureController isEnable:(BOOL) isEnable
{
if (isEnable && pictureInPictureController) {
_pipController = pictureInPictureController;
// Nonaktifkan auto-start pip.
if (@available(iOS 15.0, *)) {
_pipController.canStartPictureInPictureAutomaticallyFromInline = false;
}
} else {
_pipController = NULL;
}
}
- (void) switchPip:(bool) enable {
if (_pipController == nil) {
return;
}
if (enable) {
// Mulai pip.
[_pipController startPictureInPicture];
} else {
// Hentikan pip.
[_pipController stopPictureInPicture];
}
}Fallback RTS langsung
Untuk contoh kode lengkap, lihat modul RtsLiveStream dalam proyek sampel Objective-C di API-Example, yang menunjukkan cara mengintegrasikan fitur inti Alibaba Cloud Player SDK untuk iOS.
Untuk informasi selengkapnya, lihat Pemutaran Langsung RTS.
Ganti saluran audio
Gunakan properti outputAudioChannel untuk mengatur saluran audio output. Jika sumber input berupa saluran stereo, Anda dapat mengalihkan output ke saluran audio kiri atau kanan. Pengaturan ini tidak berlaku jika sumber input berupa saluran mono.
Pengaturan saluran audio output memengaruhi rendering audio dan callback data PCM.
// Atur saluran audio output menggunakan nilai enumerasi AVPOutputAudioChannel.
// AVP_AUDIO_CHANNEL_NONE: Memutar saluran audio asli dari sumber input. Ini adalah nilai default.
// AVP_AUDIO_CHANNEL_LEFT: Memutar hanya saluran audio kiri.
// AVP_AUDIO_CHANNEL_RIGHT: Memutar hanya saluran audio kanan.
self.player.outputAudioChannel = AVP_AUDIO_CHANNEL_NONE;Atur warna latar belakang video
Player SDK untuk iOS memungkinkan Anda mengatur warna latar belakang tampilan rendering.
Contoh API
/**
@brief
@param color warna
*/
/****
@brief Mengatur warna latar belakang video.
@param color Warna latar belakang.
*/
-(void) setVideoBackgroundColor:(UIColor *)color;Penggunaan
// Parameter adalah nilai heksadesimal 8 digit dalam format ARGB (alpha, merah, hijau, biru).
// Misalnya, 0x0000ff00 merepresentasikan hijau.
[self.player setVideoBackgroundColor:0x0000ff00]Tentukan domain pemutaran dengan VidAuth
Gunakan metode VidAuth untuk menentukan bidang—seperti domain pemutaran—yang terkait dengan ID video (vid). Untuk daftar bidang yang didukung, lihat Parameter Permintaan GetPlayInfo.
Contoh API
/**
@brief Putar video menggunakan ID video dan kredensial pemutaran (PlayAuth). Untuk informasi lebih lanjut, lihat: https://www.alibabacloud.com/help/en/vod/user-guide/use-playback-credentials-to-play-videos
@param source Objek AVPVidAuthSource.
@see AVPVidAuthSource
*/
- (void)setAuthSource:(AVPVidAuthSource*)source;Penggunaan
Gunakan metode addVidPlayerConfigByStringValue dari antarmuka VidPlayerConfigGenerator untuk menambahkan bidang playDomain.
VidPlayerConfigGenerator* gen = [[VidPlayerConfigGenerator alloc]init];
// Tambahkan bidang playDomain. Untuk daftar bidang yang didukung, lihat:
// https://www.alibabacloud.com/help/en/vod/developer-reference/api-vod-2017-03-21-getplayinfo
[gen addVidPlayerConfigByStringValue:@"playDomain" value: @"com.example.xxx"];
[source setPlayConfig:[gen generatePlayerConfig]];
[self.player setAuthSource:source]:Decoding latar belakang
Sejak versi 6.12.0, Player SDK mendukung decoding latar belakang. Dengan mengaktifkan fitur ini, pemutar dapat terus mendekode dan memutar stream video serta memicu callback saat aplikasi berjalan di latar belakang. Contoh berikut menunjukkan cara mengaktifkan fitur tersebut:
// Atur ke 1 untuk mengaktifkan decoding latar belakang atau 0 untuk menonaktifkannya. Default: 0.
[self.player setOption:ALLOW_DECODE_BACKGROUND valueInt:1];Plugin pendekodean H.266
H.266, juga dikenal sebagai Versatile Video Coding (VVC), merupakan standar pengkodean video generasi berikutnya yang memberikan kualitas visual setara dengan bitrate jauh lebih rendah. Untuk mengoptimalkan kinerja dan mengontrol ukuran SDK utama, decoder H.266 disediakan sebagai plugin terpisah yang dapat diintegrasikan sesuai kebutuhan.
Prasyarat
Player SDK atau SDK all-in-one versi 7.6.0 atau lebih baru.
Anda memiliki lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Dapatkan lisensi.
Plugin decoding H.266 untuk Player SDK hanya mendukung video H.266 yang ditranskode oleh Transcoding Alibaba Cloud.
Integrasikan plugin
Aktifkan plugin
Mulai Player SDK untuk iOS v7.7.0, plugin diaktifkan secara default dan tidak memerlukan aktivasi manual.
[AliPlayerGlobalSettings enableCodecPlugin:@"vvc" valid:true];Kode kesalahan
Untuk kode kesalahan plugin decoding H.266, lihat FAQ pemutar lintas platform.
Segarkan sumber secara otomatis
Aktifkan penyegaran sumber otomatis untuk mencegah gangguan pemutaran akibat autentikasi yang kedaluwarsa. Saat sumber kedaluwarsa, pemutar memicu callback guna memperoleh sumber baru, sehingga memastikan pemutaran berlangsung lancar dan berkelanjutan.
Prasyarat
Pemutar atau SDK terintegrasi harus menggunakan versi 7.9.0 atau lebih baru.
Gunakan sumber VidAuth untuk pemutaran atau telah mengonfigurasi penandatanganan URL.
Sumber VidAuth
Contoh API
/**
@brief Mengatur callback untuk notifikasi kedaluwarsa sumber VidAuth.
Callback ini dipicu saat pemutar mendeteksi bahwa sumber VidAuth saat ini telah kedaluwarsa. Sumber VidAuth kedaluwarsa jika PlayAuth atau URL pemutaran telah kedaluwarsa.
Anda dapat menyegarkan sumber VidAuth dalam callback ini dan meneruskan objek baru melalui parameter `callback` untuk memastikan pemutaran yang lancar.
@param callback Blok callback yang dipicu saat sumber VidAuth kedaluwarsa.
Gunakan callback ini untuk memperbarui pemutar dengan objek `VidAuth` yang valid.
*/
-(void)setOnVidAuthExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;Komponen utama
Penggunaan
Anda dapat memperoleh PlayAuth dengan memanggil operasi GetVideoPlayAuth. Kami merekomendasikan mengintegrasikan SDK sisi server untuk VOD guna mendapatkan kredensial, sehingga menghindari kebutuhan penandatanganan URL secara manual. Untuk informasi selengkapnya, lihat Portal OpenAPI.
[self.player setOnVidAuthExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
// Dapatkan objek AVPVidAuthSource.
if ([expiredSource isKindOfClass:[AVPVidAuthSource class]]) {
AVPVidAuthSource *vidAuth = (AVPVidAuthSource *)expiredSource;
// ------------------- Awal implementasi pengguna -------------------
// Panggil fungsi kustom Anda untuk mengambil PlayAuth baru dari server aplikasi Anda.
// clinetGetPlayAuthFunction adalah nama fungsi sampel. Ganti dengan implementasi aktual Anda.
[self clinetGetPlayAuthFunction:vidAuth.vid success:^(NSString* newPlayAuth){
// 1. Dalam callback sukses, setelah mengambil kredensial baru:
[vidAuth setPlayAuth:newPlayAuth];
// 2. Teruskan objek sumber yang diperbarui kembali ke pemutar melalui callback SDK.
[callback onSuccess:vidAuth];
} failure:^(NSString* errorMsg) {
// Dalam callback kegagalan.
// errorMsg berisi detail kesalahan.
[callback onError:errorMsg];
}];
// ------------------- Akhir implementasi pengguna -------------------
}
}];Sumber URL
Contoh API
/**
@brief Mengatur callback untuk notifikasi kedaluwarsa sumber URL.
Callback ini dipicu saat pemutar mendeteksi bahwa sumber URL saat ini telah kedaluwarsa.
Anda dapat menyegarkan sumber URL dalam callback ini dan mengembalikan sumber URL baru melalui parameter `callback` untuk memastikan pemutaran berkelanjutan.
@note Untuk informasi lebih lanjut tentang cara mengonfigurasi penandatanganan URL, lihat dokumentasi Alibaba Cloud:
https://www.alibabacloud.com/help/en/vod/user-guide/configure-url-signing
@param callback Blok callback yang dipicu saat sumber URL kedaluwarsa.
Anda dapat menggunakan callback ini untuk memberikan objek `URLSource` yang valid untuk memperbarui pemutar.
*/
-(void)setOnURLSourceExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;Komponen utama
Penggunaan
[self.player setOnURLSourceExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
// Dapatkan objek AVPUrlSource.
if ([expiredSource isKindOfClass:[AVPUrlSource class]]) {
AVPUrlSource *expiredUrlSource = (AVPUrlSource *)expiredSource;
NSString *expiredUrl = [expiredUrlSource.playerUrl absoluteString];
// Periksa apakah URL berisi "auth_key".
if (![expiredUrl containsString:@"auth_key="]) {
return;
}
// 1. Ekstrak URL asli dari URL yang kedaluwarsa.
NSRange authKeyQuestionRange = [expiredUrl rangeOfString:@"?auth_key="];
NSRange authKeyAmpersandRange = [expiredUrl rangeOfString:@"&auth_key="];
NSInteger authKeyIndex = NSNotFound;
if (authKeyQuestionRange.location != NSNotFound) {
authKeyIndex = authKeyQuestionRange.location;
} else if (authKeyAmpersandRange.location != NSNotFound) {
authKeyIndex = authKeyAmpersandRange.location;
}
NSString *originalUrl = nil;
if (authKeyIndex != NSNotFound) {
originalUrl = [expiredUrl substringToIndex:authKeyIndex];
} else {
// Jika "auth_key" tidak ditemukan, anggap seluruh URL adalah URL asli.
originalUrl = expiredUrl;
}
// 2. Siapkan parameter autentikasi baru: authKey dan waktu kedaluwarsa.
// Gunakan anggota kelas authKey jika valid.
NSString *key = (self.authKey.length > 0) ? self.authKey : @"";
if (!NOT_EMPTY(key)) {
[callback onError:@"REFRESH_ERROR:key fail"];
return;
}
// Gunakan anggota kelas validTime jika valid; jika tidak, gunakan nilai default.
NSTimeInterval validTime = (self.validTime > 0) ? self.validTime : 3600; // Default: 3600 detik.
NSTimeInterval newExpireTime = [[NSDate date] timeIntervalSince1970] + validTime;
// 3. Hasilkan URL bertanda tangan baru dengan CdnAuthUtil (Metode A).
NSString *newAuthUrl = [CdnAuthUtil aAuthWithUri:originalUrl key:key exp:newExpireTime];
AVPUrlSource *resultSource = [[AVPUrlSource alloc] urlWithString:newAuthUrl];
// 4. Tangani callback.
if (newAuthUrl) {
[callback onSuccess:resultSource];
} else {
[callback onError:@"REFRESH_ERROR:refresh fail"];
}
}
}];Fungsi helper
Contoh berikut menggunakan metode autentikasi A.
Peningkatan audio
ApsaraVideo Player SDK untuk iOS menyediakan plugin peningkatan audio guna meningkatkan pengalaman pemutaran audio. Plugin ini mencakup tiga fitur utama: normalisasi volume, peningkatan dialog, dan suara surround.
Fitur
Normalisasi volume: Secara otomatis menyesuaikan semua konten audio ke tingkat volume yang konsisten, sehingga meningkatkan kualitas pemutaran video dengan volume asli yang terlalu rendah atau terlalu tinggi.
Saluran yang didukung: mono, stereo, 5.1, dan 7.1.
Laju sampel yang didukung: 16 kHz, 44.1 kHz, dan 48 kHz.
Peningkatan dialog: Secara cerdas memperjelas dialog, membuat suara dalam adegan bising lebih mudah dipahami tanpa mengubah timbre aslinya.
Saluran yang didukung: stereo.
Laju sampel yang didukung: 44.1 kHz dan 48 kHz.
Suara surround: Menerapkan rendering surround virtual pada audio multi-saluran dan stereo, memberikan pengalaman imersif melalui headphone atau perangkat standar. Fitur ini mencakup dua mode: 3DSurround dan MegaBass.
Saluran yang didukung: mono, stereo, 5.1, dan 7.1.
Laju sampel yang didukung: 44.1 kHz dan 48 kHz.
Prasyarat
ApsaraVideo Player SDK untuk iOS atau SDK all-in-one harus versi 7.13.0 atau lebih baru.
Anda harus memiliki Lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Dapatkan lisensi untuk ApsaraVideo Player SDK.
Fitur peningkatan audio mendukung sumber audio berikut:
Stream VOD: Memerlukan transkoding media di ApsaraVideo VOD.
Stream langsung: Semua sumber didukung.
Integrasikan plugin
Integrasi CocoaPods
Tambahkan dependensi plugin ke file Podfile Anda:
Untuk versi terbaru ApsaraVideo Player SDK untuk iOS, lihat Catatan rilis untuk ApsaraVideo Player SDK untuk iOS.
// x.x.x harus sesuai dengan versi player SDK.
pod 'AliPlayerSDK_iOS_AUDIO_ENHANCE_FILTER', 'x.x.x'Integrasi lokal
Unduh versi terbaru ApsaraVideo Player SDK untuk iOS. Tambahkan file audioEnhanceFilter.framework ke bagian Frameworks, Libraries, and Embedded Content, atur Embed menjadi Embed & Sign, lalu konfigurasikan Framework Search Paths. Untuk informasi selengkapnya, lihat Integrasi lokal.
API
setFilterValid
Mengontrol sakelar utama fitur peningkatan audio. Nama target filter peningkatan audio adalah audioEnhance. Menonaktifkan fitur ini juga akan menonaktifkan semua sub-fiturnya. Secara default, fitur ini dinonaktifkan.
[player setFilterValid:@"audioEnhance" valid:YES]; // Aktifkan
[player setFilterValid:@"audioEnhance" valid:NO]; // NonaktifkansetFilterConfig
Atur objek FilterConfig sebelum memanggil metode prepare. Konfigurasi ini berlaku saat pemutaran dimulai.
AVPFilterConfig *filterConfig = [[AVPFilterConfig alloc] init];
AVPFilter *filterItem = [[AVPFilter alloc] initWithTarget:@"audioEnhance"];
AVPFilterOptions *opts = [[AVPFilterOptions alloc] init];
// Suara surround
[opts setOptions:@"enable_surround" value:@YES];
[opts setOptions:@"surround_effect_type" value:@"3DSurround"]; // Jenis harus diatur saat Anda pertama kali mengaktifkan suara surround.
// Peningkatan dialog
[opts setOptions:@"enable_dialoguenhance" value:@YES];
[opts setOptions:@"dialoguenhance_voice" value:@(1.0)]; // Rentang: 1.0 hingga 10.0. Tingkat suara harus diatur saat Anda pertama kali mengaktifkan peningkatan dialog.
// Normalisasi volume
[opts setOptions:@"enable_normalizer" value:@YES];
[filterItem setOptions:opts];
[filterConfig addFilter:filterItem];
[player setFilterConfig:filterConfig];Parameter | Jenis | Deskripsi |
| Boolean | Menentukan apakah akan mengaktifkan fitur suara surround. |
| String | Mode suara surround. Nilai valid: |
| Boolean | Menentukan apakah akan mengaktifkan fitur peningkatan dialog. |
| Float | Intensitas peningkatan dialog. Rentang: 1.0 hingga 10.0. |
| Boolean | Menentukan apakah akan mengaktifkan fitur normalisasi volume. |
updateFilterConfig
Panggil metode ini untuk menyesuaikan parameter secara dinamis setelah pemutar disiapkan atau selama pemutaran.
Pemanggilan updateFilterConfig sebelum metode prepare tidak berpengaruh. Gunakan metode setFilterConfig untuk konfigurasi awal.
AVPFilterOptions *opts = [[AVPFilterOptions alloc] init];
[opts setOptions:@"enable_surround" value:@YES];
[opts setOptions:@"surround_effect_type" value:@"3DSurround"]; // Jenis hanya dapat diatur saat mengaktifkan suara surround untuk pertama kalinya. Diabaikan pada panggilan berikutnya karena filter sudah diinisialisasi.
[player updateFilterConfig:@"audioEnhance" options:opts];Jenis suara surround ("3DSurround" atau "MegaBass") dan kekuatan peningkatan dialog (dialoguenhance_voice) harus dikonfigurasi bersamaan dengan properti enable saat pertama kali diaktifkan. Jika tidak, nilai-nilai tersebut akan diinisialisasi ke nilai default ("3DSurround" untuk suara surround dan 1,0 untuk kekuatan peningkatan dialog) dan tidak dapat diubah selama pemutaran.
Kinerja
Atur skenario pemutar
Mengatur skenario pemutar secara otomatis menerapkan parameter optimal untuk skenario tersebut, seperti pengaturan buffer dan toggle fitur. Parameter kustom yang Anda atur dengan metode setConfig menggantikan default skenario.
Setelah Anda mengatur skenario pemutar, Anda dapat memanggil metode
getConfiguntuk melihat konfigurasi yang berlaku.
Contoh API
/**
@brief Mengatur skenario pemutar.
@param scene Skenario pemutar.
@see AVPScene
*/
-(void) setPlayerScene:(AVPScene)scene;Skenario pemutar
typedef enum _AVPScene {
/**
* Tidak ada skenario khusus yang diatur.
*/
SceneNone,
/**
* Skenario video panjang, cocok untuk video lebih dari 30 menit.
*/
SceneLong,
/**
* Skenario video menengah, cocok untuk video antara 5 hingga 30 menit.
*/
SceneMedium,
/**
* Skenario video pendek, cocok untuk video hingga 5 menit.
*/
SceneShort,
/**
* Skenario streaming langsung.
*/
SceneLive,
/**
* Skenario RTS langsung.
*/
SceneRTSLive
} AVPScene;Penggunaan
// Atur skenario video pendek.
[self.player setPlayerScene:SceneShort];
// Atur skenario video menengah.
[self.player setPlayerScene:SceneMedium];
// Atur skenario video panjang.
[self.player setPlayerScene:SceneLong];
// Atur skenario streaming langsung.
[self.player setPlayerScene:SceneLive]; Pre-rendering
Alibaba Cloud Player SDK untuk iOS dapat merender frame pertama video sebelum pemutaran dimulai, yang dapat meningkatkan kecepatan startup.
Fitur ini dinonaktifkan secara default.
Anda harus mengatur
Viewpemutar sebelum memanggilPrepareuntuk memastikan frame dirender keViewsegera setelah siap.Mengaktifkan fitur ini memengaruhi urutan pemicuan event keberhasilan persiapan dan rendering frame pertama. Saat fitur ini dinonaktifkan, event keberhasilan persiapan dipicu sebelum event rendering frame pertama. Saat fitur ini diaktifkan, event rendering frame pertama dapat dipicu sebelum event keberhasilan persiapan, tergantung pada kecepatan decoding dan rendering. Hal ini tidak memengaruhi pemutaran.
Contoh berikut menunjukkan cara mengaktifkan fitur ini:
[self.player setOption:ALLOW_PRE_RENDER valueInt:1];Cache lokal
Untuk contoh kode terperinci, lihat modul PreloadUrl di proyek API-Example. Proyek sampel ini, yang ditulis dalam Objective-C, menunjukkan cara mengintegrasikan fitur inti Alibaba Cloud Player SDK untuk iOS.
Alibaba Cloud Player SDK untuk iOS menyediakan fitur cache lokal. Fitur ini meningkatkan kecepatan startup dan kecepatan pencarian, mengurangi tersendat, dan menghemat lalu lintas jaringan selama pemutaran berulang.
Aktifkan cache lokal
Fitur cache lokal dinonaktifkan secara default. Untuk menggunakan fitur ini, Anda harus mengaktifkannya dengan metode enableLocalCache dari kelas AliPlayerGlobalSettings. Contoh berikut menunjukkan caranya.
/**
* Mengaktifkan cache lokal. Saat diaktifkan, konten di-cache ke file lokal.
* @param enable Nilai boolean yang menentukan apakah akan mengaktifkan cache lokal. true: diaktifkan, false: dinonaktifkan. Nilai default: false.
* @param maxBufferMemoryKB Parameter ini tidak digunakan lagi di v5.4.7.1 dan lebih baru dan tidak berpengaruh.
* @param localCacheDir Direktori untuk file cache lokal. Anda harus menentukan jalur mutlak.
*/
[AliPlayerGlobalSettings enableLocalCache:true maxBufferMemoryKB:1024 localCacheDir:@""];
/**
@brief Mengonfigurasi pembersihan otomatis file cache lokal.
@param expireMin Parameter ini tidak digunakan lagi di v5.4.7.1 dan lebih baru dan tidak berpengaruh.
@param maxCapacityMB Ukuran cache maksimum dalam MB. Nilai default: 20 GB. Selama pembersihan, jika ukuran total cache melebihi batas ini, item cache terlama dihapus satu per satu hingga ukuran total berada dalam batas.
@param freeStorageMB Ruang disk kosong minimum dalam MB. Nilai default: 0. Selama pembersihan, jika ruang disk yang tersedia kurang dari nilai ini, file cache dihapus satu per satu hingga ruang kosong sama dengan atau lebih besar dari nilai ini, atau hingga semua file cache dihapus.
*/
[AliPlayerGlobalSettings setCacheFileClearConfig:0 maxCapacityMB:0 freeStorageMB:0];
/**
* Callback untuk mendapatkan nilai hash URL. Nilai ini digunakan sebagai ID unik untuk URL. Anda harus memastikan bahwa setiap URL memiliki nilai hash yang unik.
*/
// Anda harus mengimplementasikan fungsi ini dan meneruskan pointer-nya ke setCacheUrlHashCallback.
static NSString *CaheUrlHashHandle(NSString *url) {
return @"xxx";
}
[AliPlayerGlobalSettings setCacheUrlHashCallback:&CaheUrlHashHandle];Jika URL pemutaran video berisi parameter autentikasi, parameter ini dapat berubah selama caching lokal dan pemutaran. Untuk meningkatkan tingkat hit cache untuk URL yang sama dengan parameter autentikasi berbeda, Anda dapat menghapus parameter autentikasi dari URL sebelum menghitung nilai hash (misalnya, MD5) dengan menggunakan antarmuka
setCacheUrlHashCallback. Misalnya, jika URL pemutaran adalahhttp://****.mp4?aaa, gunakanhttp://****.mp4untuk menghitung nilai hash. Namun, untuk video M3U8 terenkripsi, jika Anda menghitung nilai hash keyURL-nya setelah menghapus parameter autentikasi, video yang berbeda mungkin mengenai kunci cache yang sama, menyebabkan pemutaran gagal. Solusi: Dalam callbacksetCacheUrlHashCallback, periksa nama domain dan hapus parameter autentikasi hanya dari URL pemutaran (http(s)://xxxxx.m3u8?aaaa), tetapi tidak dari keyURL (http(s)://yyyyy?bbbb).
Jika server menyajikan file media yang sama melalui HTTP dan HTTPS, Anda dapat meningkatkan tingkat hit cache dengan menghapus atau menormalkan protokol sebelum menghitung nilai hash. Misalnya:
Jika URL pemutaran adalah
https://****.mp4danhttp://****.mp4, gunakan****.mp4untuk menghitung nilai hash.Jika URL pemutaran adalah
https://****.mp4, Anda dapat secara konsisten menggunakanhttp://****.mp4untuk menghitung nilai hash.
Untuk Alibaba Cloud Player SDK v5.5.4.0 dan lebih baru, jika Anda memutar stream HLS dengan URL yang berisi parameter autentikasi, Anda dapat mengatur field
AVPConfig.enableStrictAuthModeuntuk memilih mode autentikasi. Nilai default adalahfalseuntuk versi lama dantrueuntuk v7.13.0 dan lebih baru.Autentikasi non-ketat (
false): Informasi autentikasi di-cache bersama konten media. Jika hanya sebagian media yang di-cache sebelumnya, pemutar menggunakan informasi autentikasi yang di-cache untuk meminta bagian yang belum di-cache. Jika autentikasi URL memiliki masa berlaku singkat atau jika pemutaran dilanjutkan setelah jeda panjang, autentikasi mungkin kedaluwarsa. Untuk menangani hal ini, Anda perlu mengimplementasikan fitur penyegaran sumber otomatis.Autentikasi ketat (
true): Informasi autentikasi tidak di-cache. Autentikasi terjadi di awal setiap sesi pemutaran. Hal ini dapat menyebabkan pemutaran gagal jika tidak ada koneksi jaringan.
Aktifkan atau nonaktifkan cache untuk URL
Jika Anda ingin menonaktifkan fitur cache lokal untuk satu URL, Anda dapat mengonfigurasinya dalam konfigurasi pemutar. Berikut contohnya:
// Dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Menentukan apakah akan mengaktifkan caching lokal untuk URL pemutaran. Nilai default: true.
// Untuk mengaktifkan caching lokal untuk URL ini, pengaturan ini dan pengaturan global di AliPlayerGlobalSettings harus diaktifkan.
// Jika diatur ke false, caching lokal dinonaktifkan untuk URL ini.
config.enableLocalCache = false;
....// Pengaturan lainnya
// Terapkan konfigurasi ke pemutar.
[self.player setConfig:config];Gunakan jalur cache default
Untuk menggunakan jalur cache default, aktifkan caching lokal tanpa menentukan direktori di AliPlayerGlobalSettings.
[AliPlayerGlobalSettings enableLocalCache:true];Preloading
Alibaba Cloud Player SDK untuk iOS menyediakan fitur preloading, yang merupakan peningkatan dari cache lokal. Preloading mengunduh sebagian video ke cache sebelum pemutaran dimulai, meningkatkan kecepatan startup.
Preloading memiliki batasan berikut:
Hanya mendukung file media tunggal, seperti MP4, MP3, FLV, dan HLS.
Secara default, Alibaba Cloud Player SDK untuk iOS secara otomatis menjadwalkan sumber daya jaringan untuk preloading guna meminimalkan gangguan pada video yang sedang diputar. Permintaan preload hanya dikirim setelah buffer video yang sedang diputar mencapai ambang batas tertentu. Untuk menonaktifkan perilaku ini dan mengelola permintaan preload secara real-time, panggil metode berikut:
[AliPlayerGlobalSettings enableNetworkBalance:false];Aktifkan fitur cache lokal seperti yang dijelaskan di Cache lokal.
Atur sumber data.
VidAuth (direkomendasikan)
AVPVidAuthSource* vidAuthSource = [[AVPVidAuthSource alloc] init]; [vidAuthSource setVid:@"your_video_id"]; // Wajib. ID video. [vidAuthSource setPlayAuth:@"<yourPlayAuth>"]; // Wajib. Kredensial pemutaran. Anda harus memanggil operasi GetVideoPlayAuth ApsaraVideo untuk VOD untuk menghasilkan kredensial. [vidAuthSource setRegion:@"your_region"]; // Parameter ini tidak digunakan lagi di SDK v5.5.5.0 dan lebih baru. Pemutar secara otomatis mengurai wilayah. Untuk versi sebelumnya, parameter ini wajib dan default ke cn-shanghai. [vidAuthSource setQuality:@"AUTO"]; // "AUTO" mengaktifkan streaming bitrate adaptif.VidSts
AVPVidStsSource* vidStsSource = [[AVPVidStsSource alloc] init]; [vidStsSource setVid: @""]; // Wajib. ID video. [vidStsSource setRegion:@""]; // Wajib. Wilayah tempat ApsaraVideo VOD diaktifkan. Nilai default: cn-shanghai. [vidStsSource setSecurityToken: @"<yourSecurityToken>"]; // Wajib. Token keamanan STS. Anda harus memanggil operasi API AssumeRole STS untuk mendapatkan token. [vidStsSource setAccessKeySecret: @"<yourAccessKeySecret>"]; // Wajib. Rahasia AccessKey dari pasangan kunci akses STS sementara. Anda harus memanggil operasi API AssumeRole STS untuk mendapatkan rahasia AccessKey. [vidStsSource setAccessKeyId: @"<yourAccessKeyId>"]; // Wajib. ID AccessKey dari pasangan kunci akses STS sementara. Anda harus memanggil operasi API AssumeRole STS untuk mendapatkan ID AccessKey. [vidStsSource setQuality:@""]; // "AUTO" menentukan streaming bitrate adaptif.UrlSource
NSString* url = @"your_playback_url"; // Wajib. URL pemutaran. Dapat berupa URL VOD pihak ketiga atau URL pemutaran dari ApsaraVideo untuk VOD. AVPUrlSource* urlSource = [[AVPUrlSource alloc]urlWithString:url];Atur parameter tugas.
CatatanParameter ini hanya berlaku untuk video multi-bitrate. Anda hanya perlu mengatur salah satu dari
setDefaultBandWidth,setDefaultResolution, dansetDefaultQuality.AVPPreloadConfig *config = [[AVPPreloadConfig alloc]init]; // Atur bitrate preload untuk stream multi-bitrate. [config setDefaultBandWidth:400000]; // Atur resolusi preload untuk stream multi-bitrate. [config setDefaultResolution:640 * 480]; // Atur kualitas preload untuk stream multi-bitrate. [config setDefaultQuality:@"FD"]; // Atur durasi preload. [config setDuration:1000];Tambahkan listener tugas.
Buat tugas, tambahkan ke instans
MediaLoaderV2, dan mulai preloading.VidAuth (direkomendasikan)
// Buat tugas preload. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidAuthSource:vidAuthSource preloadConfig:config]; // Dapatkan instans MediaLoaderV2. AliMediaLoaderV2* vodMedialoader = [AliMediaLoaderV2 shareInstance]; // Tambahkan tugas dan mulai preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];VidSts
// Buat tugas preload. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidStsSource:vidStsSource preloadConfig:config]; // Dapatkan instans MediaLoaderV2. AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init]; // Tambahkan tugas dan mulai preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];UrlSource
// Buat tugas preload. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithUrlSource:urlSource preloadConfig:config]; // Dapatkan instans MediaLoaderV2. AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init]; // Tambahkan tugas dan mulai preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];Opsi: Kelola tugas.
[vodMedialoader cancelTask:taskId];// Batalkan tugas preload dengan ID yang ditentukan. [vodMedialoader pauseTask:taskId];// Jeda tugas preload dengan ID yang ditentukan. [vodMedialoader resumeTask:taskId];// Lanjutkan tugas preload dengan ID yang ditentukan.Opsional: Hapus file yang diunggah.
Untuk menghemat ruang, Anda dapat menghapus file cache. Karena Alibaba Cloud Player SDK untuk iOS tidak menyediakan antarmuka penghapusan, Anda harus menghapus file secara manual dari direktori cache dalam aplikasi Anda.
Preloading dinamis
Strategi preloading dinamis memungkinkan Anda mengontrol caching untuk video saat ini dan jumlah video yang akan dipreloading. Hal ini membantu Anda menyeimbangkan pengalaman pemutaran dengan biaya.
Preloading video HLS multi-bitrate
Dalam skenario listPlayer dengan video HLS multi-bitrate, Anda dapat mempreloading stream yang sesuai dengan kualitas pemutaran saat ini dan memilih mode preload yang sesuai dengan kebutuhan bisnis Anda.
Kecepatan unduh
Anda dapat mendapatkan kecepatan unduh video yang sedang diputar dari parameter speed dalam callback onCurrentDownloadSpeed. Contoh berikut menunjukkan caranya.
- (void)onCurrentDownloadSpeed:(AliPlayer *)player speed:(int64_t)speed{
intspeed_=speed;
}Fitur jaringan
HTTPDNS
HTTPDNS menyelesaikan nama domain dengan mengirim permintaan ke server HTTPDNS khusus melalui HTTP. Proses ini memberikan resolusi nama domain yang lebih cepat dan stabil serta mengurangi risiko pembajakan DNS.
Alibaba Cloud Player SDK menyediakan fitur HTTPDNS yang ditingkatkan khusus untuk nama domain CDN Alibaba Cloud. Fitur ini mendukung penjadwalan jaringan yang tepat dan pembaruan resolusi secara real-time untuk meningkatkan kinerja jaringan.
Contoh HTTPDNS yang ditingkatkan
Fitur HTTPDNS yang ditingkatkan hanya tersedia untuk nama domain CDN Alibaba Cloud. Pastikan Anda menggunakan nama domain CDN Alibaba Cloud yang dikonfigurasi dan beroperasi dengan benar. Untuk menambah dan mengonfigurasi nama domain yang dipercepat di Alibaba Cloud VOD, lihat Tambahkan nama domain yang dipercepat. Untuk informasi lebih lanjut tentang nama domain CDN, lihat Alibaba Cloud CDN.
// Aktifkan HTTPDNS yang ditingkatkan.
[AliPlayerGlobalSettings enableEnhancedHttpDns:YES];
// Opsional. Tambahkan nama domain untuk pra-resolusi HTTPDNS.
[[AliDomainProcessor shareInstance] addPreResolveDomain:@"player.***alicdn.com"];HTTP/2
Mulai dari v5.5.0.0, Alibaba Cloud Player SDK untuk iOS mengaktifkan HTTP/2 secara default.
Alibaba Cloud Player SDK untuk iOS mendukung HTTP/2, yang menggunakan multiplexing untuk menghindari head-of-line blocking dan meningkatkan kinerja pemutaran. Contoh:
[AliPlayerGlobalSettings setUseHttp2:true];Pra-koneksi TCP
Untuk permintaan pemutaran video HTTP (bukan HTTPS), membuat koneksi TCP terlebih dahulu secara signifikan meningkatkan pengalaman pengguna dengan mengurangi waktu koneksi, memastikan pemutaran segera dan berkelanjutan, serta mengoptimalkan penggunaan sumber daya jaringan dan sistem. Contoh:
// Format domain adalah host[:port]. Port opsional. Gunakan titik koma (;) untuk memisahkan beberapa nama domain.
// Pengaturan global.
// Ini adalah pengaturan absolut. Setiap kali Anda memanggil metode ini, string baru menggantikan yang sebelumnya. String kosong menonaktifkan koneksi awal.
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];Unduh video
Untuk contoh kode terperinci, lihat modul Unduh Video dan Pemutaran Offline (Unduh) di API-Example. Proyek sampel Objective-C ini menunjukkan cara mengintegrasikan fitur inti ApsaraVideo Player SDK untuk iOS.
ApsaraVideo Player SDK untuk iOS memungkinkan Anda mengunduh konten ApsaraVideo VOD untuk pemutaran offline. SDK menawarkan dua mode unduh: unduh standar dan unduh aman.
Unduh standar: Data video yang diunduh tidak dienkripsi oleh Alibaba Cloud dan dapat diputar menggunakan pemutar pihak ketiga.
Unduh aman: Data video yang diunduh dienkripsi oleh Alibaba Cloud. Data ini tidak dapat diputar oleh pemutar pihak ketiga dan hanya dapat diputar menggunakan ApsaraVideo Player.
Penggunaan
Fitur unduh video hanya tersedia untuk sumber VidSts dan VidAuth.
Untuk menggunakan fitur unduh video, Anda harus mengaktifkan dan mengonfigurasi mode unduh di konsol ApsaraVideo VOD. Untuk informasi lebih lanjut, lihat unduh offline.
Fitur unduh video mendukung unduhan yang dapat dilanjutkan.
Prosedur
Opsi: Konfigurasikan file kunci untuk unduh aman. Langkah ini hanya diperlukan untuk unduh aman.
CatatanPastikan informasi dalam file kunci yang dikonfigurasi sesuai dengan informasi aplikasi Anda. Jika tidak, unduh video akan gagal.
Jika Anda menggunakan mode unduh aman, Anda harus mengonfigurasi ApsaraVideo Player SDK dengan file kunci yang Anda hasilkan di konsol ApsaraVideo VOD. File ini digunakan untuk dekripsi dan verifikasi selama unduh dan pemutaran video. Untuk instruksi cara menghasilkan file kunci, lihat Aktifkan unduh aman.
Lakukan konfigurasi ini hanya sekali dalam aplikasi Anda, seperti pada contoh berikut:
NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"]; [AliPrivateService initKey:encrptyFilePath];Buat dan konfigurasikan downloader.
Kode berikut memberikan contoh:
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self];Atur listener event.
Downloader mendukung beberapa listener event. Kode berikut memberikan contoh:
-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { // Item unduh berhasil disiapkan. } -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel { // Terjadi kesalahan selama unduh. } -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { // Persentase progres unduh. } -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { // Persentase progres pemrosesan. } -(void)onCompletion:(AliMediaDownloader *)downloader { // Unduh berhasil. }Siapkan sumber unduh.
Panggil metode
prepareuntuk menyiapkan sumber unduh. Sumber VidSts dan VidAuth didukung. Kode berikut memberikan contoh:VidSts
// Buat sumber VidSts. AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init]; stsSource.region = @"your_region"; // Wilayah layanan ApsaraVideo VOD Anda. Nilai default: cn-shanghai. stsSource.vid = @"your_video_id"; // ID video. stsSource.securityToken = @"<yourSecurityToken>"; // Token keamanan STS. Untuk mendapatkan token ini, panggil operasi STS AssumeRole. stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // Rahasia AccessKey dari kredensial STS sementara. Untuk mendapatkan rahasia ini, panggil operasi STS AssumeRole. stsSource.accessKeyId = @"<yourAccessKeyId>"; // ID AccessKey dari kredensial STS sementara. Untuk mendapatkan ID ini, panggil operasi STS AssumeRole. // Jika Anda telah mengaktifkan pass-through parameter untuk enkripsi HLS di konsol ApsaraVideo VOD // dan nama parameter default adalah MtsHlsUriToken, Anda harus mengatur config dan meneruskannya ke sumber VidSts. // Jika fitur ini tidak diaktifkan, Anda dapat melewati kode berikut. VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init]; [vp setHlsUriToken:yourMtsHlsUriToken]; stsSource.playConfig = [vp generatePlayerConfig]; // Siapkan sumber unduh. [downloader prepareWithVid:stsSource];VidAuth
// Buat sumber VidAuth. AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"your_video_id"; // ID video. authSource.playAuth = @"<yourPlayAuth>"; // Kredensial pemutaran. Untuk mendapatkan kredensial ini, panggil operasi ApsaraVideo VOD GetVideoPlayAuth. authSource.region = @"your_region"; // Tidak digunakan lagi di ApsaraVideo Player SDK V5.5.5.0 dan lebih baru karena pemutar secara otomatis mengurai wilayah. // Wajib untuk versi sebelumnya. // Wilayah layanan ApsaraVideo VOD Anda. Nilai default: cn-shanghai. // Jika Anda telah mengaktifkan pass-through parameter untuk enkripsi HLS di konsol ApsaraVideo VOD // dan nama parameter default adalah MtsHlsUriToken, Anda harus mengatur config dan meneruskannya ke sumber VidAuth. // Jika fitur ini tidak diaktifkan, Anda dapat melewati kode berikut. VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init]; [vp setHlsUriToken:yourMtsHlsUriToken]; authSource.playConfig = [vp generatePlayerConfig]; // Siapkan sumber unduh. [downloader prepareWithVid:authSource];
CatatanJika Anda mengaktifkan pass-through parameter untuk enkripsi HLS di konsol ApsaraVideo VOD dan nama parameter default adalah MtsHlsUriToken, Anda harus mengatur nilai MtsHlsUriToken dalam sumber unduh seperti yang ditunjukkan dalam kode di atas. Untuk informasi lebih lanjut, lihat pass-through parameter untuk enkripsi HLS.
Pilih track video setelah sumber disiapkan.
Setelah sumber unduh disiapkan, metode
onPrepareddipanggil. ParametermediaInfodari callback berisi informasi tentang setiap track video yang tersedia, seperti kualitas video. Pilih track untuk diunduh. Kode berikut memberikan contoh:-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { NSArray<AVPTrackInfo*>* tracks = info.tracks; // Misalnya, untuk mengunduh track pertama: [downloader selectTrack:[tracks objectAtIndex:0].trackIndex]; }Perbarui sumber unduh dan mulai unduh.
Untuk mencegah kredensial VidSts dan VidAuth kedaluwarsa, kami merekomendasikan memperbarui informasi sumber sebelum Anda memulai unduh. Kode berikut memberikan contoh:
// Perbarui sumber unduh. [downloader updateWithVid:vidSource] // Mulai unduh. [downloader start];Lepaskan downloader setelah unduh selesai atau gagal.
Panggil metode
destroyuntuk melepaskan downloader.[self.downloader destroy]; self.downloader = nil;
Pemutaran terenkripsi
ApsaraVideo VOD mendukung enkripsi standar HLS, enkripsi eksklusif Alibaba Cloud, dan enkripsi DRM. Video langsung hanya mendukung enkripsi DRM. Untuk informasi lebih lanjut, lihat Pemutaran terenkripsi.
Pemutaran RTS native
iOS player SDK mengintegrasikan Native RTS SDK untuk mengaktifkan streaming langsung berlatensi rendah. Untuk informasi lebih lanjut, lihat Implementasikan penarikan aliran berbasis RTS di iOS.