全部产品
Search
文档中心

ApsaraVideo VOD:Fitur dasar

更新时间:Nov 21, 2025

Topik ini menjelaskan cara membuat instans pemutar iOS dan memberikan contoh penggunaan fitur pemutaran dasar, seperti mengatur volume, mengaktifkan pencarian video, mendengarkan status pemutaran, mengaktifkan putar ulang berulang, mengatur kecepatan pemutaran, dan mengganti trek audio.

Penting

Untuk menjalankan demo, unduh, lalu kompilasi dan jalankan. Untuk informasi selengkapnya, lihat Jalankan demo.

Tetapkan sumber pemutaran (DataSource)

  • SDK Pemutar Video Apsara untuk iOS mendukung empat metode pemutaran untuk video sesuai permintaan (VOD): VidAuth (direkomendasikan bagi pengguna ApsaraVideo VOD), VidSts, UrlSource, dan pemutaran terenkripsi.

  • SDK Pemutar Video Apsara untuk iOS mendukung dua metode pemutaran untuk streaming langsung: UrlSource dan pemutaran terenkripsi.

Pemutaran VOD

Pemutaran VOD menggunakan VidAuth (Direkomendasikan)

Untuk memutar video VOD menggunakan VidAuth, tetapkan properti vid pemutar ke ID video dan properti playauth ke kredensial pemutaran.

  • ID Video: Anda dapat memperoleh ID video dari konsol ApsaraVideo VOD (Media Library > Audio/Video) atau dengan memanggil operasi API SearchMedia setelah video diunggah.

  • Kredensial pemutaran: Anda dapat memperoleh kredensial pemutaran dengan memanggil operasi API GetVideoPlayAuth. Kami menyarankan agar Anda mengintegrasikan SDK sisi server ApsaraVideo VOD untuk memperoleh kredensial pemutaran, sehingga tidak perlu menandatangani permintaan secara manual. Untuk contoh cara memanggil operasi API ini, lihat API Explorer.

Kami merekomendasikan pengguna ApsaraVideo VOD untuk menggunakan metode pemutaran ini. Dibandingkan dengan metode STS, metode PlayAuth lebih aman dan lebih mudah digunakan. Untuk perbandingan detail, lihat Perbandingan antara metode berbasis kredensial dan metode berbasis STS.

Jika Anda mengaktifkan transmisi langsung parameter enkripsi HLS di konsol ApsaraVideo VOD, nama parameter default adalah MtsHlsUriToken. Untuk informasi selengkapnya, lihat Transmisi langsung parameter enkripsi HLS. Dalam hal ini, tetapkan nilai MtsHlsUriToken dalam sumber VOD seperti yang ditunjukkan pada kode berikut.

AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
authSource.vid = @"Informasi Vid"; // Wajib diisi. ID video (VideoId).
authSource.playAuth = @"<yourPlayAuth>"; // Wajib diisi. Kredensial pemutaran. Anda harus memanggil operasi GetVideoPlayAuth ApsaraVideo VOD untuk menghasilkan kredensial.
authSource.region = @"Wilayah tempat ApsaraVideo VOD diaktifkan"; // Untuk SDK Pemutar Video Apsara versi V5.5.5.0 dan yang lebih baru, parameter ini sudah tidak digunakan lagi. Anda tidak perlu menyetel wilayah karena pemutar akan menguraikannya secara otomatis. Untuk versi sebelum V5.5.5.0, parameter ini wajib diisi. Wilayah tempat ApsaraVideo VOD diaktifkan. Nilai default: cn-shanghai.
// authSource.authTimeout = 3600; // Periode validitas URL pemutaran dalam detik. Nilai ini menimpa periode validitas Penandatanganan URL yang Anda tetapkan di konsol ApsaraVideo VOD. Jika Anda tidak menentukan parameter ini, nilai default 3600 akan digunakan. Jika Anda menyetel parameter ini, pastikan periode validitasnya lebih panjang daripada durasi video agar URL pemutaran tidak kedaluwarsa sebelum pemutaran selesai.

// Jika Anda mengaktifkan transmisi langsung parameter enkripsi HLS di konsol ApsaraVideo VOD dan nama parameter default adalah MtsHlsUriToken, Anda harus menyetel konfigurasi dan meneruskannya ke vid. Lihat kode berikut.
// Jika Anda tidak mengaktifkan transmisi langsung parameter enkripsi HLS di konsol ApsaraVideo VOD, Anda tidak perlu mengintegrasikan kode berikut.
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
authSource.playConfig = [vp generatePlayerConfig];

[self.player setAuthSource:authSource];

Pemutaran VOD menggunakan VidSts

Untuk memutar video VOD menggunakan VidSts, Anda harus menggunakan kredensial Layanan Token Keamanan (STS) sementara, bukan kredensial pemutaran ApsaraVideo VOD. Anda harus memperoleh token STS dan pasangan AccessKey sementara (AccessKeyId dan AccessKeySecret) terlebih dahulu. Untuk informasi selengkapnya, lihat Memperoleh token STS.

Jika Anda mengaktifkan transmisi langsung parameter enkripsi HLS di konsol ApsaraVideo VOD, nama parameter default adalah MtsHlsUriToken. Untuk informasi selengkapnya, lihat Transmisi langsung parameter enkripsi HLS. Dalam hal ini, tetapkan nilai MtsHlsUriToken dalam sumber VOD seperti yang ditunjukkan pada kode berikut.

AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
source.vid = @"Informasi Vid"; // Wajib diisi. ID video (VideoId).
source.region = @"Wilayah tempat ApsaraVideo VOD diaktifkan"; // Wajib diisi. Wilayah tempat ApsaraVideo VOD diaktifkan. Nilai default: cn-shanghai.
source.securityToken = @"<yourSecurityToken>"; // Wajib diisi. Token STS. Anda harus memanggil operasi AssumeRole STS untuk menghasilkan token.
source.accessKeySecret = @"<yourAccessKeySecret>"; // Wajib diisi. Rahasia AccessKey dari pasangan AccessKey sementara. Anda harus memanggil operasi AssumeRole STS untuk menghasilkan rahasia.
source.accessKeyId = @"<yourAccessKeyId>"; // Wajib diisi. ID AccessKey dari pasangan AccessKey sementara. Anda harus memanggil operasi AssumeRole STS untuk menghasilkan ID.
// source.authTimeout = 3600; // Periode validitas URL pemutaran dalam detik. Nilai ini menimpa periode validitas Penandatanganan URL yang Anda tetapkan di konsol ApsaraVideo VOD. Jika Anda tidak menentukan parameter ini, nilai default 3600 akan digunakan. Jika Anda menyetel parameter ini, pastikan periode validitasnya lebih panjang daripada durasi video agar URL pemutaran tidak kedaluwarsa sebelum pemutaran selesai.
// Jika Anda mengaktifkan transmisi langsung parameter enkripsi HLS di konsol ApsaraVideo VOD dan nama parameter default adalah MtsHlsUriToken, Anda harus menyetel konfigurasi dan meneruskannya ke vid. Lihat kode berikut.
// Jika Anda tidak mengaktifkan transmisi langsung parameter enkripsi HLS di konsol ApsaraVideo VOD, Anda tidak perlu mengintegrasikan kode berikut.
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
source.playConfig = [vp generatePlayerConfig];
// Tetapkan sumber pemutaran.
[self.player setStsSource:source]

Pemutaran VOD menggunakan UrlSource

Untuk memutar video VOD menggunakan UrlSource, tetapkan properti source pemutar ke URL pemutaran.

  • URL pemutaran di ApsaraVideo VOD: Anda dapat memanggil operasi API GetPlayInfo untuk memperoleh URL. Kami menyarankan agar Anda mengintegrasikan SDK sisi server ApsaraVideo VOD untuk memperoleh URL pemutaran, sehingga tidak perlu menandatangani permintaan secara manual. Untuk contoh cara memanggil operasi API ini, lihat API Explorer.

  • URL video lokal: Pastikan Anda memiliki izin akses yang diperlukan. Anda dapat memanggil API sistem untuk mengambil jalur lengkap file video lokal yang dapat diakses, seperti /sdcard/xxx/xxx/xxx.mp4 atau content://xxx/xxx/xx.mp4.

AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // Wajib diisi. URL pemutaran. URL dapat berupa URL VOD pihak ketiga, URL pemutaran di ApsaraVideo VOD, atau URL video lokal.
[self.player setUrlSource:urlSource]; 

Pemutaran VOD terenkripsi

VOD mendukung enkripsi HLS, enkripsi privat Alibaba Cloud, dan enkripsi DRM. Untuk informasi selengkapnya tentang pemutaran terenkripsi, lihat Putar video terenkripsi di iOS.

Pemutaran streaming langsung

Untuk informasi selengkapnya, lihat Pemutaran streaming langsung standar.

Catatan
  • UrlSource menggunakan URL untuk pemutaran, sedangkan VidSts dan VidAuth menggunakan ID video (VID).

  • Untuk informasi tentang cara menyetel wilayah, lihat Wilayah VOD.

Kontrol pemutaran

SDK Pemutar Video Apsara untuk iOS mendukung operasi umum seperti memulai, menjeda, dan mencari.

Persiapkan pemutaran

Panggil antarmuka prepare untuk mempersiapkan pemutaran video. Contohnya ditunjukkan dalam kode berikut:

[self.player prepare];

Mulai pemutaran

Panggil antarmuka start untuk memulai pemutaran video. Contohnya ditunjukkan dalam kode berikut:

[self.player start];

Mulai pemutaran dari waktu tertentu

Panggil antarmuka seekToTime untuk memulai pemutaran dari waktu tertentu. Fitur ini cocok untuk skenario seperti saat pengguna menyeret bilah kemajuan atau melanjutkan pemutaran dari posisi tertentu. Berikut contoh kodenya:

// Parameter position menentukan waktu. Satuan: milidetik. Parameter seekMode dapat diatur ke mode akurat atau tidak akurat.
// Pencarian akurat
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// Pencarian tidak akurat
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];

Mulai pemutaran dari posisi tertentu. Fitur ini cocok untuk skenario di mana pengguna memulai pemutaran pada waktu tertentu. Agar berlaku, panggil antarmuka ini sekali sebelum setiap pemanggilan prepare. Kode berikut menunjukkan contohnya:

// Tetapkan waktu mulai dalam milidetik untuk pemanggilan prepare berikutnya dari pemutar. Pengaturan ini hanya berlaku untuk pemanggilan prepare berikutnya.
// Setelah prepare dipanggil, nilai ini secara otomatis dihapus. Jika metode ini tidak dipanggil lagi sebelum pemanggilan prepare berikutnya, pemutaran dimulai secara normal.
// Mode seek dapat diatur ke mode akurat atau tidak akurat.
[self.player setStartTime:time seekMode:seekMode];

Jeda pemutaran

Panggil antarmuka pause untuk menjeda pemutaran video. Contohnya ditunjukkan dalam kode berikut:

[self.player pause];

Lanjutkan pemutaran

Panggil antarmuka start untuk melanjutkan pemutaran video. Contohnya ditunjukkan dalam kode berikut:

[self.player start];

Hentikan pemutaran

Panggil antarmuka stop untuk menghentikan pemutaran video. Contohnya ditunjukkan dalam kode berikut:

[self.player stop];

Hapus pemutar

Anda dapat menghapus instans pemutar secara sinkron atau asinkron. Kode berikut memberikan contohnya:

// Penghapusan sinkron. Antarmuka stop dipanggil secara internal secara otomatis.
[self.player destroy];
// Penghapusan asinkron. Antarmuka stop dipanggil secara internal secara otomatis.
[self.player destroyAsync];
Catatan

Antarmuka penghapusan sinkron hanya mengembalikan tanggapan setelah semua sumber daya pemutar dilepaskan. Jika kecepatan respons antarmuka yang tinggi diperlukan, kami menyarankan agar Anda menggunakan antarmuka penghapusan asinkron. Perhatikan poin-poin berikut:

  1. Jangan melakukan operasi lain apa pun pada objek pemutar selama penghapusan asinkron.

  2. Anda tidak perlu menghentikan pemutar secara manual sebelum memanggil antarmuka penghapusan asinkron karena proses penghapusan mencakup prosedur penghentian asinkron.

Dengarkan status pemutar

SDK Pemutar Video Apsara untuk iOS memungkinkan Anda menyetel pendengar pemutar dan mendengarkan status pemutaran.

Tetapkan pendengar pemutar

Pemutar mendukung beberapa pendengar.

  • Callback onPlayerEvent dan onError sangat penting; kami menyarankan Anda untuk mengaturnya.

@interface SimplePlayerViewController ()<AVPDelegate>
@end
- (void)viewDidLoad {
    self.player = [[AliPlayer alloc] init];
    self.player.playerView = self.avpPlayerView.playerView;
    self.player.delegate = self;
    //...
}
/**
 @brief Callback untuk kesalahan.
 @param player Pointer pemutar.
 @param errorModel Deskripsi kesalahan. Untuk informasi selengkapnya, lihat AliVcPlayerErrorModel.
 */
- (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
    // Laporkan kesalahan dan hentikan pemutaran.
}
/**
 @brief Callback untuk event pemutar.
 @param player Pointer pemutar.
 @param eventType Jenis event. Untuk informasi selengkapnya, lihat AVPEventType.
 */
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType{
    switch(eventType){
        case AVPEventPrepareDone:{
            // Pemutar telah siap.
        }
            break;
        case AVPEventAutoPlayStart:
            // Putar otomatis dimulai.
            break;
        case AVPEventFirstRenderedStart:
            // Frame pertama dirender.
            break;
        case AVPEventCompletion:
            // Pemutaran selesai.
            break;
        case AVPEventLoadingStart:
            // Pemuatan buffer dimulai.
            break;
        case AVPEventLoadingEnd:
            // Pemuatan buffer selesai.
            break;
        case AVPEventSeekEnd:
            // Pencarian selesai.
            break;
        case AVPEventLoopingStart:
            // Putar ulang berulang dimulai.
            break;
        default:
            break;
    }
}
/**
 @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 {
    // Perbarui bilah kemajuan.
}
/**
 @brief Callback untuk posisi buffer.
 @param player Pointer pemutar.
 @param position Posisi buffer saat ini.
 */
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    // Perbarui kemajuan buffering.
}
/**
 @brief Callback untuk informasi trek.
 @param player Pointer pemutar.
 @param info Array informasi trek. Untuk informasi selengkapnya, lihat AVPTrackInfo.
 */
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    // Peroleh informasi tentang beberapa bitrate.
}
/**
 @brief Callback untuk menampilkan teks.
 @param player Pointer pemutar.
 @param index Indeks teks yang ditampilkan.
 @param subtitle String teks yang ditampilkan.
 */
- (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
    // Peroleh dan tampilkan teks.
}
/**
 @brief Callback untuk menyembunyikan teks.
 @param player Pointer pemutar.
 @param index Indeks teks yang ditampilkan.
 */
- (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
    // Sembunyikan teks.
}
/**
 @brief Callback untuk snapshot.
 @param player Pointer pemutar.
 @param image Citra.
 */
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
    // Pratinjau dan simpan snapshot.
}
/**
 @brief Callback untuk penyelesaian pergantian trek.
 @param player Pointer pemutar.
 @param info Informasi setelah pergantian. Untuk informasi selengkapnya, lihat AVPTrackInfo.
 */
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
    // Notifikasi hasil pergantian bitrate.
}

Dengarkan status pemutaran

Anda dapat mendengarkan status pemutar. Callback onPlayerStatusChanged memberikan status saat ini dari pemutar. Kode berikut memberikan contohnya:

- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
    switch (newStatus) {
    case AVPStatusIdle:{
           // Menganggur.
        }
 break;
        case AVPStatusInitialzed:{
           // Diinisialisasi.
        }
 break;
        case AVPStatusPrepared:{
           // Disiapkan.
        }
 break;
        case AVPStatusStarted:{
           // Memutar.
        }
 break;
case AVPStatusPaused:{
           // Dijeda.
        }
 break;
case AVPStatusStopped:{
           // Dihentikan.
        }
 break;
case AVPStatusCompletion:{
           // Pemutaran selesai.
        }
 break;
case AVPStatusError:{
           // Kesalahan.
        }
 break;
        default:
            break;
    }
}

Tetapkan mode tampilan

SDK Pemutar Video Apsara untuk iOS mendukung pengaturan tampilan seperti mengisi, memutar, dan mencerminkan.

Mengisi

Anda dapat mengatur salah satu dari tiga mode pengisian berikut: aspect fit, aspect fill, dan stretch to fill. Panggil antarmuka scalingMode untuk menyetel mode pengisian. Kode berikut menunjukkan contohnya:

// Tetapkan rasio aspek agar sesuai. Video diperkecil agar sesuai dalam tampilan tanpa distorsi.
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// Tetapkan rasio aspek agar mengisi. Video diperbesar agar mengisi tampilan tanpa distorsi.
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// Tetapkan mode meregang dan mengisi. Jika rasio aspek video berbeda dari rasio aspek tampilan, video mungkin mengalami distorsi.
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
Catatan

Pengaturan mode mengisi tidak berlaku untuk Gambar-dalam-Gambar (PiP).

Putar

Panggil antarmuka rotateMode untuk memutar video pada sudut tertentu. Berikut contoh kodenya:

// Putar video 0 derajat searah jarum jam.
self.player.rotateMode = AVP_ROTATE_0;
// Putar video 90 derajat searah jarum jam.
self.player.rotateMode = AVP_ROTATE_90;
// Putar video 180 derajat searah jarum jam.
self.player.rotateMode = AVP_ROTATE_180;
// Putar video 270 derajat searah jarum jam.
self.player.rotateMode = AVP_ROTATE_270;

Cerminkan

Anda dapat mengaktifkan pencerminan horizontal, pencerminan vertikal, atau menonaktifkan pencerminan. Panggil antarmuka mirrorMode untuk mengatur mode cermin. Kode berikut menunjukkan contohnya:

// Nonaktifkan pencerminan.
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// Aktifkan pencerminan horizontal.
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// Aktifkan pencerminan vertikal.
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;

Peroleh informasi pemutaran

SDK Pemutar Video Apsara untuk iOS memungkinkan Anda memperoleh kemajuan pemutaran saat ini, durasi pemutaran, dan kemajuan buffering.

Peroleh kemajuan pemutaran saat ini

Anda dapat memperoleh waktu pemutaran saat ini. Posisi dikembalikan dalam callback onCurrentPositionUpdate. Kode berikut memberikan contohnya:

- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// Parameter position menunjukkan kemajuan pemutaran saat ini dalam milidetik.
NSString *position = [NSString stringWithFormat:@"%lld", position];
}

Peroleh durasi pemutaran

Anda dapat memperoleh durasi total video. Durasi hanya dapat diambil setelah video dimuat, misalnya setelah callback onPrepared dipanggil. Satuan: milidetik. Kode berikut memberikan contohnya:

-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
  switch (eventType) {
    case AVPEventPrepareDone: {
      if (self.player.duration >= 0) {
       NSString *duration  = self.player.duration;
      }
    }
      break;
    default:
      break;
  }
}

Peroleh durasi pemutaran aktual

Anda dapat memperoleh durasi pemutaran aktual secara real time. Durasi yang diambil tidak termasuk waktu yang dihabiskan untuk jeda atau tersendat selama pemutaran. Kode berikut memberikan contohnya:

 NSString *duration = [player getPlayedDuration];

Peroleh kemajuan buffering

Anda dapat memperoleh kemajuan buffering video saat ini. Posisi dikembalikan dalam callback onBufferedPositionUpdate. Kode berikut memberikan contohnya:

- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    NSString *bufferPosition = position;
}

Peroleh laju frame rendering real-time, bitrate audio dan video, serta bitrate unduhan jaringan

Kode berikut memberikan contohnya:

// Peroleh laju frame rendering saat ini. Tipe data: Float.
[self.player getOption:AVP_OPTION_RENDER_FPS]
// Peroleh bitrate video yang sedang diputar. Tipe data: Float. Satuan: bps.
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
// Peroleh bitrate audio yang sedang diputar. Tipe data: Float. Satuan: bps.
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
// Peroleh bitrate unduhan jaringan saat ini. Tipe data: Float. Satuan: bps.
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]

Tetapkan volume

Anda dapat mengatur volume dan membisukan video.

Sesuaikan volume

Anda dapat mengatur volume. Rentang nilai yang valid adalah 0 hingga 2. Jika volume diatur ke nilai lebih dari 1, kebisingan mungkin terjadi; oleh karena itu, kami menyarankan agar Anda tidak mengatur volume melebihi 1. Setelah menyetel volume, Anda juga dapat mengambil informasi volumenya. Kode berikut menunjukkan contohnya:

// Nilai volume adalah bilangan real dari 0 hingga 2.
self.player.volume = 1.0f;
// Peroleh informasi volume.
self.player.volume

Bisukan video

Panggil antarmuka muted untuk membisukan video. Berikut contoh kodenya:

self.player.muted = YES;

Tetapkan kecepatan pemutaran

SDK Pemutar Video Apsara untuk iOS memungkinkan Anda mengatur kecepatan pemutaran. Dengan menggunakan metode rate, Anda dapat memutar video pada kecepatan 0,5× hingga 5× kecepatan aslinya tanpa mengubah nada suara. Contohnya ditunjukkan dalam kode berikut:

// Tetapkan kecepatan pemutaran. Anda dapat menyetel kecepatan pemutaran ke nilai dari 0,5 hingga 5. Kami menyarankan agar Anda menyetel nilai ke kelipatan 0,5, seperti 0,5, 1, atau 1,5.
self.player.rate = 1.0f;

Konfigurasikan beberapa definisi

Catatan

Untuk contoh kode detail, lihat modul MultiResolution di API-Example. Proyek ini adalah demo berbasis Objective-C untuk SDK Pemutar Video Apsara untuk iOS dan membantu pengembang mengintegrasikan fitur inti SDK dengan cepat.

Streaming langsung dengan UrlSource

Untuk informasi selengkapnya, lihat Pemutaran streaming langsung standar.

Pemutaran VOD menggunakan Vid (VidAuth atau VidSts)

Jika Anda menggunakan metode Vid (VidAuth atau VidSts) untuk pemutaran, tidak diperlukan konfigurasi tambahan. SDK Pemutar Video Apsara untuk iOS mengambil daftar definisi dari ApsaraVideo VOD dan memungkinkan Anda memperoleh serta mengganti definisi. Metode UrlSource tidak mendukung pengaturan ini.

Peroleh definisi

Setelah video dimuat, Anda dapat mengambil definisi video. Pendengar onTrackReady mengembalikan objek info dalam callback. Anda kemudian dapat mengambil trackBitrate dari definisi dari objek tersebut.

- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    for (int i=0; i<info.count; i++) {
        AVPTrackInfo* track = [info objectAtIndex:i];
        switch (track.trackType) {
            case AVPTRACK_TYPE_VIDEO: {
                int trackBitrate = track.trackBitrate;
            }
                break;
        }
    }
}

Ganti definisi

Untuk mengganti definisi, panggil metode selectTrack dan teruskan indeks TrackInfo yang sesuai.

[self.player selectTrack:index];

Notifikasi untuk pergantian definisi

Callback onTrackChanged dipanggil setelah definisi diganti.

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
 // Definisi diganti.
}

Pergantian cepat

Setelah mengaktifkan mode pergantian cepat, Anda akan menerima respons cepat setiap kali memanggil selectTrack secara manual.

AVPConfig *config = [self.player getConfig];
config.selectTrackBufferMode = 1;
[self.player setConfig:config];

Putar ulang berulang

SDK Pemutar Video Apsara untuk iOS mendukung putar ulang berulang. Anda dapat mengaktifkan fitur ini dengan menyetel properti loop. Setelah pemutaran selesai, video akan otomatis dimulai ulang dari awal. Contohnya:

self.player.loop = YES;

Callback AVPEventLoopingStart dipanggil pada awal putaran. Kode berikut menunjukkan contohnya:

- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventLoopingStart:
            break;
    }
}

Ganti trek audio

SDK Pemutar Video Apsara untuk iOS menyediakan fitur untuk mengganti trek audio. Fitur ini cocok untuk skenario di mana pengguna dapat mengganti bahasa audio saat menonton video dengan audio multi-bahasa.

Petunjuk

Saat ini, SDK mendukung pergantian antar aliran audio untuk aliran non-playlist (seperti aliran MP4), aliran HLS campuran bitrate tunggal, dan aliran HLS non-campuran bitrate tunggal. SDK juga mendukung pergantian antar substream untuk aliran HLS campuran multi-bitrate. Tabel berikut menjelaskan jenis aliran video.

Jenis aliran video

Akhiran aliran video

Jumlah bitrate

Jumlah file sub-m3u8

Jenis substream

Petunjuk pergantian

Aliran non-playlist (seperti aliran MP4)

.mp4

1

-

Aliran pemutaran berisi satu aliran video dan mungkin berisi beberapa aliran audio dan aliran teks.

Pergantian antara beberapa aliran audio didukung.

Aliran HLS campuran bitrate tunggal

.m3u8

1

1

Aliran pemutaran berisi satu aliran video dan mungkin berisi beberapa aliran audio dan aliran teks.

Pergantian antara beberapa aliran audio didukung.

Aliran HLS non-campuran bitrate tunggal

.m3u8

1

n

m3u8. Setiap substream hanya dapat berupa aliran video, aliran audio, atau aliran teks.

Pergantian antara beberapa aliran audio didukung.

Aliran HLS campuran multi-bitrate

.m3u8

n

n

m3u8. Setiap substream berisi satu aliran video dan mungkin berisi beberapa aliran audio dan aliran teks. Substream yang berbeda memiliki bitrate berbeda.

Saat ini, hanya pergantian antar substream yang didukung. Pergantian antara beberapa aliran audio dalam satu substream tidak didukung.

Contoh

  1. Tetapkan callback.

      // Callback onSubTrackReady biasanya terjadi sebelum callback prepare.
    - (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
        // Panggil getSubMediaInfo untuk memperoleh informasi MediaInfo. Anda hanya dapat memanggil metode ini setelah menerima callback onSubTrackReady. Jika tidak, nilainya kosong.
        AVPMediaInfo* subMediaInfo = [player getSubMediaInfo];
        // Telusuri.
        for (int i=0; i<subMediaInfo.tracks.count; i++) {
        	AVPTrackInfo* track = [subMediaInfo.tracks objectAtIndex:i];
            // Peroleh trek yang sesuai.
        }
    }
  2. Ganti trek audio.

    [self.player selectTrack:myTrack.trackIndex accurate:YES]

Gunakan gambar mini

Catatan

Untuk contoh kode detail, lihat modul Thumbnail di API-Example. Proyek ini adalah demo berbasis Objective-C untuk SDK Pemutar Video Apsara untuk iOS dan membantu pengembang mengintegrasikan fitur inti SDK dengan cepat.

Sebelum menggunakan gambar mini di SDK Pemutar Video Apsara, pastikan Anda telah mengonfigurasi gambar mini untuk video tersebut, yaitu sprite telah dihasilkan. Untuk melakukannya, buat templat screenshot sprite di konsol ApsaraVideo VOD dan gunakan alur kerja untuk memproses video dengan templat tersebut. Untuk informasi selengkapnya, lihat Screenshot video. Kode berikut menunjukkan cara menggunakan gambar mini di SDK Pemutar Video Apsara:

/**
 Menentukan apakah trek saat ini memiliki gambar mini. Jika tidak, gambar mini tidak ditampilkan.
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 Membuat tampilan kustom untuk menampilkan gambar mini.
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
 @brief: Callback untuk informasi trek.
 @param player: Pointer pemutar.
 @param info: Array informasi trek. Untuk informasi selengkapnya, lihat AVPTrackInfo.
 */
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    AVPMediaInfo* mediaInfo = [player getMediaInfo];
    if ((nil != mediaInfo.thumbnails) && (0 < [mediaInfo.thumbnails count])) {
        [self.player setThumbnailUrl:[mediaInfo.thumbnails objectAtIndex:0].URL];
        self.trackHasThumbnai = YES;
    }else {
        self.trackHasThumbnai = NO;
    }
}

/**
 Callback untuk perubahan bilah kemajuan.
 @param playerView playerView
 @param value: Nilai kemajuan.
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief: Callback untuk pengambilan gambar mini berhasil.
 @param positionMs: Posisi gambar mini yang ditentukan.
 @param fromPos: Posisi awal gambar mini.
 @param toPos: Posisi akhir gambar mini.
 @param image: Pointer citra gambar mini. Untuk macOS, ini adalah pointer NSImage. Untuk iOS, ini adalah pointer UIImage.
 */
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
    self.thumbnaiView.hidden = NO;
    [self.thumbnaiView setImage:(UIImage *)image];
}

/**
 @brief: Callback untuk pengambilan gambar mini gagal.
 @param positionMs: Posisi gambar mini yang ditentukan.
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

Catatan: Jika Anda menggunakan pemutaran berbasis URL, kode di atas tidak dapat langsung menampilkan gambar mini karena callback onTrackReady tidak mendukung MediaInfo untuk pemutaran berbasis URL. Dalam hal ini, kami menyarankan agar Anda menentukan URL gambar mini secara langsung.

/**
 Menentukan apakah trek saat ini memiliki gambar mini. Jika tidak, gambar mini tidak ditampilkan.
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 Membuat tampilan kustom untuk menampilkan gambar mini.
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
  onPrepare
 */
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
  if(newStatus == AVPStatusPrepared){
       [self.player setThumbnailUrl:[URL];// Hasilkan URL gambar mini spesifik berdasarkan API konsol.
       self.trackHasThumbnai = YES;
  }
}
/**
 Callback untuk perubahan bilah kemajuan.
 @param playerView playerView
 @param value: Nilai kemajuan.
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief: Callback untuk pengambilan gambar mini berhasil.
 @param positionMs: Posisi gambar mini yang ditentukan.
 @param fromPos: Posisi awal gambar mini.
 @param toPos: Posisi akhir gambar mini.
 @param image: Pointer citra gambar mini. Untuk macOS, ini adalah pointer NSImage. Untuk iOS, ini adalah pointer UIImage.
 */
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
    self.thumbnaiView.hidden = NO;
    [self.thumbnaiView setImage:(UIImage *)image];
}

/**
 @brief: Callback untuk pengambilan gambar mini gagal.
 @param positionMs: Posisi gambar mini yang ditentukan.
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

Peroleh log SDK

Saat SDK Pemutar Video Apsara berjalan, SDK menghasilkan informasi log terperinci yang mencakup status permintaan jaringan, hasil panggilan sistem, dan status permintaan izin. Pengembang dapat melihat log ini untuk men-debug kode atau memecahkan masalah dan meningkatkan efisiensi pengembangan.

Metode 1: Peroleh log SDK dari konsol alat pengembangan

Metode ini cocok untuk skenario di mana Anda dapat mereproduksi masalah dan mengumpulkan log di mesin lokal Anda.

  1. Aktifkan logging dan tetapkan tingkat log.

    // Aktifkan logging.
    [AliPlayer setEnableLog:YES];
    // Tetapkan tingkat log. Nilai default: LOG_LEVEL_INFO. Untuk memecahkan masalah, tetapkan tingkat ke LOG_LEVEL_TRACE.
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil];
  2. Tetapkan logging tingkat frame.

    // Tetapkan pencetakan log tingkat frame.
    // Nilai 0 menonaktifkan fitur. Nilai 1 mengaktifkan fitur.
    [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];
    Catatan

    Fitur logging tingkat frame terutama digunakan untuk memecahkan masalah.

  3. Kumpulkan log.

    1. Metode 1: Lihat log di konsol

      Setelah Anda mereproduksi masalah, Anda dapat mengambil log dari konsol alat pengembangan Anda, seperti Xcode.

    2. Metode 2: Keluarkan log ke file di jalur kustom

      1. Setelah Anda mengaktifkan logging, tentukan jalur kustom untuk file log di jalur sandbox sebelum membuat instans pemutar.

        NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        NSString *documentDirectory = [paths objectAtIndex:0];
        // logFilePath adalah contoh jalur. Anda dapat membuat file kustom, seperti file xxxx.log, di jalur sandbox.
        NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];
      2. Masukkan informasi log ke file kustom.

        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);
      3. Setelah Anda mereproduksi masalah, Anda dapat mengambil file .log yang dihasilkan dari jalur kustom.

Metode 2: Dengarkan log keluaran SDK melalui LogCallback

Metode ini cocok untuk skenario di mana masalah terjadi di sisi pengguna dan Anda tidak dapat mereproduksinya serta mengumpulkan log di mesin lokal Anda. Anda dapat mendengarkan log keluaran SDK melalui LogCallback dan secara otomatis mengeluarkannya ke saluran log aplikasi Anda.

  1. Aktifkan logging dan tetapkan tingkat log.

    // Aktifkan logging.
    [AliPlayer setEnableLog:YES];
    // Tetapkan tingkat log. Nilai default: LOG_LEVEL_INFO. Untuk memecahkan masalah, tetapkan tingkat ke LOG_LEVEL_TRACE.
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) {
     NSLog(@"strLog:%@", strLog);
    }];
  2. Kumpulkan log.

    Setelah Anda mereproduksi masalah, log secara otomatis dikeluarkan ke file log aplikasi Anda melalui saluran log aplikasi Anda.