Temukan solusi untuk masalah umum dengan ApsaraVideo Player SDK untuk iOS, termasuk error build Xcode, masalah pemutaran, perilaku pencarian (seek), dan caching.
Masalah terkait lisensi
Atasi masalah lisensi tidak valid atau kedaluwarsa di FAQ Lisensi.
Masalah umum lintas platform
-
Untuk masalah yang berlaku lintas platform, periksa FAQ pemutar lintas platform.
-
Developer berpengalaman juga dapat memecahkan masalah error pemutaran secara mandiri.
Masalah pengembangan
Terjadi error saat Anda memaketkan aplikasi dengan Xcode 14 dan mengirimkannya ke App Store untuk ditinjau
Error terkait Bitcode
Gejala: Terjadi error terkait bitcode saat mengirimkan build Xcode 14 ke App Store:
ITMS-90482: Invalid Executable - The executable 'xxx.app/Frameworks/alivcffmpeg.framework/alivcffmpeg' contains bitcode.Solusi: Jalankan perintah xcrun bitcode_strip untuk menghapus bitcode dari framework. ${framework_path} adalah path binary framework tersebut.
xcrun bitcode_strip ${framework_path} -r -o ${framework_path}Error terkait cURL
Gejala: Terjadi error terkait cURL saat mengirimkan build Xcode 14 ke App Store:
ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/AliyunPlayer.framework/AliyunPlayer: _curl_multi_poll, _curl_multi_wakeup. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For further information, visit the Technical Support Information at http://developer.apple.com/support/technical/Solusi:
Jika proyek Anda hanya mengintegrasikan ApsaraVideo Player SDK (AliPlayerSDK_iOS), upgrade SDK ke versi di atas 5.4.9.2.
Jika proyek Anda mengintegrasikan ApsaraVideo Player SDK (AliPlayerPartSDK_iOS) dan SDK video pendek, upgrade ApsaraVideo Player SDK ke versi di atas 5.4.9.2, alivcffmpeg (QuCore-ThirdParty) ke versi 4.3.6, dan SDK video pendek ke versi di atas 3.26.
Error tentang API non-publik
Gejala: Terjadi error tentang API non-publik saat mengirimkan build Xcode 14 ke App Store: Saat mendistribusikan aplikasi dengan Xcode, muncul kotak dialog Distribution completed with warnings, yang menunjukkan App Store Connect Operation Error. Error tersebut menyatakan bahwa aplikasi mereferensikan selector non-publik onCompletion: di AliyunMediaDownloader.framework/AliyunMediaDownloader.
Solusi: Ini adalah peringatan dari build Xcode 14 dan biasanya tidak memengaruhi rilis jika proyek berhasil dibangun. Jika aplikasi tidak dapat dirilis, gunakan Xcode 13.
Error terkait plugin post-processing seperti mpf_filter.framework dan vfi_filter.framework untuk interpolasi frame dan penajaman
Gejala: Terjadi error terkait plugin post-processing (mpf_filter.framework, vfi_filter.framework) untuk interpolasi frame dan penajaman saat mengirimkan build Xcode 14 ke App Store: Saat mendistribusikan aplikasi dengan Xcode, muncul error Distribution failed with errors, yang menunjukkan dua error Asset validation failed: CFBundleIdentifier com.alibaba.AliyunPlayer.mpf_filter dari Payload/xxx.app/Frameworks/mpf_filter.framework dan CFBundleIdentifier com.alibaba.AliyunPlayer.vfi_filter dari vfi_filter.framework mengandung karakter tidak valid (garis bawah). CFBundleIdentifiers hanya boleh berisi karakter alfanumerik, titik (.), dan tanda hubung (-).
Solusi:
Jika proyek Anda tidak menggunakan plugin yang disebutkan dalam pesan error, Anda dapat menghapus plugin tersebut. Hal ini tidak memengaruhi fitur pemutar dan dapat mengurangi ukuran paket.
Jika proyek Anda harus menggunakan plugin yang disebutkan dalam error, Anda dapat sementara menghapus
"_"dari string nilai pada pasangan kunci-nilai"Bundle identifier"di file Info.plist di bawah path framework, lalu kompilasi dan bangun proyek.Anda dapat upgrade ke versi 5.5.2.0 atau lebih baru, di mana penamaan telah diperbaiki.
Apa yang harus saya lakukan jika muncul error "Xcode Error: PhaseScriptExecution failed with a nonzero exit code" saat mengompilasi dan menjalankan demo iOS?
Ikuti langkah-langkah berikut: 1. Buka direktori proyek. 2. Jalankan pod deintegrate.
3. Jalankan pod install.
Setelah saya mengintegrasikan ApsaraVideo Player SDK untuk iOS, apakah saya bisa melakukan debug dan menjalankan aplikasi saya di emulator Xcode?
ApsaraVideo Player SDK untuk iOS tidak mendukung emulator. Gunakan iPhone fisik untuk melakukan debug dan menjalankan aplikasi Anda.
Cara mendapatkan progres pemutaran saat ini
ApsaraVideo Player SDK melaporkan progres pemutaran setiap 500 ms secara default. Perpendek interval untuk pembaruan yang lebih sering:
AVPConfig *config = [self.player getConfig];
config.positionTimerIntervalMs = 100; // Ubah interval callback. Satuan: ms.
[self.player setConfig:config];
/**
@brief: Callback untuk posisi pemutaran saat ini.
@param player: Pointer pemutar.
@param position: Posisi pemutaran saat ini.
*/
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// Progres pemutaran saat ini.
long currentPosition = position;
}Cara mendapatkan lebar dan tinggi video
Tersedia tiga metode:
Metode 1: Setelah pemutar dipersiapkan (AVPEventPrepareDone), baca lebar dan tinggi dari instans AliPlayer.
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType { if (eventType == AVPEventPrepareDone) { NSLog(@"Lebar video: %d, tinggi: %d", player.width, player.height); } }Metode 2: Dengarkan callback perubahan ukuran video, yang langsung mengembalikan lebar dan tinggi.
- (void)onVideoSizeChanged:(AliPlayer*)player width:(int)width height:(int)height rotation:(int)rotation { NSLog(@"Lebar video: %d, tinggi: %d", width, height); }Metode 3: Dengarkan callback informasi track dan baca videoWidth dan videoHeight dari AVPTrackInfo dalam array info.
CatatanMetode ini bergantung pada permintaan jaringan. Gunakan Metode 1 atau Metode 2 untuk keandalan yang lebih baik.
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { for (int i=0; i<info.count; i++) { AVPTrackInfo *trackInfo = info[i]; NSLog(@"Lebar video: %d, tinggi: %d", trackInfo.videoWidth, trackInfo.videoHeight); } }
Progress bar melompat mundur setelah operasi seek
Penyebab: Pemutar menggunakan seek tidak akurat secara default. Setelah operasi seek, pemutar memulai pemutaran dari keyframe terdekat dengan titik seek.
Solusi: Beralih ke mode seek akurat.
Cara beralih antara mode seek akurat dan tidak akurat
Contoh:
// Beralih ke seek tidak akurat.
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_INACCURATE];
// Beralih ke seek akurat.
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_ACCURATE];Progress bar tetap melompat mundur setelah saya beralih ke mode seek akurat
Penyebab: Seek akurat membutuhkan waktu lebih lama daripada seek tidak akurat. Jika jarak dari titik seek ke keyframe terdekat terlalu besar dan melebihi interval maksimum untuk seek akurat, ApsaraVideo Player SDK secara otomatis beralih ke seek tidak akurat. Hal ini menyebabkan progress bar melompat mundur.
Solusi: Tingkatkan interval maksimum untuk seek akurat guna mengurangi fallback ke seek tidak akurat. Interval yang lebih besar meningkatkan akurasi tetapi dapat memperpanjang waktu seek ketika keyframe berjauhan:
// Satuan: ms.
[self.player setMaxAccurateSeekDelta:10000];Error selama caching video: encrypt check fail
Caching bekerja sama seperti pengunduhan. Dengan secure download diaktifkan, file verifikasi enkripsi harus sesuai dengan informasi aplikasi. Unduh file tersebut dari Unduhan offline dan tambahkan ke SDK. Ikuti langkah-langkah di Unduhan video, jika tidak, caching atau pengunduhan akan gagal.
Memperoleh data sumber audio dan video
Kode berikut memberikan contoh cara memperoleh data sumber audio dan video:
// Atur callback rendering.
self.player.renderingDelegate = self;
// Dengarkan callback rendering.
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo {
if (frameInfo.frameType == Cicada_FrameType_Video) { // Data video dasar.
} else if (frameInfo.frameType == Cicada_FrameType_Audio) { // Data audio dasar.
}
return NO;
}Bagaimana cara mendapatkan piksel setiap frame video di pemutar?
ApsaraVideo Player SDK untuk iOS: Anda dapat memperoleh piksel dengan mendengarkan callback onRenderingFrame.
player.renderingDelegate = self;
#pragma mark CicadaRenderingDelegate
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo{
if(frameInfo.frameType==Cicada_FrameType_Video){
// Video
NSLog(@"Menerima frame HW:%p pts:%ld format %d", frameInfo.video_pixelBuffer, frameInfo.pts, CVPixelBufferGetPixelFormatType(frameInfo.video_pixelBuffer));
} else if (frameInfo.frameType==Cicada_FrameType_Audio){
// Audio
}
return NO;
}Logika switching bitrate adaptif
Setelah mengaktifkan switching bitrate adaptif dengan API [self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];, SDK memantau kecepatan jaringan. Jika kecepatan mencapai level bitrate berikutnya dalam 10 detik, pemutar beralih; jika tidak, pemutar tetap pada bitrate saat ini.
Dari tinggi ke rendah: pemutar beralih setelah konten bitrate tinggi yang dicache selesai diputar.
Dari rendah ke tinggi: pemutar beralih segera.
Logika retry kustom
SDK secara default mencoba ulang operasi jaringan yang gagal dua kali dengan timeout 15 detik. Jika semua percobaan ulang gagal, callback Error dipicu.
Untuk menyesuaikan logika retry, atur jumlah percobaan ulang menjadi 0 dan tangani event retry secara eksternal:
AVPConfig *config = [self.player getConfig];
config.networkRetryCount = 0; // Atur jumlah percobaan ulang. Pada contoh ini, nilainya diatur ke 0.
[self.player setConfig:config];
/**
@brief: Callback untuk event pemutar.
@param player: Pointer pemutar.
@param eventWithString: Jenis event pemutar.
@param description: Deskripsi event pemutar.
@see AVPEventType
*/
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_PLAYER_NETWORK_RETRY) { // Error jaringan. Diperlukan percobaan ulang.
// TODO: Tambahkan logika pemrosesan.
}
}Terjadi error 403 dan pemutaran aliran HLS gagal setelah caching lokal dikonfigurasi
Gejala: Memutar aliran HLS (M3U8) dengan VidAuth dan caching lokal diaktifkan gagal dengan error 403.
Penyebab: Jika Anda keluar sebelum video sepenuhnya dicache, pemutar menggunakan kredensial VidAuth yang kedaluwarsa pada upaya pemutaran berikutnya, menyebabkan error 403.
Solusi: Di SDK V5.5.4.0 dan yang lebih baru, atur field AVPConfig.enableStrictAuthMode untuk mengontrol mode autentikasi untuk aliran HLS dengan parameter autentikasi. Nilai default adalah false.
Autentikasi non-ketat (
false): Informasi autentikasi dicache bersama konten media. Jika hanya sebagian media yang dicache sebelumnya, pemutar menggunakan informasi autentikasi yang dicache untuk meminta bagian yang belum dicache. Jika autentikasi URL memiliki periode validitas singkat atau jika pemutaran dilanjutkan setelah jeda panjang, autentikasi mungkin kedaluwarsa. Untuk menangani hal ini, Anda perlu mengimplementasikan fitur refresh sumber otomatis.Autentikasi ketat (
true): Informasi autentikasi tidak dicache. Autentikasi terjadi di awal setiap sesi pemutaran. Hal ini dapat menyebabkan pemutaran gagal jika tidak ada koneksi jaringan.
Preempt audio mencegah ApsaraVideo Player SDK untuk iOS memutar video
Gejala: Saat proyek Anda menggunakan ApsaraVideo Player SDK dan kontrol audio lainnya, muncul masalah pemutaran seperti tidak ada suara atau video tersendat.
Penyebab: AVAudioSession di iOS adalah singleton. Tanpa konfigurasi terpadu di berbagai kontrol audio, preempt audio dapat mencegah pemutaran video.
Solusi: Anda dapat mengonfigurasi AVAudioSession secara terpadu di lokasi yang tepat dalam proyek Anda. Misalnya, Anda dapat mengonfigurasi sesi audio aplikasi sebagai kategori playback dan mengizinkan mixing dengan aplikasi lain. Anda juga dapat mengonfigurasi sesi audio aplikasi sebagai kategori PlayAndRecord untuk skenario perekaman dan pemutaran. Jika terjadi error selama operasi, pesan error disimpan dalam variabel err.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err];Anda juga dapat mengatur proxy AVAudioSession kustom di sisi SDK untuk melewati logika internal AVAudioSession dan mencegah preempt:
Atur proxy.
[AliPlayer setAudioSessionDelegate:self];Atur listener untuk proxy.
return TRUEmenunjukkan bahwa SDK tidak lagi mengonfigurasiAVAudioSessionsecara internal.#pragma mark CicadaAudioSessionDelegate - (BOOL)setActive:(BOOL)active error:(NSError **)outError { return YES; } - (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; } - (BOOL)setCategory:(AVAudioSessionCategory)category mode:(AVAudioSessionMode)mode routeSharingPolicy:(AVAudioSessionRouteSharingPolicy)policy options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; }
Terjadi crash stack yang mengarah ke SDK saat ApsaraVideo Player SDK untuk iOS berjalan
Jika terjadi crash stack yang mengarah ke SDK saat Anda menggunakan ApsaraVideo Player SDK untuk iOS, ikuti langkah-langkah berikut:
Upgrade ke ApsaraVideo Player SDK untuk iOS versi terbaru, yang mencakup peningkatan stabilitas berkelanjutan. Unduh SDK terbaru dari Pengenalan SDK.
Jika crash tetap terjadi setelah upgrade, berikan informasi crash lengkap kepada dukungan teknis Alibaba Cloud. Dapatkan dukungan teknis.
Apakah ApsaraVideo Player SDK untuk iOS mendukung pengunduhan saat memutar?
Tidak. SDK mendukung caching lokal, yang mengunduh video selama pemutaran untuk digunakan offline nanti. Namun, SDK tidak mendukung pemutaran file cache yang disimpan di direktori file terpisah.
Apakah ApsaraVideo Player SDK untuk iOS mendukung mendapatkan progres buffering video?
Ya. ApsaraVideo Player SDK untuk iOS mendukung memperoleh kecepatan buffering, laju frame rendering real-time, bitrate audio dan video, serta bitrate unduhan jaringan. Dapatkan informasi pemutaran.
Terjadi crash saat pemutar berjalan
Untuk mengidentifikasi penyebabnya:
Periksa apakah crash terjadi di ApsaraVideo Player SDK.
Periksa apakah stack crash mengandung awalan
AliyunPlayer. Jika ya, masalah terjadi di ApsaraVideo Player SDK.Upgrade ke versi terbaru ApsaraVideo Player SDK dan verifikasi apakah masalah telah terselesaikan.
Jika masalah tetap ada, siapkan file crash (semua thread), log crash, dan skenario crash seperti yang dijelaskan di Cara memperoleh log.
Terjadi crash terkait inisialisasi program atau preload saat ApsaraVideo Player SDK V5.4.6.0 berjalan
Upgrade ApsaraVideo Player SDK ke versi di atas V5.4.7.1. Untuk mempertahankan stabilitas V5.4.6.0, Anda juga dapat menggunakan versi hotfix pod 5.4.6.0-25587639.
Cara mengaktifkan pemutaran layar penuh
ApsaraVideo Player SDK untuk iOS tidak menyediakan API untuk pemutaran layar penuh. Anda perlu mengimplementasikan fitur ini berdasarkan sistem. Demo ApsaraVideo Player SDK untuk iOS untuk versi 5.5.0.0 dan yang lebih baru telah diadaptasi ke metode layar penuh iOS 16.0 dan yang lebih baru.
Kode berikut memberikan contoh cara mengimplementasikan fitur ini:
Setelah menjalankan metode layar penuh sistem, Anda juga harus menyesuaikan frame playerView yang diatur untuk instans Aliplayer berdasarkan layar.
UIInterfaceOrientation orientation = UIInterfaceOrientationLandscapeLeft; // Putar ke layar penuh
......
// Untuk iOS 16.0 dan yang lebih baru
if (@available(iOS 16.0, *)) {
@try {
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
UIWindowScene *ws = (UIWindowScene *)array[0];
Class GeometryPreferences = NSClassFromString(@"UIWindowSceneGeometryPreferencesIOS");
id geometryPreferences = [[GeometryPreferences alloc]init];
UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskLandscapeRight;
if (orientation == UIInterfaceOrientationPortrait) {
orientationMask = UIInterfaceOrientationMaskPortrait;
}
[geometryPreferences setValue:@(orientationMask) forKey:@"interfaceOrientations"];
SEL sel_method = NSSelectorFromString(@"requestGeometryUpdateWithPreferences:errorHandler:");
void (^ErrorBlock)(NSError *err) = ^(NSError *err){
NSLog(@"Error rotasi layar:%@", [err debugDescription]);
};
if ([ws respondsToSelector:sel_method]) {
(((void (*)(id, SEL,id,id))[ws methodForSelector:sel_method])(ws, sel_method,geometryPreferences,ErrorBlock));
}
} @catch (NSException *exception) {
NSLog(@"Error rotasi layar:%@", exception.reason);
} @finally {
}
} else { // Untuk sistem di bawah iOS 16.0
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
[invocation setArgument:&Orientation atIndex:2];
[invocation invoke];
}
[[UIApplication sharedApplication]setStatusBarOrientation:orientation animated:YES];
}Muncul bilah hitam selama pemutaran video
Untuk mengidentifikasi penyebabnya:
Periksa apakah sumber video itu sendiri memiliki bilah hitam.
Anda dapat memanggil API berikut untuk menyesuaikan mode penskalaan pemutar.
/* AVP_SCALINGMODE_SCALEASPECTFILL: Video diskalakan agar mengisi layar. Video mungkin terpotong. AVP_SCALINGMODE_SCALEASPECTFIT: Video diskalakan agar sesuai layar. Bilah hitam mungkin muncul. AVP_SCALINGMODE_SCALETOFILL: Video diskalakan agar mengisi layar tanpa mempertahankan rasio aspek. Video mungkin terdistorsi. */ self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;Jika mode penskalaan tidak memenuhi kebutuhan Anda, Anda dapat menyesuaikan lebar dan tinggi tampilan kustom untuk
self.player.playerViewdengan memodifikasiframedariself.player.playerView.
Audio diputar tetapi tidak ada video yang ditampilkan, dan log melaporkan "log[AFVTBDecoder] :IOS8VT: throw frame"
Untuk mengidentifikasi penyebabnya:
Gunakan pemutar lain untuk memutar video dan periksa apakah file tersebut hanya berisi audio.
Jika video diputar normal di pemutar lain dan dimensi video berubah, Anda dapat beralih ke decoding software. Kode berikut menunjukkan cara beralih ke decoding software:
player.enableHardwareDecoder = NO
Apa dampak beralih ke decoding software di pemutar iOS?
Setelah mengatur player.enableHardwareDecoder = NO untuk beralih ke decoding software, efek utamanya adalah sebagai berikut:
Tingkat pemanfaatan CPU akan meningkat, yang dapat menyebabkan perangkat menjadi panas dan mengonsumsi daya lebih cepat.
Dapat secara efektif menghindari masalah kompatibilitas decoding hardware, terutama dalam skenario perubahan dinamis resolusi video atau beban perangkat tinggi, sehingga meningkatkan stabilitas pemutaran.
Pada artikel ini, subbagian "saat memutar video, tidak ada suara dan gambar, log melaporkan log[AFVTBDecoder] :IOS8VT: throw frame" telah menyarankan untuk menyelesaikan masalah ini dengan mengatur player.enableHardwareDecoder = NO untuk beralih ke decoding software. Di sini diberikan penjelasan tambahan mengenai biaya dan manfaat pengaturan ini untuk pertimbangan sebelum diaktifkan.
Tersendat dan desinkronisasi audio-video terjadi selama penarikan aliran RTS pada klien iOS
Solusi: Integrasikan komponen ultra-low latency terbaru dari pemutar. Implementasikan penarikan aliran RTS pada klien iOS.
Saat aplikasi iOS berada di latar belakang atau belum dimulai, audio diputar tetapi tidak ada video yang ditampilkan jika pengguna membuka aplikasi melalui notifikasi.
Solusi: Anda dapat menghapus UIApplicationStateActive == [[UIApplication sharedApplication] applicationState].
- (AliPlayer *)aliPlayer{
if (!_aliPlayer && UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]) {
_aliPlayer = [[AliPlayer alloc] init];
_aliPlayer.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
_aliPlayer.rate = 1;
_aliPlayer.delegate = self;
_aliPlayer.playerView = self.playerView;
}
return _aliPlayer;
}Saat memutar aliran langsung, log melaporkan error standar: "-5, IO error (Input/Output (I/O))"
Saat Anda memutar aliran langsung, gunakan nilai default untuk pengaturan cache dan kontrol latensi (startBufferDuration, highBufferDuration, dan maxBufferDuration di AVPConfig). Jangan menyesuaikan pengaturan ini secara manual. Verifikasi konfigurasi Anda terhadap Konfigurasi cache dan kontrol latensi.
Setelah saya menjeda pemutaran, berpindah ke halaman lain, lalu kembali untuk melanjutkan pemutaran, muncul error terkait audio di log: "Deactivating an audio session that has running I/O." atau "All I/O should be stopped or paused prior to deactivating the audio session."
Gejala: Di halaman pemutaran video, Anda menjeda pemutaran dan berpindah ke halaman lain yang memiliki audio. Saat kembali, Anda tidak dapat melanjutkan pemutaran, dan muncul error terkait audio seperti "Deactivating an audio session that has running I/O." atau "All I/O should be stopped or paused prior to deactivating the audio session." di log.
Solusi: Periksa konflik dalam pengaturan audio (properti AudioSession). Misalnya, saat Anda keluar dari halaman lain yang memiliki audio, sumber daya audio mungkin tidak dilepas tepat waktu (perekaman atau pemutaran audio terkait tidak dihentikan segera).
Terjadi error saat AliListPlayer digunakan untuk memutar video HLS (m3u8)
Versi SDK Pemutar Video Apsara sebelum V5.4.5.0 tidak mendukung penggunaan pemutar daftar AliListPlayer untuk memutar video HLS (m3u8). Versi V5.4.5.0 dan yang lebih baru mendukung pemutaran video HLS (m3u8), tetapi Anda harus mengaktifkan caching lokal. Caching lokal.
Tidak dapat memutar video di latar belakang
Gejala: ApsaraVideo Player SDK untuk iOS tidak mendukung pemutaran latar belakang secara default. Demo juga tidak memutar video di latar belakang.
Solusi:
Aktifkan fitur pengumpulan data latar belakang di Xcode. Di Xcode, pilih target, buka tab Capabilities, atur toggle Background Modes ke ON, dan di daftar Modes yang diperluas, pilih Audio, AirPlay, and Picture in Picture.
Jika Anda mengimplementasikan metode pemantauan foreground/background aplikasi, komentari metode pause dan resume terkait.
// Tambahkan observer untuk mendeteksi saat aplikasi masuk ke latar belakang [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnterBackground) name: UIApplicationWillResignActiveNotification object:nil]; // Metode ini dipanggil saat aplikasi masuk ke foreground dari latar belakang [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name: UIApplicationDidBecomeActiveNotification object:nil]; // Metode pause yang perlu dikomentari - (void)applicationEnterBackground { // [self.player pause]; } // Metode restart yang perlu dikomentari - (void)applicationDidBecomeActive { // [self.player start]; }
Error "Redirect to a url" kadang-kadang terjadi selama pemutaran video
Error ini mungkin terjadi karena sumber video dibajak. Aktifkan HTTPDNS pada pemutar untuk mengatasinya. Konfigurasi HTTPDNS untuk klien iOS.
Terjadi error unsupported protocol saat Anda memutar aliran ARTC
Penyebab 1: Lapisan bridge antara pemutar dan komponen RTS (AlivcArtc) serta komponen RTS (RtsSDK) belum diintegrasikan, meskipun ApsaraVideo Player SDK telah diintegrasikan.
Solusi: Untuk informasi cara mengintegrasikan komponen, lihat Implementasikan penarikan aliran RTS pada klien iOS.
Penyebab 2: Versi lapisan bridge antara pemutar dan komponen RTS (AlivcArtc) tidak konsisten dengan versi pemutar.
Solusi: Lapisan bridge (AlivcArtc) dan pemutar harus memiliki nomor versi yang sama. Implementasikan penarikan aliran RTS pada klien iOS.
Jika video ditranskode ke beberapa definisi, definisi mana yang diputar oleh ApsaraVideo Player SDK secara default?
SDK memutar definisi pertama yang tersedia dalam urutan berikut: FD, LD, SD, HD, 2K, 4K, OD. Definisi.
Cara menentukan definisi default untuk pemutaran video
Contoh:
// Kode berikut memberikan contoh pemutaran menggunakan VidSts.
AVPVidStsSource *stsSource = [[AVPVidStsSource alloc] init];
stsSource.vid = @"<vid>";
stsSource.accessKeyId = @"<accessKeyId>";
stsSource.securityToken = @"<securityToken>";
stsSource.accessKeySecret = @"<accessKeySecret>";
stsSource.quality = @""; // Definisi yang diharapkan untuk pemutaran. Nilai yang valid: FD, LD, SD, HD, 2K, 4K, dan OD.
stsSource.forceQuality = NO; // Menentukan apakah video diputar secara paksa dalam definisi yang diharapkan. NO: Video tidak diputar secara paksa dalam definisi yang diharapkan. Pemutar mencari definisi dalam urutan default dan memutar video dalam definisi pertama yang ditemukan. YES: Video diputar secara paksa dalam definisi yang diharapkan. Jika definisi yang diharapkan tidak ditemukan, video tidak diputar.Jika suatu definisi memiliki beberapa aliran, aliran mana yang diputar oleh ApsaraVideo Player SDK?
Jika suatu definisi memiliki beberapa aliran, ApsaraVideo Player SDK memutar aliran terbaru.
Bagaimana cara mengonfigurasi video agar diputar tanpa watermark tetapi diunduh dengan watermark?
Transkode video ke beberapa definisi. Putar definisi tanpa watermark dan unduh definisi dengan watermark.
Mode landscape tidak berlaku
ApsaraVideo Player SDK untuk iOS tidak menyediakan metode untuk mengimplementasikan mode landscape. Anda perlu mengimplementasikan fitur ini berdasarkan API sistem iOS. Saat mengimplementasikan mode landscape, pastikan untuk mengatur dengan benar frame dari aliplayer.playerView.
Cara memperoleh log
Kirimkan log saat meminta dukungan teknis Alibaba Cloud untuk mempercepat penyelesaian masalah.
Peroleh log.
Atur tingkat log ke
LOG_LEVEL_TRACEsebelum memperoleh log. Peroleh log SDK.Berikan log yang dihasilkan kepada dukungan teknis Alibaba Cloud.
Setelah cache lokal diaktifkan, video multi-bitrate (HLS) melewatkan cache.
Fenomena masalah: Cache lokal telah diaktifkan dan dipreloaded sesuai dokumen, tetapi progres saat mencari kembali melewatkan cache selama pemutaran, atau pemutaran tidak dapat dilanjutkan setelah jaringan terputus, atau pemeriksaan file cache mengembalikan bahwa file tersebut tidak ada, atau direktori cache kosong setelah preload dimatikan.
Penyebab masalah: Dalam skenario multi-bitrate (HLS), jika aliran tertentu tidak dipilih secara eksplisit selama pemutaran, pemutar beroperasi dalam mode ABR (adaptive bit rate), dan data dalam mode ABR tidak disimpan ke disk, sehingga tidak ada cache lokal yang dihasilkan. Hanya setelah selectTrack dipanggil secara eksplisit untuk memilih aliran kode tertentu, data yang dipilih akan dicache ke lokal. Jika selectTrack tidak dipanggil (atau diberikan SELECT_AVPTRACK_TYPE_VIDEO_AUTO), pemrosesan dilakukan sesuai ABR.
Solusi: Pastikan preload dan pemutaran menggunakan definisi yang sama dan alamat pemutaran yang sama, serta pilih aliran kode secara eksplisit selama pemutaran.
Pada tahap preload, cache lokal diaktifkan untuk memulai preload pada aliran kode definisi tertentu.
Pada fase pemutaran, panggil
selectTracksetelahonPlayerEventmenerima event persiapan selesai (AVPEventPrepareDone), dan pilih definisi yang sama dengan preload;setUrlSource(AVPUrlSource) menggunakan alamat pemutaran yang sama dengan preload, lalupreparedanstart.Jika bitrate awal tidak konsisten dengan bitrate default, buffering akan dipicu. Disarankan untuk mengatur bitrate awal guna mengurangi gangguan saat switching.
Memutar file HLS (m3u8) yang diunduh secara lokal menghasilkan error “No such file or directory.”
Fenomena masalah: Setelah HLS diunduh offline, memutar alamat lokal melaporkan No such file or directory (file tidak ditemukan). Masalah ini mungkin tidak selalu terjadi dan lebih mudah direproduksi dalam skenario seperti switching cepat multi-halaman (sliding cepat).
Penyebab masalah: Unduhan offline HLS biasanya hanya mengunduh slice ts dan m3u8 salah satu definisi (misalnya 540p) untuk menghemat ruang, tetapi master m3u8 yang disimpan secara lokal masih menyimpan catatan semua definisi (misalnya 1080p/720p/540p/360p) apa adanya. Selama pemutaran, jika definisi yang diunduh tidak ditentukan sebelum prepare, pemutar akan mencoba meminta bagian definisi lain yang tidak ada secara lokal sesuai logika default/adaptif, sehingga melaporkan bahwa file tidak ditemukan. Penyebab umum adalah kelalaian memanggil dengan kejelasan yang ditentukan, atau waktu pemanggilan lebih lambat dari prepare.
Solusi:
setDefaultResolution dipanggil sebelum prepare, menentukan definisi yang sama dengan unduhan offline.
Pastikan semua portal pemutaran diatur dengan definisi default, termasuk sliding cepat, multiplexing multi-instans, switching preload, dan cabang lainnya untuk menghindari melewatkan 1 jalur.
getCurrentTrack dapat digunakan untuk memverifikasi apakah definisi awal aktual adalah definisi yang diunduh.
Terjadi ketidaksesuaian audio dan video setelah pergantian video, atau video yang sama diputar berulang kali dan melewatkan cache.
Fenomena masalah: Setelah cache lokal diaktifkan, saat mengganti video (seperti mengganti episode), terjadi ketidaksesuaian suara dan gambar (layar menampilkan video baru tetapi suara masih dari video sebelumnya), atau video yang sama diputar berulang kali tanpa mengenai cache; Setelah cache dihapus, kembali normal.
Penyebab masalah: Setelah cache lokal diaktifkan, pemutar menggunakan Hash yang dikembalikan oleh callback setCacheUrlHashCallback sebagai pengenal cache unik untuk setiap alamat pemutaran (iOS mengimplementasikan callback ini melalui pointer fungsi C). Jika callback tidak memastikan bahwa "alamat pemutaran yang sama selalu mengembalikan hash yang sama, konten berbeda mengembalikan hash berbeda", hal ini akan menyebabkan ketidakcocokan kunci cache: konten berbeda mengenai cache yang sama (ditampilkan sebagai ketidaksesuaian audio dan gambar), atau alamat yang sama setiap kali menghasilkan hash berbeda dan tidak dapat mengenai cache.
Solusi:
Callback harus secara stabil mengembalikan hash yang sama untuk alamat pemutaran yang sama, dan media berbeda harus mengembalikan hash berbeda.
Misalnya, untuk menghapus parameter autentikasi guna meningkatkan tingkat hit, hanya hitung hash setelah parameter autentikasi dihapus untuk alamat pemutaran (m3u8/mp4); keyURL m3u8 terenkripsi tidak perlu diautentikasi, jika tidak kunci video berbeda akan mengenai cache yang sama dan menyebabkan kegagalan pemutaran—dapat ditangani secara berbeda berdasarkan nama domain dalam callback.
Jika file yang sama memiliki alamat HTTP dan HTTPS, protokol dapat diseragamkan atau hash dapat dihitung setelah header protokol dihapus.
Untuk detailnya, lihat Fitur lanjutan.
Autentikasi gagal saat memutar video terenkripsi privat Alibaba Cloud
Fenomena masalah: Saat memutar video yang dienkripsi oleh Alibaba Cloud (enkripsi privat), autentikasi gagal atau tidak dapat diputar.
Penyebab masalah: Enkripsi video Alibaba Cloud (enkripsi privat) didekripsi melalui interaksi antara pemutar dan server, dan pemutaran harus dimulai melalui pemutaran vid. Jika Anda menggunakan AVPUrlSource on-demand untuk langsung mentransfer alamat pemutaran (enkripsi privat umum), autentikasi dan dekripsi tidak dapat diselesaikan, sehingga gagal.
Solusi:
Video terenkripsi privat diputar di iOS sesuai permintaan melalui
AVPVidAuthSource(VidAuth) atauAVPVidStsSource(VidSts). Jika aliran keluaran mencakup campuran aliran terenkripsi privat dan non-privat, Anda dapat mengatur tipe enkripsi keAliyunVoDEncryptionuntuk memfilter aliran terenkripsi privat.Catatan: Hanya "enkripsi privat berlisensi" yang mendukung pemutaran on-demand
AVPUrlSource(MP4 harus ditambahkanetavirp_nuyila=1di akhir URL, HLS dapat langsung menggunakan URL asli di versi yang didukung), enkripsi privat biasa tidak berlaku.
Untuk detailnya, lihat Putar video terenkripsi.