Topik ini memberikan contoh penggunaan fitur lanjutan ApsaraVideo Player SDK untuk iOS. Untuk panduan lengkap semua fitur, lihat referensi API.
Untuk menjalankan demo, Anda dapat mengunduh dan mengikuti petunjuk di Jalankan demo untuk mengompilasi dan menjalankan proyek.
Verifikasi kemampuan profesional
Beberapa fitur ApsaraVideo Player memerlukan lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Fitur ApsaraVideo Player SDK. Untuk menggunakan fitur tersebut, Anda harus mendapatkan lisensi seperti yang dijelaskan di Dapatkan lisensi untuk ApsaraVideo Player SDK.
Anda dapat mengatur listener saat aplikasi dimulai atau sebelum memanggil operasi API player apa pun.
void premiumVeryfyCallback(AVPPremiumBizType biztype, bool isValid, NSString* errorMsg) {
NSLog(@"onPremiumLicenseVerifyCallback: %d, isValid: %d, errorMsg: %@", biztype, isValid, errorMsg);
}
[AliPrivateService setOnPremiumLicenseVerifyCallback:premiumVeryfyCallback];AVPPremiumBizType adalah tipe enumerasi untuk fitur premium. Saat fitur terkait digunakan, player memvalidasi fitur tersebut dan mengembalikan hasil melalui callback ini. Jika isValid bernilai false, errorMsg berisi alasan spesifiknya.
Pemutaran
List playback
ApsaraVideo Player SDK untuk iOS menyediakan fitur list playback komprehensif untuk skenario list playback khas. Fitur-fitur ini, dikombinasikan dengan mekanisme seperti preloading, secara signifikan meningkatkan kecepatan loading frame pertama untuk video pendek.
Untuk pengalaman list playback yang lebih baik, kami menyarankan Anda menggunakan solusi drama video pendek kami. Untuk informasi selengkapnya, lihat Pengembangan sisi klien untuk drama video pendek.
Putar video dengan transparansi
Deskripsi fitur
ApsaraVideo Player SDK mendukung rendering saluran alpha untuk menciptakan efek dinamis hadiah transparan. Dalam skenario seperti saluran langsung, Anda dapat memutar efek dinamis hadiah transparan tanpa menghalangi konten di saluran langsung, sehingga secara signifikan meningkatkan pengalaman menonton dan interaksi pengguna.
Batasan
Fitur rendering transparan didukung di All-in-One SDK V6.8.0 ke atas atau ApsaraVideo Player SDK V6.9.0 ke atas.
Keunggulan
Menggunakan video MP4 dengan informasi transparansi sebagai efek hadiah memberikan kualitas animasi yang lebih baik, ukuran file lebih kecil, kompatibilitas lebih tinggi, dan efisiensi pengembangan lebih tinggi. Hal ini memungkinkan efek hadiah ditampilkan kepada pengguna dan meningkatkan pengalaman pengguna.
Kualitas animasi lebih baik: Video MP4 dapat mempertahankan kualitas animasi asli, termasuk detail dan warna. Dibandingkan dengan format lain seperti APNG atau IXD, MP4 dapat lebih akurat mengembalikan efek animasi yang dibuat oleh desainer.
Ukuran file lebih kecil: File video MP4 dapat dikompresi lebih efektif dibandingkan format lain seperti APNG atau IXD, sehingga meningkatkan kecepatan pemuatan dan mengurangi konsumsi lebar pita jaringan.
Kompatibilitas lebih tinggi: MP4 adalah format video universal yang didukung luas di berbagai perangkat dan browser, memungkinkan pemutaran dan penontonan efek hadiah di perangkat utama.
Efisiensi pengembangan lebih tinggi: Solusi teknis menggunakan video MP4 sebagai efek hadiah relatif sederhana. Developer tidak perlu meneliti dan mengimplementasikan logika parsing dan rendering yang kompleks, sehingga dapat fokus pada fitur lain dan meningkatkan efisiensi pengembangan.
Rendering Metal
ApsaraVideo Player SDK untuk iOS mendukung rendering video menggunakan framework Metal.
Saat ini, hanya fitur warna latar, mode penskalaan, dan Picture-in-Picture (PiP) yang didukung.
Item konfigurasi
/**
@brief Tipe rendering video. 0 menunjukkan renderer default. 1 menunjukkan renderer campuran. Nilai default: 0.
*/
@property(nonatomic, assign) int videoRenderType;Contoh penggunaan
AVPConfig *config = [self.player getConfig];
// Gunakan metode rendering Metal.
config.videoRenderType = 1;
[self.player setConfig:config];
[self.player prepare];Caption eksternal
Untuk contoh kode detail, lihat modul Demo Subtitle Eksternal dan Pergantian (ExternalSubtitle) di API-Example. Proyek ini adalah proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.
ApsaraVideo Player SDK untuk iOS mendukung penambahan dan pergantian caption eksternal. SDK mendukung format caption SRT, SSA, ASS, dan VTT.
Kode berikut memberikan contohnya:
Buat view untuk menampilkan caption.
Anda dapat membuat view berbeda untuk format caption berbeda.
// Inisialisasi subTitleLabel kustom. UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame]; // Tambahkan caption ke superView kustom. superView adalah view induk yang ada di antarmuka kustom. [superView addSubview:subTitleLabel];Atur listener terkait caption.
// Caption eksternal ditambahkan. - (void)onSubtitleExtAdded:(AliPlayer*)player trackIndex:(int)trackIndex URL:(NSString *)URL {} // Callback untuk informasi header caption. - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header{} // Callback untuk menampilkan caption. - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle { subTitleLabel.text =subtitle; subTitleLabel.tag =subtitleID; } // Callback untuk menyembunyikan caption. - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID{ [subTitleLabel removeFromSuperview]; }Tambahkan caption.
[self.player addExtSubtitle:URL];Ganti caption.
[self.player selectExtSubtitle:trackIndexenable:YES];
Pemutaran hanya audio
Anda dapat menonaktifkan pemutaran video untuk mencapai pemutaran hanya audio. Anda harus mengonfigurasi PlayerConfig sebelum menyiapkan player.
AVPConfig *config = [self.player getConfig];
config.disableVideo = YES;
[self.player setConfig:config];Ganti antara decoding software dan hardware
ApsaraVideo Player SDK untuk iOS menyediakan kemampuan decoding hardware untuk H.264 dan H.265. SDK juga menyediakan sakelar enableHardwareDecoder yang diaktifkan secara default. Jika inisialisasi decoding hardware gagal, player secara otomatis beralih ke decoding software untuk memastikan pemutaran video normal. Kode berikut memberikan contohnya:
// Aktifkan decoding hardware. Ini diaktifkan secara default.
self.player.enableHardwareDecoder = YES;Jika player secara otomatis beralih dari decoding hardware ke decoding software, callback onPlayerEvent dipanggil. Kode berikut memberikan contohnya:
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_SWITCH_TO_SOFTWARE_DECODER) {
// Beralih ke decoding software.
}
}Pemutaran H.265 adaptif
Jika model perangkat saat ini berada dalam pustaka model daftar hitam H.265 berbasis cloud atau jika decoding hardware aliran H.265 gagal, fallback adaptif dipicu. Proses fallback sebagai berikut: Jika aliran cadangan H.264 diatur, aliran cadangan H.264 diputar secara otomatis. Jika tidak ada aliran cadangan H.264 yang diatur, player secara otomatis fallback ke decoding software H.265.
Fitur ini hanya diaktifkan setelah Anda mengaktifkan layanan bernilai tambah decoding adaptif yang dikombinasikan dengan cloud dan klien. Anda harus mengirimkan formulir Yida untuk mengajukan lisensi.
Layanan bernilai tambah decoding adaptif yang dikombinasikan dengan cloud dan klien terutama mencakup: 1. Pengiriman dinamis data kompatibilitas decoding hardware berbasis cloud. 2. Fallback adaptif dari aliran H.265 ke aliran H.264.
SDK masih dapat secara otomatis beralih ke decoding software saat decoding hardware gagal, bahkan jika layanan bernilai tambah tidak diaktifkan.
Kode berikut menunjukkan cara mengatur aliran cadangan:
// Lapisan aplikasi memelihara peta yang menyimpan semua pasangan kunci-nilai URL asli dan URL cadangan. Saat beralih, kueri URL cadangan di peta berdasarkan URL asli.
NSString* getBackupUrlCallback(AVPBizScene scene, AVPCodecType codecType, NSString* oriurl){
NSMutableDictionary *globalMap = [AliPlayerViewController getGlobalBackupUrlMap];
NSString *backupUrl = globalMap[oriurl];
return backupUrl;
}
[AliPlayerGlobalSettings setAdaptiveDecoderGetBackupURLCallback:getBackupUrlCallback];Ganti definisi video secara adaptif berdasarkan kondisi jaringan
Anda dapat menghasilkan aliran video adaptif multi-bitrate HLS dengan mentranskode menggunakan kelompok template transkoding pengemasan video di ApsaraVideo VOD. Untuk informasi selengkapnya, lihat Konfigurasikan adaptive bitrate streaming untuk ApsaraVideo VOD.
Jika Anda memutar aliran adaptif yang ditranskode oleh ApsaraVideo VOD menggunakan metode Vid, Anda harus mengatur daftar definisi pemutaran default ke
AUTOuntuk mendapatkan dan memutar aliran video adaptif. Jika tidak, player memilih aliran video definisi rendah untuk pemutaran berdasarkan logika default. Untuk informasi selengkapnya tentang urutan pemutaran default definisi, lihat Jika video ditranskode menjadi beberapa definisi, definisi mana yang diputar oleh SDK player secara default?. Kode berikut menunjukkan cara menentukan daftar definisi untuk pemutaran VidAuth:AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.definitions = @"AUTO";
ApsaraVideo Player SDK untuk iOS mendukung aliran video adaptif multi-bitrate HLS dan DASH. Setelah prepare berhasil, Anda dapat memanggil getMediaInfo untuk mendapatkan informasi setiap aliran bitrate, yaitu TrackInfo. Kode berikut memberikan contohnya:
AVPMediaInfo *info = [self.player getMediaInfo];
NSArray<AVPTrackInfo*>* tracks = info.tracks;Selama pemutaran, Anda dapat memanggil metode selectTrack player untuk mengganti aliran bitrate pemutaran. Jika nilainya SELECT_AVPTRACK_TYPE_VIDEO_AUTO, aliran tersebut bersifat adaptif multi-bitrate. Kode berikut memberikan contohnya:// Ganti bitrate.
[self.player selectTrack:track.trackIndex];
// Ganti bitrate dan adaptasi.
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];
// Ganti bitrate.
[self.player selectTrack:track.trackIndex];
// Aktifkan adaptive bitrate streaming.
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];Hasil pergantian dikembalikan dalam callback listener onTrackChanged. Kode berikut memberikan contohnya:
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
if (info.trackType == AVPTRACK_TYPE_VIDEO) {
// video berubah
}
// dll
}Opsional: Sebelum memanggil metode selectTrack player untuk mengganti aliran bitrate pemutaran ke ABR, Anda dapat mengatur batas atas definisi untuk pergantian ABR melalui config. Hal ini mencegah player secara otomatis beralih ke bitrate yang tidak diharapkan. Kode berikut memberikan contohnya: (Kami menyarankan Anda memanggil kode berikut sebelum player memanggil metode prepare atau list player memanggil metode moveTo agar berlaku.)
AVPConfig *config = [self.player getConfig];
config.maxAllowedAbrVideoPixelNumber = 921600; // Atur jumlah maksimum piksel untuk definisi ABR menjadi 921600 (lebar × tinggi = 1280 × 720), sehingga jumlah piksel untuk definisi yang dapat dialihkan ABR kurang dari atau sama dengan nilai ini.
[self.player setConfig:config];Ambil snapshot
ApsaraVideo Player SDK untuk iOS menyediakan fitur untuk mengambil snapshot video saat ini. Fitur ini diimplementasikan oleh operasi API snapShot. Data asli ditangkap, dikonversi ke bitmap, lalu dikembalikan. Antarmuka callback adalah onCaptureScreen. Kode berikut memberikan contohnya:
// Callback snapshot.
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
// Proses snapshot.
}
// Ambil snapshot layar pemutaran saat ini.
[self.player snapShot];Snapshot tidak termasuk antarmuka.
Pratinjau
ApsaraVideo Player SDK untuk iOS, bersama dengan konfigurasi ApsaraVideo VOD, dapat mengimplementasikan fitur pratinjau. SDK mendukung metode pemutaran VidSts dan VidAuth (direkomendasikan untuk ApsaraVideo VOD). Untuk informasi selengkapnya tentang cara mengonfigurasi dan menggunakan fitur pratinjau, lihat Pratinjau video.
Setelah mengonfigurasi fitur pratinjau, Anda dapat menggunakan metode setPreviewTime dari antarmuka VidPlayerConfigGen untuk mengatur durasi pratinjau untuk player. Kode berikut menunjukkan contoh untuk pemutaran VidSts:
AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
....
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setPreviewTime:20]; // Pratinjau 20 detik.
source.playConfig = [vp generatePlayerConfig]; // Atur untuk sumber pemutaran.
...Saat Anda mengatur durasi pratinjau dan memutar video menggunakan ApsaraVideo Player SDK untuk iOS, server tidak mengembalikan konten video lengkap. Sebaliknya, server mengembalikan konten untuk periode pratinjau.
VidPlayerConfigGen mendukung pengaturan parameter permintaan yang didukung oleh server. Untuk informasi selengkapnya, lihat Parameter permintaan.
Atur Referer
ApsaraVideo Player SDK untuk iOS memungkinkan Anda mengatur Referer. Bersama dengan daftar hitam dan daftar putih Referer di konsol, Anda dapat mengontrol izin akses. Anda dapat menggunakan metode AVPConfig untuk mengatur Referer permintaan. Kode berikut menunjukkan contoh untuk ApsaraVideo Player SDK untuk iOS:
// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur Referer.
config.referer = referer;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];Atur User-Agent
ApsaraVideo Player SDK untuk iOS menyediakan AVPConfig untuk mengatur User-Agent (UA) permintaan. Setelah mengatur UA, permintaan player menyertakan informasi UA. Kode berikut memberikan contohnya:
// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur User-Agent.
config.userAgent = userAgent;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];Konfigurasikan waktu dan jumlah retry jaringan
Anda dapat mengatur timeout jaringan dan jumlah retry untuk ApsaraVideo Player SDK untuk iOS menggunakan metode AVPConfig. Kode berikut memberikan contohnya:
// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Atur timeout jaringan dalam milidetik.
config.networkTimeout = 5000;
// Atur jumlah upaya retry saat timeout. Interval setiap retry adalah networkTimeout. networkRetryCount=0 berarti tidak ada retry, dan kebijakan retry ditentukan oleh aplikasi. Nilai default adalah 2.
config.networkRetryCount = 2;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];Jika Anda mengatur networkRetryCount, player akan mencoba ulang sebanyak networkRetryCount kali jika terjadi masalah jaringan dan menyebabkan status loading. Interval setiap retry adalah networkTimeout.
Jika status loading berlanjut setelah beberapa kali retry, event
onErrordipanggil. Dalam kasus ini, AVPErrorModel.code adalah ERROR_LOADING_TIMEOUT.Jika networkRetryCount diatur ke 0, saat waktu retry jaringan habis, player memanggil onPlayerEvent dengan parameter eventWithString diatur ke EVENT_PLAYER_NETWORK_RETRY. Pada titik ini, Anda dapat memanggil metode
reloadplayer untuk memuat ulang jaringan atau melakukan tindakan lain.
Konfigurasikan kontrol cache dan latensi
Kontrol cache sangat penting untuk player. Konfigurasi yang tepat dapat secara efektif mempercepat loading frame pertama dan mengurangi tersendat. ApsaraVideo Player SDK untuk iOS menyediakan antarmuka untuk mengatur kontrol cache dan latensi melalui AVPConfig. Kode berikut memberikan contohnya:
// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Latensi maksimum. Catatan: Ini efektif untuk streaming langsung. Saat latensi tinggi, SDK player akan melakukan sinkronisasi frame untuk memastikan latensi berada dalam rentang ini.
config.maxDelayTime = 5000;
// Durasi buffer maksimum dalam milidetik. Player memuat paling banyak durasi data buffered ini setiap kali.
config.maxBufferDuration = 50000;
// Durasi buffer tinggi dalam milidetik. Saat data sedang dimuat karena kondisi jaringan buruk, jika durasi buffer yang dimuat mencapai nilai ini, status loading berakhir.
config.highBufferDuration = 3000;
// Durasi buffer awal dalam milidetik. Semakin pendek waktu ini diatur, semakin cepat frame pertama dimuat. Namun, juga dapat menyebabkan player memasuki status loading segera setelah pemutaran dimulai.
config.startBufferDuration = 500;
// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];Hubungan antara tiga durasi buffer harus: startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration.
Jika durasi buffer maksimum (mMaxBufferDuration) lebih dari 5 menit, sistem secara default menggunakan 5 menit untuk mencegah pengecualian memori yang disebabkan oleh buffer terlalu besar.
Atur Header HTTP
Menggunakan metode AVPConfig, Anda dapat menambahkan parameter header HTTP ke permintaan player. Kode berikut memberikan contohnya:
// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Definisikan header.
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
// Misalnya, saat menggunakan HTTPDNS, Anda perlu mengatur Host.
[httpHeaders addObject:@"Host:example.com"];
// Atur header.
config.httpHeaders = httpHeaders;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];Picture-in-Picture (PiP)
Untuk contoh kode detail, lihat modul Picture-in-Picture (PictureInPicture) di API-Example. Proyek ini adalah proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.
Persyaratan lingkungan untuk fitur PiP: iOS 15 ke atas, ApsaraVideo Player SDK untuk iOS V5.4.9.0 ke atas.
Versi ApsaraVideo Player SDK untuk iOS sebelum 5.5.2.0 hanya menyediakan metode untuk mengaktifkan dan menonaktifkan PiP, serta menampilkan jendela PiP saat aplikasi berada di latar belakang. Mulai versi 5.5.2.0, SDK mendukung pengaturan delegate PiP dari luar, yang memungkinkan pengembangan fitur PiP yang lebih personal.
Untuk mengaktifkan fitur PiP, pastikan fungsi PiP diaktifkan di pengaturan ponsel Anda ().
Enable PiP
Setelah mengaktifkan fitur PiP, video terus diputar di jendela PiP kecil saat aplikasi dipindahkan ke latar belakang. Saat aplikasi dibawa kembali ke latar depan, video melanjutkan format pemutaran aslinya. Fitur PiP dikontrol oleh sakelar setPictureInPictureEnable. Untuk mengaktifkan fitur PiP, Anda perlu melakukannya dalam status AVPEventPrepareDone. Kode berikut menunjukkan contoh cara mengaktifkan fitur PiP:
- (void)onPlayerEvent:(AliPlayer *)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone:
{
[self.player setPictureInPictureEnable:YES];
}
break;
default:
break;
}
}Saat player memanggil stop untuk menghentikan pemutaran, jendela PiP tidak lagi diperlukan. Anda harus terlebih dahulu menonaktifkan PiP menggunakan sakelar setPictureInPictureEnable, lalu panggil stop.
Set the PiP delegate
Bagian berikut hanya memberikan beberapa contoh kode umum untuk interaksi antara jendela Picture-in-Picture (PiP) dan jendela player. Contoh ini mencakup logika untuk tombol jeda, putar, maju cepat, dan mundur cepat di jendela PiP, serta pemutaran ulang. Untuk detail tentang metode delegate, lihat konten file header AliPlayerPictureInPictureDelegate.h di AliyunPlayer.framework folder SDK di Demo SDK Player.
Atur delegate PiP.
/** * @brief Atur delegate PiP. */ -(void) setPictureinPictureDelegate:(id<AliPlayerPictureInPictureDelegate>)delegate; // Atur delegate PiP. [self.player setPictureinPictureDelegate:self];Tambahkan variabel dan implementasikan antarmuka delegate.
Tambahkan variabel global untuk mengontrol perubahan status player.
#import "YourUIViewController.h" #import <AliyunPlayer/AliyunPlayer.h> @interface YourUIViewController () <AVPDelegate, AliPlayerPictureInPictureDelegate> // Instans player. @property (nonatomic, strong) AliPlayer *player; // Kontainer view player. @property (nonatomic, strong) UIView *playerView; // Dengarkan apakah PiP saat ini dijeda. @property (nonatomic, assign) BOOL isPipPaused; // Dengarkan status pemutaran saat ini dari player, diatur melalui callback newStatus dari listener perubahan status event pemutaran. @property (nonatomic, assign) AVPStatus currentPlayerStatus; // Atur controller PiP. Atur di metode callback yang dipanggil sebelum PiP dimulai. Anda harus secara aktif mengaturnya ke nil saat halaman akan dihancurkan. Kami menyarankan pengaturan ini. @property (nonatomic, weak) AVPictureInPictureController *pipController; // Dengarkan progres pemutaran saat ini dari player. Atur currentPosition ke nilai parameter position di callback untuk posisi pemutaran video saat ini. @property (nonatomic, assign) int64_t currentPosition; @endCatatanpipController harus dimodifikasi dengan weak atau assign. Jika Anda menggunakan assign, perhatikan kapan variabel diatur ke null.
Saat mendengarkan callback antarmuka perubahan status event pemutaran, Anda harus secara aktif memanggil metode berikut untuk memperbarui status terkait controller PiP.
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus { self.currentPlayerStatus = newStatus; if (_pipController) { [self.pipController invalidatePlaybackState]; } }Saat mendengarkan antarmuka callback event pemutaran, Anda harus secara aktif memanggil metode berikut untuk memperbarui status terkait controller PiP.
- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType { if (eventType == AVPEventCompletion) { if (_pipController) { self.isPipPaused = YES; // Setelah pemutaran berakhir, ubah status PiP ke dijeda. [self.pipController invalidatePlaybackState]; } } else if (eventType == AVPEventSeekEnd) { // Seeking selesai. if (_pipController) { [self.pipController invalidatePlaybackState]; } } }Atur listener.
Dengarkan callback yang dipanggil sebelum PiP dimulai.
/** @brief PiP akan mulai. @param pictureInPictureController Controller PiP. */ - (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController { if (!_pipController) { self.pipController = pictureInPictureController; } self.isPipPaused = !(self.currentPlayerStatus == AVPStatusStarted); [pictureInPictureController invalidatePlaybackState]; }Dengarkan callback yang dipanggil sebelum PiP berhenti.
/** @brief PiP akan berhenti. @param pictureInPictureController Controller PiP. */ - (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController { self.isPipPaused = NO; [pictureInPictureController invalidatePlaybackState]; }Dengarkan callback yang memberi tahu delegate untuk memulihkan antarmuka pengguna sebelum PiP berhenti.
/** @brief Memberi tahu delegate untuk memulihkan antarmuka pengguna sebelum PiP berhenti. @param pictureInPictureController Controller PiP. @param completionHandler Panggil dan berikan YES untuk mengizinkan sistem menyelesaikan pemulihan antarmuka pengguna player. */ - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler { if (_pipController) { _pipController = nil; } completionHandler(YES); }Dengarkan callback yang memberi tahu controller PiP tentang rentang waktu yang dapat diputar saat ini.
/** @brief Memberi tahu controller PiP tentang rentang waktu yang dapat diputar saat ini. @param pictureInPictureController Controller PiP. @return Rentang waktu yang dapat diputar saat ini. */ - (CMTimeRange)pictureInPictureControllerTimeRangeForPlayback:(nonnull AVPictureInPictureController *)pictureInPictureController layerTime:(CMTime)layerTime{ Float64 current64 = CMTimeGetSeconds(layerTime); Float64 start; Float64 end; if (currentPosition <= self.player.duration) { double curPostion = self.currentPosition / 1000.0; double duration = self.player.duration / 1000.0; double interval = duration - curPostion; start = current64 - curPostion; end = current64 + interval; CMTime t1 = CMTimeMakeWithSeconds(start, layerTime.timescale); CMTime t2 = CMTimeMakeWithSeconds(end, layerTime.timescale); return CMTimeRangeFromTimeToTime(t1, t2); } else { return CMTimeRangeMake(kCMTimeNegativeInfinity, kCMTimePositiveInfinity); } }Dengarkan callback yang menunjukkan apakah video dijeda dalam mode PiP.
/** @brief Mencerminkan status dijeda atau diputar di UI. @param pictureInPictureController Controller PiP. @return Dijeda atau diputar. */ - (BOOL)pictureInPictureControllerIsPlaybackPaused:(nonnull AVPictureInPictureController *)pictureInPictureController{ return self.isPipPaused; }CatatanCallback ini dipicu sebelum PiP dimulai. Pastikan nilai kembalian callback ini adalah false pada saat ini. Jika tidak, PiP tidak dapat diaktifkan.
Dengarkan callback yang dipanggil saat pengguna menekan tombol maju cepat atau mundur cepat dalam mode PiP dan sinkronkan status player.
/** @brief Pengguna menekan tombol maju cepat atau mundur cepat. @param pictureInPictureController Controller PiP. @param skipInterval Interval waktu untuk maju cepat atau mundur cepat. @param completionHandler Closure yang harus dipanggil untuk menunjukkan bahwa operasi seeking selesai. */ - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController skipByInterval:(CMTime)skipInterval completionHandler:(nonnull void (^)(void))completionHandler { int64_t skipTime = skipInterval.value / skipInterval.timescale; int64_t skipPosition = self.currentPosition + skipTime * 1000; if (skipPosition < 0) { skipPosition = 0; } else if (skipPosition > self.player.duration) { skipPosition = self.player.duration; } [self.player seekToTime:skipPosition seekMode:AVP_SEEKMODE_INACCURATE]; [pictureInPictureController invalidatePlaybackState]; }Dengarkan callback yang dipanggil saat pengguna menekan tombol jeda atau putar dalam mode PiP.
/** @brief Pengguna menekan tombol jeda dalam mode PiP. @param pictureInPictureController Controller PiP. @param playing Apakah video diputar. */ - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController setPlaying:(BOOL)playing { if (!playing){ [self.player pause]; self.isPipPaused = YES; } else { // Rekomendasi: Jika pemutaran PiP selesai dan perlu diputar ulang, Anda dapat mengeksekusi kode tambahan dalam pernyataan if berikut. if (self.currentPlayerStatus == AVPStatusCompletion) { [self.player seekToTime:0 seekMode:AVP_SEEKMODE_ACCURATE]; } [self.player start]; self.isPipPaused = NO; } [pictureInPictureController invalidatePlaybackState]; }
Picture-in-Picture dalam aplikasi
Saat menggunakan fitur PiP, secara default merupakan PiP di luar aplikasi. Untuk mengimplementasikan PiP dalam aplikasi, Anda dapat terlebih dahulu menggunakan operasi API berikut untuk menentukan apakah fitur PiP diaktifkan:
/**
@brief Menunjukkan apakah PiP diaktifkan.
@param pictureInPictureController Controller PiP.
@param isEnable Apakah PiP diaktifkan.
*/
- (void)pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *)pictureInPictureController isEnable:(BOOL)isEnable;Saat fitur PiP diaktifkan, Anda dapat menonaktifkan start otomatis PiP dan mengontrol aktivasi fitur secara manual. Kode berikut memberikan contohnya:
- (void) pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *) pictureInPictureController isEnable:(BOOL) isEnable
{
if (isEnable && pictureInPictureController) {
_pipController = pictureInPictureController;
// tutup start otomatis pip
if (@available(iOS 15.0, *)) {
_pipController.canStartPictureInPictureAutomaticallyFromInline = false;
}
} else {
_pipController = NULL;
}
}
- (void) switchPip:(bool) enable {
if (_pipController == nil) {
return;
}
if (enable) {
// mulai pip
[_pipController startPictureInPicture];
} else {
// tutup pip
[_pipController stopPictureInPicture];
}
}Fallback streaming langsung RTS
Untuk contoh kode lengkap, lihat modul Streaming Langsung RTS (RtsLiveStream) di API-Example. Proyek ini merupakan proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.
Untuk informasi selengkapnya, lihat Streaming langsung RTS.
Ganti antara saluran suara kiri dan kanan
ApsaraVideo Player SDK untuk iOS menggunakan properti outputAudioChannel untuk mengatur saluran audio output. Anda dapat beralih ke saluran kiri atau kanan jika sumber input berupa dual-channel. Pengaturan ini tidak berpengaruh jika sumber input berupa single-channel.
Pengaturan saluran suara output memengaruhi rendering audio dan callback data PCM.
// Atur nilai enumerasi AVPOutputAudioChannel untuk mengganti saluran suara.
// AVP_AUDIO_CHANNEL_NONE: Jangan tentukan saluran suara. Putar dengan saluran suara sumber input. Ini adalah nilai default.
// AVP_AUDIO_CHANNEL_LEFT: Beralih ke saluran suara kiri untuk pemutaran.
// AVP_AUDIO_CHANNEL_RIGHT: Beralih ke saluran suara kanan untuk pemutaran.
self.player.outputAudioChannel = AVP_AUDIO_CHANNEL_NONE;Atur warna latar video
ApsaraVideo Player SDK untuk iOS memungkinkan Anda mengatur warna latar pemutar saat rendering. Bagian berikut menampilkan contoh API dan petunjuk penggunaannya:
Contoh API
/**
@brief Atur warna latar video.
@param color warna
*/
-(void) setVideoBackgroundColor:(UIColor *)color;Petunjuk Penggunaan
// Parameter adalah data heksadesimal 8-bit. Data 8-bit dibagi menjadi kelompok dua, mewakili A (transparansi alpha), R (merah), G (hijau), dan B (biru) secara berurutan.
// Misalnya, 0x0000ff00 merepresentasikan hijau.
[self.player setVideoBackgroundColor:0x0000ff00]Tentukan nama domain pemutaran untuk VidAuth
Dengan metode VidAuth, Anda dapat menentukan bidang seperti nama domain yang sesuai dengan VID. Untuk detail bidang yang didukung, lihat Parameter Permintaan GetPlayInfo. Bagian berikut menunjukkan operasi API dan petunjuk penggunaannya:
Contoh API
/**
@brief Putar menggunakan VID + PlayAuth. Untuk informasi selengkapnya, lihat https://www.alibabacloud.com/help/en/vod/user-guide/use-playback-credentials-to-play-videos
@param source Tipe input AVPVidAuthSource.
@see AVPVidAuthSource
*/
- (void)setAuthSource:(AVPVidAuthSource*)source;Petunjuk Penggunaan
Anda dapat menambahkan bidang playDomain melalui addVidPlayerConfigByStringValue dari antarmuka VidPlayerConfigGenerator.
VidPlayerConfigGenerator* gen = [[VidPlayerConfigGenerator alloc]init];
// Tambahkan bidang playDomain. Untuk bidang yang dapat ditambahkan, lihat
// https://www.alibabacloud.com/help/en/vod/developer-reference/api-vod-2017-03-21-getplayinfo
[gen addVidPlayerConfigByStringValue:@"playDomain" value: @"com.xxx.xxx"];
[source setPlayConfig:[gen generatePlayerConfig]];
[self.player setAuthSource:source]:Decoding latar belakang
Mulai versi V6.12.0, ApsaraVideo Player SDK mendukung decoding latar belakang. Saat fitur ini diaktifkan, player tetap dapat mendekode dan memutar aliran video serta memicu callback meskipun berada di latar belakang. Kode berikut menunjukkan contoh penggunaannya:
// Nilai 1 mengaktifkan decoding latar belakang. Nilai 0 menonaktifkan decoding latar belakang. Nilai default adalah 0.
[self.player setOption:ALLOW_DECODE_BACKGROUND valueInt:1];Plugin dekode H.266
H.266, juga dikenal sebagai Versatile Video Coding (VVC), merupakan standar pengkodean video generasi baru yang secara signifikan mengurangi bitrate tanpa mengorbankan kualitas gambar. Untuk mengoptimalkan performa dan mengontrol ukuran SDK utama, kemampuan decoding H.266 dikemas secara terpisah sebagai plugin yang mendukung integrasi sesuai kebutuhan.
Prasyarat
ApsaraVideo Player SDK atau All-in-One SDK versi 7.6.0 ke atas.
Anda telah memiliki lisensi Edisi Profesional. Untuk informasi selengkapnya, lihat Dapatkan lisensi untuk ApsaraVideo Player SDK.
ApsaraVideo Player dengan plugin decoding H.266 hanya mendukung pemutaran video H.266 yang ditranskode oleh Transkode Alibaba Cloud.
Integrasikan plugin
Aktifkan plugin
Mulai dari ApsaraVideo Player SDK untuk iOS versi 7.7.0, plugin diaktifkan secara default dan tidak perlu diaktifkan secara manual.
[AliPlayerGlobalSettings enableCodecPlugin:@"vvc" valid:true];Kode kesalahan terkait
Untuk informasi selengkapnya mengenai kode kesalahan terkait plugin decoding H.266, lihat FAQ Umum untuk player di berbagai klien.
Segarkan otomatis sumber pemutaran
Mengaktifkan fitur segarkan otomatis untuk sumber pemutaran mencegah gangguan akibat kedaluwarsa berdasarkan mekanisme penandatanganan. Fitur ini memicu listener untuk memperoleh alamat baru saat sumber menjadi tidak valid, sehingga menjamin pemutaran video yang berkelanjutan dan lancar.
Prasyarat
ApsaraVideo Player SDK atau All-in-One SDK versi 7.9.0 ke atas.
Anda menggunakan sumber VidAuth untuk pemutaran atau layanan Anda telah mengonfigurasi penandatanganan URL.
Sumber VidAuth
Contoh API
/**
@brief Atur callback untuk notifikasi kedaluwarsa sumber VidAuth.
Metode ini dipicu saat player mendeteksi bahwa sumber VidAuth saat ini telah kedaluwarsa.
Anda dapat menyegarkan sumber VidAuth dalam callback dan menggunakan `callback` untuk mengembalikan sumber VidAuth yang diperbarui,
memastikan pemutaran video tidak terganggu dan lancar.
@param callback Blok callback yang dipicu saat sumber VidAuth kedaluwarsa.
Gunakan callback ini untuk memberikan objek `VidAuth` yang valid untuk memperbarui player.
*/
-(void)setOnVidAuthExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;Deskripsi komponen
Petunjuk penggunaan
Anda dapat memperoleh kredensial pemutaran audio atau video dengan memanggil operasi API GetVideoPlayAuth. Kami menyarankan Anda mengintegrasikan SDK sisi server ApsaraVideo VOD untuk mendapatkan kredensial guna menghindari penandatanganan manual. Untuk informasi selengkapnya, lihat OpenAPI Portal.
[self.player setOnVidAuthExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
// Dapatkan AVPVidAuthSource
if ([expiredSource isKindOfClass:[AVPVidAuthSource class]]) {
// ------------------- Awal implementasi pengguna -------------------
// Panggil fungsi yang Anda implementasikan sendiri untuk mendapatkan PlayAuth baru dari server aplikasi Anda.
// clinetGetPlayAuthFunction adalah contoh nama fungsi. Ganti dengan implementasi Anda sendiri.
[self clinetGetPlayAuthFunction:vid success:^(NSString* newPlayAuth){
// 1. Callback untuk berhasil mendapatkan kredensial baru.
[vidAuth setPlayAuth:newPlayAuth];
// 2. Teruskan objek yang diperbarui kembali ke player melalui callback SDK.
[callback onSuccess:vidAuth];
} failure:^(NSString* errorMsg) {
// Callback untuk gagal mendapatkan kredensial baru.
// errorMsg berisi informasi kesalahan detail.
[callback onError:errorMsg];
}];
// ------------------- Akhir implementasi pengguna -------------------
}
}];Sumber UrlSource
Contoh API
/**
@brief Atur callback untuk notifikasi kedaluwarsa sumber URL.
Metode ini dipicu saat player mendeteksi bahwa sumber URL saat ini telah kedaluwarsa.
Anda dapat menyegarkan sumber URL dalam callback dan menggunakan `callback` untuk mengembalikan sumber URL yang diperbarui,
memastikan pemutaran video tidak terganggu.
@note Untuk informasi tentang mengonfigurasi mekanisme penandatanganan URL, lihat dokumentasi resmi Alibaba Cloud:
https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW
@param callback Blok callback yang dipicu saat sumber URL kedaluwarsa.
Gunakan callback ini untuk memberikan objek `URLSource` yang valid untuk memperbarui player.
*/
-(void)setOnURLSourceExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;Deskripsi komponen
Petunjuk penggunaan
[self.player setOnURLSourceExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
// Dapatkan AVPUrlSource
if ([expiredSource isKindOfClass:[AVPUrlSource class]]) {
AVPUrlSource *expiredUrlSource = (AVPUrlSource *)expiredSource;
NSString *expiredUrl = [expiredUrlSource.playerUrl absoluteString];
// Periksa apakah mengandung auth_key
if (![expiredUrl containsString:@"auth_key="]) {
return;
}
// 1. Ekstrak URL asli dari URL yang kedaluwarsa
NSRange authKeyQuestionRange = [expiredUrl rangeOfString:@"?auth_key="];
NSRange authKeyAmpersandRange = [expiredUrl rangeOfString:@"&auth_key="];
NSInteger authKeyIndex = NSNotFound;
if (authKeyQuestionRange.location != NSNotFound) {
authKeyIndex = authKeyQuestionRange.location;
} else if (authKeyAmpersandRange.location != NSNotFound) {
authKeyIndex = authKeyAmpersandRange.location;
}
NSString *originalUrl = nil;
if (authKeyIndex != NSNotFound) {
originalUrl = [expiredUrl substringToIndex:authKeyIndex];
} else {
// Jika auth_key tidak ditemukan, anggap seluruh URL adalah URL asli
originalUrl = expiredUrl;
}
// 2. Siapkan parameter penandatanganan baru: authKey dan waktu kedaluwarsa
// Jika anggota kelas authKey valid, gunakan authKey
NSString *key = (self.authKey.length > 0) ? self.authKey : @"";
if (!NOT_EMPTY(key)) {
[callback onError:@"REFRESH_ERROR:key fail"];
return;
}
// Jika anggota kelas validTime valid, gunakan validTime; jika tidak, gunakan nilai default
NSTimeInterval validTime = (self.validTime > 0) ? self.validTime : 3600; // Default adalah 3600 detik
NSTimeInterval newExpireTime = [[NSDate date] timeIntervalSince1970] + validTime;
// 3. Gunakan CdnAuthUtil untuk menghasilkan URL bertanda tangan baru (Tipe A)
NSString *newAuthUrl = [CdnAuthUtil aAuthWithUri:originalUrl key:key exp:newExpireTime];
AVPUrlSource *resultSource = [[AVPUrlSource alloc] urlWithString:newAuthUrl];
// 4. Tangani callback
if (newAuthUrl) {
[callback onSuccess:resultSource];
} else {
[callback onError:@"REFRESH_ERROR:refresh fail"];
}
}
}];Fungsi utilitas tambahan
Contoh ini menggunakan penandatanganan tipe A.
Performa
Atur skenario pemutaran
Mengatur skenario pemutaran secara otomatis mengonfigurasi parameter optimal, seperti pengaturan buffer dan toggle fitur, berdasarkan skenario tersebut. Pengaturan ini juga kompatibel dengan pengaturan parameter kustom yang dikonfigurasi menggunakan antarmuka setConfig. Pengaturan kustom memiliki prioritas lebih tinggi.
Setelah mengatur skenario pemutaran, Anda dapat menggunakan antarmuka
getConfiguntuk melihat pengaturan parameter.
Contoh API
/**
@brief Atur skenario player.
@param scene Skenario player.
@see AVPScene
*/
-(void) setPlayerScene:(AVPScene)scene;Skenario pemutaran
typedef enum _AVPScene {
/**
* Skenario: Tidak ada
*/
SceneNone,
/**
* Skenario video panjang: berlaku untuk video lebih dari 30 menit
*/
SceneLong,
/**
* Skenario video sedang: berlaku untuk video antara 5 hingga 30 menit
*/
SceneMedium,
/**
* Skenario video pendek: berlaku untuk video antara 0 detik hingga 5 menit
*/
SceneShort,
/**
* Skenario streaming langsung
*/
SceneLive,
/**
* Skenario langsung RTS
*/
SceneRTSLive
} AVPScene;Petunjuk penggunaan
// Atur skenario video pendek.
[self.player setPlayerScene:SceneShort];
// Atur skenario video sedang.
[self.player setPlayerScene:SceneMedium];
// Atur skenario video panjang.
[self.player setPlayerScene:SceneLong];
// Atur skenario streaming langsung.
[self.player setPlayerScene:SceneLive]; Pre-rendering
ApsaraVideo Player SDK untuk iOS mendukung rendering cepat frame pertama sebelum pemutaran dimulai, yang dapat meningkatkan kecepatan loading frame pertama.
Fitur ini dinonaktifkan secara default.
Setelah fitur ini diaktifkan, memengaruhi urutan pemicu event keberhasilan persiapan dan rendering frame pertama. Jika fitur dinonaktifkan, event keberhasilan persiapan dipanggil balik sebelum event rendering frame pertama. Jika fitur diaktifkan, rendering frame pertama mungkin dipicu sebelum event keberhasilan persiapan karena perbedaan kecepatan decoding dan rendering. Namun, hal ini tidak memengaruhi pemutaran.
Kode berikut memberikan contohnya:
[self.player setOption:ALLOW_PRE_RENDER valueInt:1];Cache lokal
Untuk contoh kode detail, lihat modul Preload Video (PreloadUrl) di API-Example. Proyek ini adalah proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.
ApsaraVideo Player SDK untuk iOS menyediakan fitur cache lokal. Fitur ini meningkatkan kecepatan loading frame pertama, kecepatan seek, dan mengurangi tersendat saat pengguna memutar video berulang kali. Fitur ini juga membantu menghemat trafik.
Enable local caching
Secara default, fitur cache lokal dinonaktifkan. Untuk menggunakan fitur ini, Anda harus mengaktifkannya secara manual. Anda dapat mengontrol fitur ini menggunakan AliPlayerGlobalSettings di enableLocalCache. Berikut adalah contohnya:
/**
* Aktifkan cache lokal. Setelah diaktifkan, video akan di-cache ke file lokal.
* @param enable: Sakelar fitur cache lokal. true: aktifkan, false: nonaktifkan. Default adalah false.
* @param maxBufferMemoryKB: Ditinggalkan sejak V5.4.7.1, tidak berpengaruh.
* @param localCacheDir: Harus diatur. Direktori untuk file cache lokal, harus berupa jalur mutlak.
*/
[AliPlayerGlobalSettings enableLocalCache:true maxBufferMemoryKB:1024 localCacheDir:@""];
/**
@brief Pengaturan untuk pembersihan otomatis file cache lokal.
@param expireMin: Ditinggalkan sejak V5.4.7.1, tidak berpengaruh.
@param maxCapacityMB: Kapasitas cache maksimum dalam megabyte. Default adalah 20 GB. Selama pembersihan, jika total kapasitas cache melebihi ukuran ini, file cache tertua akan dihapus satu per satu, diurutkan berdasarkan waktu akses terakhir item cache, hingga total kapasitas kurang dari atau sama dengan kapasitas maksimum.
@param freeStorageMB: Ruang disk bebas minimum dalam megabyte. Default adalah 0. Selama pembersihan, mirip dengan kapasitas cache maksimum, jika ruang disk saat ini kurang dari nilai ini, file cache juga akan dihapus satu per satu sesuai aturan hingga ruang bebas lebih besar dari atau sama dengan nilai ini atau semua cache dihapus.
*/
[AliPlayerGlobalSettings setCacheFileClearConfig:0 maxCapacityMB:0 freeStorageMB:0];
/**
* Callback untuk mendapatkan nilai hash URL yang dimuat, digunakan sebagai ID unik untuk URL. Harus dipastikan bahwa setiap URL unik.
*/
// Anda perlu mengimplementasikan fungsi ini sendiri dan meneruskan pointer fungsi ke setCacheUrlHashCallback.
static NSString *CaheUrlHashHandle(NSString *url) {
return @"xxx";
}
[AliPlayerGlobalSettings setCacheUrlHashCallback:&CaheUrlHashHandle];Jika URL pemutaran video memiliki parameter autentikasi, parameter autentikasi berubah selama caching lokal dan pemutaran. Untuk meningkatkan rasio hit cache untuk URL yang sama dengan autentikasi berbeda, Anda dapat menghapus parameter autentikasi dari URL sebelum menghitung nilai hash (misalnya, MD5) melalui antarmuka
setCacheUrlHashCallback. Misalnya, jika URL pemutaran video dengan parameter autentikasi adalahhttp://****.mp4?aaa, gunakanhttp://****.mp4untuk menghitung nilai hash saat memuat. Namun, jika video adalah video m3u8 terenkripsi dan keyURL-nya diproses dengan menghapus parameter autentikasi sebelum menghitung nilai hash, cache video berbeda mungkin mengenai kunci yang sama, yang menyebabkan kegagalan pemutaran. Solusi: Dalam callbacksetCacheUrlHashCallback, Anda dapat melakukan pemeriksaan nama domain dan hanya menghapus parameter autentikasi untuk domain pemutaran (http(s)://xxxxx.m3u8?aaaa), dan tidak menghapusnya untuk domain yang sesuai dengan keyURL (http(s)://yyyyy?bbbb).
Jika server mendukung protokol HTTP dan HTTPS, tetapi protokol berbeda mengarah ke file media yang sama, Anda dapat menghapus atau menyatukan header permintaan sebelum menghitung nilai MD5. Misalnya:
Jika URL pemutaran video adalah
https://****.mp4danhttp://****.mp4, Anda dapat menggunakan****.mp4untuk menghitung nilai MD5 saat memuat.Jika URL pemutaran video adalah
https://****.mp4, Anda dapat menyatukannya kehttp://****.mp4sebelum menghitung nilai MD5 saat memuat.
Untuk ApsaraVideo Player SDK V5.5.4.0 ke atas, jika URL pemutaran video memiliki parameter penandatanganan dan protokol pemutaran adalah HLS, Anda dapat mengatur field
AVPConfig.enableStrictAuthModeuntuk memilih mode penandatanganan berbeda. Nilai default adalah false untuk versi 5.5.4.0 hingga 6.21.0. Nilai default adalah true untuk versi 7.0.0 ke atas.Penandatanganan tidak ketat (false): Penandatanganan juga di-cache. Jika hanya bagian media yang di-cache terakhir kali, player menggunakan penandatanganan yang di-cache untuk memulai permintaan saat memutar bagian yang tidak di-cache berikutnya. Jika periode validitas penandatanganan URL sangat singkat, hal ini menyebabkan pengecualian pemutaran.
Penandatanganan ketat (true): Penandatanganan tidak di-cache. Penandatanganan dilakukan setiap kali pemutaran dimulai. Hal ini menyebabkan pemutaran gagal tanpa koneksi jaringan.
Enable or disable local caching for a single URL
Jika Anda ingin menonaktifkan cache lokal untuk URL tunggal, Anda dapat mengaturnya di konfigurasi player. Kode berikut memberikan contohnya:
// Pertama, dapatkan konfigurasi.
AVPConfig *config = [self.player getConfig];
// Apakah akan mengaktifkan cache lokal untuk URL pemutaran. Nilai default adalah true. Saat cache lokal diaktifkan di AliPlayerGlobalSettings, dan cache lokal juga diaktifkan di sini (diatur ke true), cache lokal untuk URL ini akan berlaku. Jika diatur ke false di sini, cache lokal untuk URL ini dinonaktifkan.
config.enableLocalCache = false;
....// Pengaturan lainnya.
// Atur konfigurasi untuk player.
[self.player setConfig:config];Use the default cache path
Jika Anda ingin menggunakan jalur default untuk caching, Anda dapat melakukan pengaturan berikut melalui AliPlayerGlobalSettings.
[AliPlayerGlobalSettings enableLocalCache:true];Preloading
ApsaraVideo Player SDK untuk iOS menyediakan fitur preloading, yang merupakan peningkatan dari fitur caching lokal. Dengan mengatur ukuran memori yang ditempati oleh cache video, Anda dapat lebih meningkatkan kecepatan loading frame pertama video.
Batasan fitur preloading sebagai berikut:
Saat ini mendukung pemuatan file media tunggal seperti MP4, MP3, FLV, dan HLS.
Secara default, ApsaraVideo Player SDK untuk iOS menyediakan kemampuan penjadwalan otomatis untuk sumber daya jaringan selama preloading. Hal ini untuk mengurangi dampak permintaan jaringan preloading terhadap permintaan jaringan video yang sedang diputar. Kebijakan penjadwalan otomatis adalah bahwa preloading hanya diizinkan membuat permintaan setelah buffer video yang sedang diputar mencapai ambang batas tertentu. Untuk mengontrol permintaan real-time untuk preloading, Anda dapat menonaktifkan kebijakan ini menggunakan metode berikut:
[AliPlayerGlobalSettings enableNetworkBalance:false];Aktifkan fitur caching lokal. Untuk informasi selengkapnya, lihat Caching lokal.
Atur sumber data.
VidAuth (direkomendasikan)
AVPVidAuthSource* vidAuthSource = [[AVPVidAuthSource alloc] init]; [vidAuthSource setVid:@"Informasi Vid"]; // Wajib. ID video. [vidAuthSource setPlayAuth:@"<yourPlayAuth>"]; // Wajib. Kredensial pemutaran. Anda perlu memanggil operasi API GetVideoPlayAuth ApsaraVideo VOD untuk menghasilkannya. [vidAuthSource setRegion:@"Wilayah akses"]; // Untuk SDK player V5.5.5.0 ke atas, parameter ini ditinggalkan. Anda tidak perlu mengatur wilayah; player akan menguraikannya secara otomatis. Untuk SDK player sebelum V5.5.5.0, parameter ini wajib. Wilayah akses ApsaraVideo VOD, default adalah cn-shanghai. [vidAuthSource setQuality:@"Definisi yang dipilih"]; // "AUTO" merepresentasikan bitrate adaptif.VidSts
AVPVidStsSource* vidStsSource = [[AVPVidStsSource alloc] init]; [vidStsSource setVid: @"Informasi Vid"]; // Wajib. ID video. [vidStsSource setRegion:@"Wilayah akses"]; // Wajib. Wilayah akses ApsaraVideo VOD, default adalah cn-shanghai. [vidStsSource setSecurityToken: @"<yourSecurityToken>"]; // Wajib. Token STS. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya. [vidStsSource setAccessKeySecret: @"<yourAccessKeySecret>"]; // Wajib. Rahasia AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya. [vidStsSource setAccessKeyId: @"<yourAccessKeyId>"]; // Wajib. ID AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya. [vidStsSource setQuality:@"Definisi yang dipilih"]; // "AUTO" merepresentasikan bitrate adaptif.UrlSource
NSString* url = @"URL Pemutaran"; // Wajib. URL pemutaran, yang dapat berupa URL VOD pihak ketiga atau URL pemutaran di ApsaraVideo VOD. AVPUrlSource* urlSource = [[AVPUrlSource alloc]urlWithString:url];Atur parameter tugas.
CatatanIni hanya berlaku untuk video multi-bitrate. Anda hanya dapat mengatur salah satu dari
setDefaultBandWidth,setDefaultResolution, atausetDefaultQuality.AVPPreloadConfig *config = [[AVPPreloadConfig alloc]init]; // Atur bitrate preload untuk aliran multi-bitrate. [config setDefaultBandWidth:400000]; // Atur resolusi preload untuk aliran multi-bitrate. [config setDefaultResolution:640 * 480]; // Atur kualitas preload untuk aliran multi-bitrate. [config setDefaultQuality:@"FD"]; // Atur durasi preload. [config setDuration:1000];Tambahkan listener tugas.
Buat tugas dan tambahkan ke instans
MediaLoaderV2untuk memulai preloading.VidAuth (direkomendasikan)
// Buat tugas preload. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidAuthSource:vidAuthSource preloadConfig:config]; // Dapatkan instans MediaLoaderV2. AliMediaLoaderV2* vodMedialoader = [AliMediaLoaderV2 shareInstance]; // Tambahkan tugas dan mulai preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];VidSts
// Buat tugas preload. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidStsSource:vidStsSource preloadConfig:config]; // Dapatkan instans MediaLoaderV2. AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init]; // Tambahkan tugas dan mulai preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];UrlSource
// Buat tugas preload. AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithUrlSource:urlSource preloadConfig:config]; // Dapatkan instans MediaLoaderV2. AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init]; // Tambahkan tugas dan mulai preloading. NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];Opsional: Kelola tugas.
[vodMedialoader cancelTask:taskId]; // Batalkan tugas preload dengan ID tugas tertentu. [vodMedialoader pauseTask:taskId]; // Jeda tugas preload dengan ID tugas tertentu. [vodMedialoader resumeTask:taskId]; // Lanjutkan tugas preload dengan ID tugas tertentu.Opsional: Hapus file yang dimuat.
Anda dapat menghapus file yang dimuat sesuai kebutuhan untuk menghemat ruang. ApsaraVideo Player SDK untuk iOS tidak menyediakan antarmuka penghapusan. Anda perlu menghapus file di direktori pemuatan dalam aplikasi.
Preloading dinamis
Kebijakan preloading dinamis memungkinkan integrator mengontrol cache video yang sedang diputar dan jumlah serta cache video yang dipreloading, menyeimbangkan pengalaman pemutaran dengan overhead biaya untuk kebutuhan bisnis.
Preload video HLS multi-bitrate
Dalam skenario pemutaran listPlayer dan video HLS multi-bitrate, Anda dapat mempreloading aliran dengan definisi yang sesuai dengan definisi pemutaran saat ini dan memilih mode preload sesuai kebutuhan.
Dapatkan kecepatan unduhan
Anda dapat memperoleh kecepatan unduhan video yang sedang diputar. Anda dapat memperoleh kecepatan dalam callback onCurrentDownloadSpeed. Kode berikut memberikan contohnya:
- (void)onCurrentDownloadSpeed:(AliPlayer *)player speed:(int64_t)speed{
intspeed_=speed;
}Fitur jaringan
HTTPDNS
HTTPDNS mengirim permintaan resolusi nama domain ke server HTTPDNS tertentu untuk mendapatkan hasil resolusi nama domain yang lebih cepat dan stabil, yang mengurangi risiko pembajakan DNS.
ApsaraVideo Player SDK menyediakan fitur HTTPDNS yang ditingkatkan yang menawarkan layanan HTTPDNS khusus untuk nama domain CDN Alibaba Cloud. Fitur ini mendukung penjadwalan presisi dan resolusi real-time untuk jaringan CDN Alibaba Cloud, yang secara efektif meningkatkan performa jaringan.
Contoh penggunaan HTTPDNS yang ditingkatkan
HTTPDNS yang ditingkatkan hanya menyediakan layanan HTTPDNS untuk nama domain CDN Alibaba Cloud. Pastikan nama domain yang Anda konfigurasikan adalah nama domain CDN Alibaba Cloud dan konfigurasi nama domain lengkap serta siap digunakan. Untuk informasi selengkapnya tentang cara menambah dan mengonfigurasi nama domain CDN di ApsaraVideo VOD, lihat Tambahkan nama domain yang dipercepat. Untuk informasi selengkapnya tentang nama domain CDN, lihat CDN Alibaba Cloud.
// Aktifkan HTTPDNS yang ditingkatkan.
[AliPlayerGlobalSettings enableEnhancedHttpDns:YES];
// Opsional: Tambahkan nama domain untuk pra-resolusi HTTPDNS.
[[AliDomainProcessor shareInstance] addPreResolveDomain:@"player.***alicdn.com"];HTTP/2
Mulai dari V5.5.0.0, ApsaraVideo Player SDK untuk iOS mengaktifkan HTTP/2 secara default.
ApsaraVideo Player SDK untuk iOS mendukung protokol HTTP/2. Protokol ini menggunakan multiplexing untuk menghindari blokir kepala antrian dan meningkatkan performa pemutaran. Kode berikut memberikan contohnya:
[AliPlayerGlobalSettings setUseHttp2:true];Pra-buat koneksi TCP untuk HTTP
Untuk permintaan pemutaran video HTTP (bukan HTTPS), pra-membuat koneksi TCP secara signifikan dapat meningkatkan pengalaman pengguna, mengurangi waktu koneksi jaringan, memastikan pemutaran segera dan berkelanjutan, serta mengoptimalkan penggunaan sumber daya jaringan dan sistem. Penggunaannya sebagai berikut:
// Format domain adalah host[:port], di mana port opsional. Nama domain ganda dipisahkan dengan titik koma (;).
// Pengaturan global
// Antarmuka lengkap menggunakan string saat ini setiap kali diatur (lebih - tambah, kurang - hapus). String kosong menghentikan pra-koneksi.
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];Unduhan video
Untuk contoh kode detail, lihat modul Unduhan Video dan Pemutaran Offline (Download) di API-Example. Proyek ini adalah proyek sampel berbasis Objective-C untuk ApsaraVideo Player SDK untuk iOS yang membantu developer mengintegrasikan fitur inti SDK dengan cepat.
ApsaraVideo Player SDK untuk iOS menyediakan fitur unduhan video untuk ApsaraVideo VOD. Fitur ini memungkinkan pengguna menyimpan video secara lokal untuk ditonton dengan ApsaraVideo Player. SDK menawarkan dua metode unduhan: unduhan standar dan unduhan aman.
Unduhan standar: Data video yang diunduh tidak dienkripsi oleh Alibaba Cloud. Pengguna dapat memutarnya dengan player pihak ketiga.
Unduhan aman: Data video yang diunduh dienkripsi oleh Alibaba Cloud. Player pihak ketiga tidak dapat memutarnya. Data hanya dapat diputar menggunakan ApsaraVideo Player.
Catatan penggunaan
Fitur unduhan video hanya didukung untuk metode VidSts dan VidAuth.
Untuk menggunakan fitur unduhan video player, Anda perlu mengaktifkan dan mengonfigurasi mode unduhan di konsol ApsaraVideo VOD. Untuk informasi selengkapnya, lihat Unduhan offline.
Unduhan video mendukung unduhan yang dapat dilanjutkan.
Prosedur
Opsional: Konfigurasikan file verifikasi enkripsi untuk unduhan aman. Ini hanya diperlukan untuk unduhan aman, bukan untuk unduhan standar.
CatatanPastikan file verifikasi enkripsi yang dikonfigurasi konsisten dengan informasi aplikasi. Jika tidak, unduhan video gagal.
Jika Anda mengatur metode unduhan ke unduhan aman, Anda harus mengonfigurasi file kunci yang dihasilkan di konsol ApsaraVideo VOD ke SDK player untuk dekripsi dan verifikasi selama unduhan dan pemutaran video. Untuk informasi selengkapnya tentang cara menghasilkan file kunci, lihat Aktifkan unduhan aman.
Kami menyarankan Anda mengonfigurasi file kunci sekali di Application. Kode berikut memberikan contohnya:
NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"]; [AliPrivateService initKey:encrptyFilePath];Buat dan siapkan downloader.
Kode berikut memberikan contohnya:
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self];Atur listener event.
Downloader menyediakan beberapa listener event. Kode berikut memberikan contohnya:
-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { // Item unduhan berhasil disiapkan. } -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel { // Terjadi kesalahan unduhan. } -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { // Persentase progres unduhan. } -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { // Persentase progres pemrosesan. } -(void)onCompletion:(AliMediaDownloader *)downloader { // Unduhan berhasil. }Siapkan sumber unduhan.
Anda dapat menggunakan metode
prepareuntuk menyiapkan sumber unduhan. Metode VidSts dan VidAuth didukung. Kode berikut memberikan contohnya:VidSts
// Buat VidSts. AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init]; stsSource.region = @"Wilayah akses"; // Wilayah akses ApsaraVideo VOD. Default adalah cn-shanghai. stsSource.vid = @"Informasi Vid"; // ID video. stsSource.securityToken = @"<yourSecurityToken>"; // Token STS. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya. stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // Rahasia AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya. stsSource.accessKeyId = @"<yourAccessKeyId>"; // ID AccessKey pasangan AccessKey STS sementara. Anda perlu memanggil operasi API AssumeRole STS untuk menghasilkannya. // Jika Anda telah mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, dan nama parameter default adalah MtsHlsUriToken, Anda perlu mengatur config dan meneruskannya ke vid, seperti yang ditunjukkan di bawah. // Jika Anda belum mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, Anda tidak perlu mengintegrasikan kode berikut. VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init]; [vp setHlsUriToken:yourMtsHlsUriToken]; stsSource.playConfig = [vp generatePlayerConfig]; // Siapkan sumber unduhan. [downloader prepareWithVid:stsSource];VidAuth
// Buat VidAuth. AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"Informasi Vid"; // ID video. authSource.playAuth = @"<yourPlayAuth>"; // Kredensial pemutaran. Anda perlu memanggil operasi API GetVideoPlayAuth ApsaraVideo VOD untuk menghasilkannya. authSource.region = @"Wilayah akses"; // Untuk SDK player V5.5.5.0 ke atas, parameter ini ditinggalkan. Anda tidak perlu mengatur wilayah; player akan menguraikannya secara otomatis. Untuk SDK player sebelum V5.5.5.0, parameter ini wajib. Wilayah akses ApsaraVideo VOD, default adalah cn-shanghai. // Jika Anda telah mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, dan nama parameter default adalah MtsHlsUriToken, Anda perlu mengatur config dan meneruskannya ke vid, seperti yang ditunjukkan di bawah. // Jika Anda belum mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, Anda tidak perlu mengintegrasikan kode berikut. VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init]; [vp setHlsUriToken:yourMtsHlsUriToken]; authSource.playConfig = [vp generatePlayerConfig]; // Siapkan sumber unduhan. [downloader prepareWithVid:authSource];
CatatanJika Anda telah mengaktifkan pass-through parameter enkripsi standar HLS di konsol VOD, dan nama parameter default adalah MtsHIsUriToken (untuk informasi selengkapnya, lihat Pass-through parameter enkripsi standar HLS), harap atur nilai MtsHIsUriToken ke sumber VOD seperti yang ditunjukkan dalam kode di atas.
Setelah persiapan berhasil, pilih item unduhan.
Setelah persiapan berhasil, metode
onPrepareddipanggil balik. TrackInfo yang dikembalikan berisi informasi seperti definisi setiap aliran video. Anda dapat memilih track untuk diunduh. Kode berikut memberikan contohnya:-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { NSArray<AVPTrackInfo*>* tracks = info.tracks; // Misalnya, unduh TrackInfo pertama. [downloader selectTrack:[tracks objectAtIndex:0].trackIndex]; }Perbarui sumber unduhan dan mulai unduhan.
Untuk mencegah VidSts dan VidAuth kedaluwarsa, kami menyarankan Anda memperbarui informasi sumber unduhan sebelum memulai unduhan. Kode berikut memberikan contohnya:
// Perbarui sumber unduhan. [downloader updateWithVid:vidSource] // Mulai unduhan. [downloader start];Setelah unduhan berhasil atau gagal, lepaskan downloader.
Setelah unduhan berhasil, Anda dapat memanggil
destroyuntuk melepaskan downloader.[self.downloader destroy]; self.downloader = nil;
Pemutaran video terenkripsi
ApsaraVideo VOD mendukung enkripsi HLS, enkripsi privat Alibaba Cloud, dan enkripsi DRM. Video streaming langsung hanya mendukung enkripsi DRM. Untuk informasi selengkapnya tentang pemutaran terenkripsi, lihat Pemutaran video terenkripsi.
Pemutaran Native RTS
ApsaraVideo Player SDK untuk iOS mengintegrasikan Native RTS SDK untuk mengimplementasikan fitur streaming langsung latensi rendah native. Untuk informasi selengkapnya, lihat Implementasikan penarikan aliran RTS di iOS.