Tema ini menjelaskan cara mengintegrasikan Native RTS SDK ke dalam ApsaraVideo Player SDK untuk mengimplementasikan Real-Time Streaming (RTS) pada klien iOS.
Prasyarat
CocoaPods harus sudah terpasang di lingkungan pengembangan Anda.
Integrasikan SDK
Gunakan CocoaPods untuk memasang ApsaraVideo Player SDK dan Native RTS SDK.
Buka jendela terminal.
Jalankan perintah berikut di direktori proyek Anda untuk membuat Podfile:
pod init
Di dalam Podfile, tambahkan versi terbaru dari SDK sebagai dependensi.
pod 'RtsSDK' pod 'AliPlayerSDK_iOS' pod 'AliPlayerSDK_iOS_ARTC'CatatanSetelah menambahkan dependensi
AliPlayerSDK_iOS_ARTCdanRtsSDK, RTS SDK secara otomatis terintegrasi ke dalam ApsaraVideo Player SDK sebagai Plugin.Untuk menggunakan versi lain dari SDK, tentukan nomor versinya. Contoh:
pod 'RtsSDK','2.1.0'. Informasi lebih lanjut tentang versi terbaru ApsaraVideo Player SDK untuk iOS dapat ditemukan di Catatan Rilis untuk ApsaraVideo Player SDK untuk iOS. Untuk informasi lebih lanjut tentang versi terbaru RTS SDK untuk iOS, lihat Download SDK.Versi Native RTS SDK harus sesuai dengan versi ApsaraVideo Player SDK. Untuk informasi lebih lanjut, lihat Unduhan SDK dan Catatan Rilis.
Jalankan perintah berikut untuk memasang SDK. Setelah pemasangan selesai, file *.xcworkspace akan dibuat.
pod install
Panggil metode yang disediakan oleh ApsaraVideo Player SDK
Gunakan metode yang disediakan oleh ApsaraVideo Player SDK untuk iOS guna mengimplementasikan fitur RTS. Informasi lebih lanjut tentang fitur lainnya dari ApsaraVideo Player SDK dapat ditemukan di Fitur Lanjutan dan Operasi API untuk ApsaraVideo Player SDK untuk Android.
Bagian ini menyediakan potongan kode utama. Untuk contoh kode lengkap, lihat kelas AUILiveRtsPlayPullViewController di bawah Komponen AUILiveRtsPlay dalam proyek sumber terbuka MONE_demo_opensource_iOS.
Saat menggunakan ApsaraVideo Player SDK untuk menarik aliran melalui RTS, metode pause tidak dapat digunakan untuk menjeda pemutaran aliran. Untuk menjeda pemutaran, gunakan metode stop untuk menghentikan pemutaran, lalu panggil metode prepare untuk melanjutkan pemutaran.
Pencarian tidak didukung saat menggunakan ApsaraVideo Player SDK untuk menarik aliran melalui RTS.
Inisialisasi AliPlayer
- (AliPlayer *)aliPlayer{ if (!_aliPlayer) { _aliPlayer = [[AliPlayer alloc] init]; _aliPlayer.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT; _aliPlayer.rate = 1; // Jika Anda ingin menggunakan AVPDelegate, tambahkan baris berikut: _aliPlayer.delegate = self; // Konfigurasikan antarmuka pengguna (UI) view dan terapkan UI view ke AliPlayer. _aliPlayer.playerView = self.basePlayerView.playerView; _aliPlayer.autoPlay = YES; } return _aliPlayer; }Konfigurasikan URL streaming
AVPUrlSource *source = [[AVPUrlSource alloc] urlWithString:_url]; [self.aliPlayer setUrlSource:source];Konfigurasikan parameter pemutaran
Konfigurasikan parameter pemutaran berikut untuk meningkatkan performa RTS. Pastikan konfigurasi dilakukan sebelum memanggil metode
prepare. Jika tidak, konfigurasi tidak akan berlaku.AVPConfig *config = self.aliPlayer.getConfig; // Latensi streaming maksimum. [config setMaxDelayTime:1000]; // Periode buffer. [config setHighBufferDuration:10]; // Latensi startup maksimum. [config setStartBufferDuration:10]; [_aliPlayer setConfig:config]; // Secara default, decoding perangkat keras diaktifkan. Jika decoding perangkat keras gagal selama tahap persiapan pemain, pemain secara otomatis beralih ke decoding perangkat lunak. _aliPlayer.enableHardwareDecoder = YES;Aktifkan atau nonaktifkan logging
// Aktifkan logging. [AliPlayer setEnableLog:YES]; [AliPlayer setLogCallbackInfo:LOG_LEVEL_TRACE callbackBlock:nil]; // Nonaktifkan logging. [AliPlayer setEnableLog:NO]; [AliPlayer setLogCallbackInfo:LOG_LEVEL_NONE callbackBlock:nil];CatatanJika aliran ditarik melalui Real-Time Messaging Protocol (RTMP), kami sarankan menonaktifkan logging saat melakukan debugging pada perangkat fisik.
Kontrol pemain
[self.aliPlayer prepare]; [self.aliPlayer stop]; [self.aliPlayer destroy]; [self.aliPlayer reload];Daftarkan delegasi sebelum pemutaran
-(void)createAliPlayer { // 1. Buat instance pemain. AliPlayer *aliPlayer = [[AliPlayer alloc] init]; AVPConfig *config = [aliPlayer getConfig]; config.maxDelayTime = 1000; config.highBufferDuration = 10; config.startBufferDuration = 10; // 2. Daftarkan delegasi. aliPlayer.delegate = self; [aliPlayer setConfig:config]; aliPlayer.autoPlay = YES; NSString *url = "artc://xxxx"; AVPUrlSource *source = [[AVPUrlSource alloc] urlWithString:self.url]; [aliPlayer setUrlSource:source]; [aliPlayer prepare]; } // 3. Dengarkan acara pemain. -(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString )eventWithString description:(NSString *)description { }Kembali ke Streaming Standar
Untuk kembali ke Streaming Standar ketika RTS mengalami kegagalan pemutaran, ubah URL streaming dengan awalan artc:// menjadi format HTTP-FLV dan gunakan URL baru untuk pemutaran.
self.playUrl = @"artc://xxxx"; // Hentikan pemutaran. [self.aliplayer stop]; // Dapatkan awalan URL streaming. NSArray *urlSeparated = [self.playUrl componentsSeparatedByString:@"://"]; NSString *urlPrefix = urlSeparated.firstObject; // Periksa apakah awalan URL adalah artc. Jika awalannya adalah artc, ubah URL menjadi format HTTP-FLV. if ([urlPrefix isEqualToString:@"artc"]) { self.playUrl = @"http://xxxx.flv"; // Atur nilai ke URL streaming aktual Anda dalam format HTTP-FLV. // Konfigurasikan ulang sumber pemutaran dan siapkan untuk pemutaran. AVPConfig *config = [self.player getConfig]; config.maxDelayTime = 10000; config.highBufferDuration = 100; config.startBufferDuration = 100; [self.aliplayer setConfig:config]; AVPUrlSource *source = [[AVPUrlSource alloc] urlWithString:self.playUrl]; [self.aliplayer setUrlSource:source]; // Mulai pemutaran. [self.aliplayer prepare]; }Gunakan pendengar acara untuk memeriksa apakah RTS SDK berjalan seperti yang diharapkan. Jika pendengar acara menerima pesan dari komponen pemain selama inisiasi pemutaran atau streaming langsung, ekstrak detail RTS SDK dari pesan tersebut menggunakan parameter code. Jika nilai parameter code adalah E_DNS_FAIL, E_AUTH_FAIL, E_CONN_TIMEOUT, E_SUB_TIMEOUT, atau E_SUB_NO_STREAM, kembalikan ke Streaming Standar. Jika nilainya adalah E_STREAM_BROKEN, coba lagi pemutaran sekali. Jika nilainya tetap E_STREAM_BROKEN setelah mencoba lagi pemutaran, kembalikan ke Streaming Standar. Jika nilainya adalah E_RECV_STOP_SIGNAL, Anda dapat terus menggunakan RTS.
Untuk mengimplementasikan logika ini, pastikan Anda mengimpor API yang diperlukan dari RTS SDK.
#import <RtsSDK/rts_messages.h>Contoh kode untuk pendengar acara:
self.retryStartPlay = YES; ...... /** @brief Callback untuk acara pemain. @param player Pointer untuk pemain. @param eventWithString Jenis acara pemain. @param description Deskripsi acara pemain. @see AVPEventType */ - (void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description { switch (eventWithString) { case EVENT_PLAYER_DIRECT_COMPONENT_MSG: { NSDictionary *descriptionDic = [[description rts_toDictionary] copy]; NSString *contentStr = [descriptionDic objectForKey:@"content"]; NSDictionary *kv = [contentStr rts_paramsToDictionaryWithSeparator:@"="]; NSNumber *type = [kv objectForKey:@"code"]; switch (type.intValue) { case E_DNS_FAIL: // Resolusi DNS gagal. case E_AUTH_FAIL: // Otentikasi gagal. case E_CONN_TIMEOUT: // Koneksi habis waktu. case E_SUB_TIMEOUT: // Terjadi kesalahan selama langganan atau waktu langganan habis. case E_SUB_NO_STREAM: // Aliran yang dilanggan pengguna tidak ada. { // Kembali ke Streaming Standar. } break; case E_STREAM_BROKEN: // Transmisi paket audio dan video terputus karena timeout. { // Pertama kali Anda menerima pesan, coba lagi pemutaran sekali. if (self.retryStartPlay) { [self onStartPlay]; self.retryStartPlay = NO; } else { // Jika Anda menerima pesan lagi, kembali ke Streaming Standar. } } break; case E_RECV_STOP_SIGNAL: { // Hentikan pemutaran. [self.aliplayer stop]; } break; default: break; } } break; default: break; } } ...... #pragma mark -- Kategorikan NSString, ekstrak metode umum, dan parsing string JSON. - (NSDictionary *)rts_toDictionary { if (self == nil) { return nil; } NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"JSON parsing failed: %@",err); return nil; } return dic; } - (NSDictionary *)rts_paramsToDictionaryWithSeparator:(NSString*)split { if (self == nil) { return nil; } NSMutableDictionary *multiDic = @{}.mutableCopy; NSString *content = [self stringByReplacingOccurrencesOfString:@"\"" withString:@""]; NSArray *arr = [content componentsSeparatedByString:@","]; if (arr.count>0) { for (NSString *str in arr) { NSArray *kvArr = [str componentsSeparatedByString:split]; if (kvArr.count==2) { [multiDic setValue:kvArr[1] forKey:kvArr[0]]; } } } return multiDic; }Dapatkan RTS TraceID
Gunakan pendengar acara untuk mendapatkan RTS TraceID. Jika pendengar acara menerima pesan dari komponen pemain, ekstrak detail RTS SDK dari pesan tersebut menggunakan parameter code. Jika nilai parameter code adalah E_HELP_SUPPORT_ID_SUBSCRIBE, TraceId ditambahkan setelah "-sub-" dalam string JSON yang dikembalikan.
- (void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description { switch (eventWithString) { case EVENT_PLAYER_DIRECT_COMPONENT_MSG: { NSDictionary *descriptionDic = [[description rts_toDictionary] copy]; NSString *contentStr = [descriptionDic objectForKey:@"content"]; NSDictionary *kv = [contentStr rts_paramsToDictionaryWithSeparator:@"="]; NSNumber *type = [kv objectForKey:@"code"]; switch (type.intValue) { case E_HELP_SUPPORT_ID_SUBSCRIBE: // Dapatkan TraceId. { NSString *desc = [kv objectForKey:@"desc"]; if ([desc containsString:@"-sub-"]) { NSString *traceId = [desc componentsSeparatedByString:@"-sub-"].lastObject; self.traceId = traceId; } } break; default: break; } } break; default: break; } }