All Products
Search
Document Center

ApsaraVideo VOD:FAQ pemutar Android

Last Updated:Jul 17, 2026

Masalah umum dan solusi untuk SDK ApsaraVideo Player untuk Android.

Masalah terkait lisensi

Atasi masalah lisensi tidak valid atau kedaluwarsa di FAQ Lisensi.

Masalah umum lintas platform

Masalah pengembangan

Dapatkan progres pemutaran saat ini

SDK pemutar melaporkan progres pemutaran setiap 500 ms secara default. Sesuaikan interval callback sesuai kebutuhan:

// Ubah interval callback.
PlayerConfig config = mAliyunLivePlayer.getConfig();
config.mPositionTimerIntervalMs = 100;// Interval callback dalam milidetik.
mAliyunLivePlayer.setConfig(config);

mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(InfoBean infoBean) {
        if(infoBean.getCode() == InfoCode.CurrentPosition){
            // Progres pemutaran saat ini.
            long currentPosition = infoBean.getExtraValue();
        }
    }
});

Dapatkan data audio dan video sumber

Untuk mengambil data audio dan video mentah, alihkan ke decoding software dan putar video yang tidak terenkripsi:

// Alihkan ke decoding software.
mAliPlayer.enableHardwareDecoder(false);
IPlayer.RenderFrameCallbackConfig renderFrameCallbackConfig = new IPlayer.RenderFrameCallbackConfig();
// Menentukan apakah hanya mengembalikan alamat data video dasar. Nilai default: true.
renderFrameCallbackConfig.mVideoDataAddr = false;
// Menentukan apakah hanya mengembalikan alamat data audio dasar. Nilai default: false.
renderFrameCallbackConfig.mAudioDataAddr = false;
mAliPlayer.setRenderFrameCallbackConfig(renderFrameCallbackConfig);

mAliPlayer.setOnRenderFrameCallback(new IPlayer.OnRenderFrameCallback() {
    @Override
    public boolean onRenderFrame(FrameInfo frameInfo) {
        return false;
    }
});

Dapatkan lebar dan tinggi video

Ambil lebar dan tinggi video menggunakan salah satu metode berikut:

  • Setelah instans AliPlayer memasuki status `prepared`:

    mAliyunPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
              mAliyunPlayer.getVideoWidth();
                  mAliyunPlayer.getVideoHeight();
        }
    });
  • Dengarkan callback perubahan ukuran video:

    mAliyunPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
    
        }
    });
  • Gunakan informasi track:

    mAliyunPlayer.setOnTrackReadyListener(new IPlayer.OnTrackReadyListener() {
        @Override
        public void onTrackReady(MediaInfo mediaInfo) {
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
            for (TrackInfo trackInfo : trackInfos) {
            if(trackInfo.getType() == TrackInfo.Type.TYPE_VIDEO){
            trackInfo.getVideoWidth();
            trackInfo.getVideoHeight();
            }
        }
        }
    });

Dapatkan data piksel untuk setiap frame video

Ambil data piksel dengan mendengarkan callback OnRenderFrameCallback:

player.setOnRenderFrameCallback(frameInfo -> {
    if (frameInfo.frameType == FrameInfo.FrameType_video) {
        // Data video
    } else {
        // Data audio
    }
    return false;
});

Logika pengalihan bitrate otomatis

Saat Anda memanggil mAliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX) untuk mengaktifkan pengalihan bitrate otomatis, SDK pemutar menghitung kecepatan jaringan. Jika kecepatan tersebut mampu mendukung level bitrate berikutnya selama 10 detik, pemutar akan beralih. Jika tidak, pemutar tetap pada bitrate saat ini.

  • Dari tinggi ke rendah: jika kecepatan jaringan mencapai level bitrate berikutnya dalam waktu 10 detik, pemutar menyelesaikan konten bitrate tinggi yang telah di-cache sebelum beralih.

  • Dari rendah ke tinggi: pemutar langsung beralih begitu kecepatan jaringan mampu mendukung bitrate yang lebih tinggi selama 10 detik.

Untuk menggunakan pengalihan bitrate otomatis, transkode video menjadi aliran bitrate adaptif di Konsol, lalu konfigurasi pemutar untuk mengambilnya. Contoh dengan VidAuth:

VidAuth vidAuth = new VidAuth();
List<Definition> list = new ArrayList<>();
list.add(Definition.DEFINITION_AUTO);
vidAuth.setDefinition(list);

Logika retry kustom

Secara default, SDK pemutar melakukan retry dua kali dengan timeout jaringan 15 detik per percobaan. Jika kedua retry gagal, callback `Error` akan dipicu.

Untuk menyesuaikan logika retry, atur jumlah retry menjadi 0 dan tangani event retry secara eksternal:

PlayerConfig config = mAliPlayer.getConfig();
// 1. Atur jumlah retry. Pada contoh ini, diatur menjadi 0.
config.mNetworkRetryCount = 0;
mAliPlayer.setConfig(config);

mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        // 2. Dengarkan event retry.
       if(infoBean.getCode() == InfoCode.NetworkRetry){
            // TODO: Proses logika sesuai kebutuhan.
        }
    }
});

Terjadi error unsupported protocol saat pemutaran aliran ARTC

Penyebab 1: SDK pemutar telah diintegrasikan, tetapi layer bridge (AlivcArtc) dan komponen Real-Time Streaming (RTS) (RtsSDK) belum diintegrasikan.

Solusi: Integrasikan komponen yang diperlukan. Implementasikan penarikan aliran RTS di Android.

Penyebab 2: Versi layer bridge (AlivcArtc) tidak sesuai dengan versi pemutar.

Solusi: Pastikan layer bridge (AlivcArtc) dan pemutar menggunakan versi yang sama. Implementasikan penarikan aliran RTS di Android.

Penyebab 3: Komponen RTS (RtsSDK) belum dimuat.

Solusi: Muat komponen RTS (RtsSDK) di file Application atau Activity target sesuai kebutuhan.

static {
    System.loadLibrary("RtsSDK");
}

Penyebab 4: Versi minSDK terlalu tinggi, sehingga layer bridge (AlivcArtc) tidak dimuat dengan benar.

// 1. Ubah minSdk
Turunkan minSdk ke 21

// 2. Muat manual library ARTC
static {
    System.loadLibrary("RtsSDK");
    System.loadLibrary("cicada_plugin_artcSource");
}

Bilah progres melompat mundur setelah operasi seek

Penyebab: Pemutar menggunakan seek tidak akurat secara default dan memulai pemutaran dari keyframe terdekat.

Solusi: Alihkan ke mode seek akurat.

Cara beralih antara mode seek akurat dan tidak akurat

Beralih antara mode seek:

// Seek tidak akurat.
mAliPlayer.seekTo(1000);
mAliPlayer.seekTo(1000, IPlayer.SeekMode.Inaccurate);
// Seek akurat.
mAliPlayer.seekTo(1000,IPlayer.SeekMode.Accurate);

Bilah progres tetap melompat mundur setelah beralih ke mode seek akurat

Penyebab: Jika jarak dari titik seek ke keyframe terdekat melebihi interval maksimum seek akurat, SDK pemutar akan kembali ke mode seek tidak akurat, menyebabkan bilah progres melompat.

Solusi: Tingkatkan interval maksimum seek akurat untuk mengurangi fallback ke seek tidak akurat. Interval yang lebih panjang meningkatkan akurasi tetapi mungkin memperpanjang waktu seek:

// Satuan: ms.
mAliPlayer.setMaxAccurateSeekDelta(10000);

Cache lokal: Apakah direktori cache dapat diatur ke direktori penyimpanan internal?

Ya. Atur direktori cache ke penyimpanan internal, tetapi pastikan aplikasi memiliki izin akses yang diperlukan.

Terjadi error `encrypt check fail` saat caching video

Jika unduhan aman diaktifkan, file verifikasi enkripsi harus sesuai dengan informasi aplikasi Anda. Unduh file tersebut dari Unduhan offline dan simpan ke SDK pemutar. Unduhan video. Ketidaksesuaian file menyebabkan kegagalan caching atau unduhan.

Masalah pemutaran

Terjadi crash saat membuat pemutar

Pecahkan masalah sebagai berikut:

  1. Periksa apakah arsitektur CPU adalah x86.

    SDK pemutar hanya mendukung arsitektur arm64-v8a dan armeabi-v7a. SDK tidak mendukung arsitektur x86.

  2. Periksa apakah file .so dan dependensi Maven untuk SDK pemutar telah diintegrasikan dalam proyek.

    Sebagai contoh, Anda mungkin telah mengintegrasikan SDK pemutar menggunakan dependensi Maven di `build.gradle` dan juga mengintegrasikan library dinamis terkait pemutar di direktori `libs` modul proyek.

    Disarankan: Hapus library dinamis dan gunakan hanya dependensi Maven. Jika Anda harus menggunakan library dinamis, pastikan semua file .so berasal dari versi yang sama. Integrasikan SDK. File library dinamis berikut terkait dengan pemutar: libalivcffmpeg.so, libsaasCorePlayer.so, dan libsaasDownloader.so.

  3. Jika Anda mengintegrasikan paket parsial, pastikan dependensi versi AlivcFFmpeg sudah benar.

    Untuk informasi tentang dependensi versi AlivcFFmpeg, lihat Dependensi versi AlivcFFmpeg.

Terjadi crash saat pemutar sedang berjalan

Pecahkan masalah sebagai berikut:

  1. Konfirmasi apakah crash terjadi di SDK pemutar.

    Periksa adanya stack crash dengan awalan AliyunPlayer. Jika ada stack dengan awalan tersebut, masalah berada di SDK pemutar.

  2. Upgrade ke versi terbaru SDK pemutar dan verifikasi apakah masalah telah teratasi.

  3. Jika masalah tetap ada, kumpulkan file crash (termasuk semua thread), log crash, dan detail skenario. Cara mengambil log masalah.

Muncul bar hitam selama pemutaran video

Pecahkan masalah sebagai berikut:

  1. Periksa apakah video sumber itu sendiri memiliki bar hitam.

  2. Anda dapat menyesuaikan mode penskalaan pemutar menggunakan antarmuka berikut.

    /*
    SCALE_ASPECT_FILL: Mengisi layar secara proporsional. Video dipotong.
    SCALE_ASPECT_FIT: Menskalakan video secara proporsional. Bar hitam mungkin muncul.
    SCALE_TO_FILL: Mengisi layar tanpa mempertahankan proporsi. Video terdistorsi.
    */
    mAliPlayer.setScaleMode();
  3. Jika mode penskalaan tidak memenuhi kebutuhan Anda, Anda dapat menyesuaikan ukuran SurfaceView atau TextureView di lapisan aplikasi.

Audio diputar tetapi tidak ada tampilan video

Pecahkan masalah sebagai berikut:

  1. Mainkan video dengan pemutar lain untuk memeriksa apakah file tersebut hanya berisi audio.

  2. Verifikasi bahwa tampilan display dikonfigurasi dengan benar dan tidak dihapus dari antarmuka pemutaran. Atur tampilan display seperti yang dijelaskan dalam Langkah 4 di Fitur dasar.

Terjadi error `Invalid argument` saat memutar video lokal meskipun memiliki izin baca

Periksa nama file dan jalur mutlak. Hindari menggabungkan karakter Tionghoa dan spasi dalam jalur tersebut.

Terjadi error `Permission denied` saat memutar video lokal meskipun memiliki izin baca

Pada Android 10 (Android Q) atau versi lebih baru, tambahkan android:requestLegacyExternalStorage="true" ke tag application di AndroidManifest.xml untuk menangani fitur scoped storage.

Terjadi error `Redirect to a url` sesekali selama pemutaran video

Error ini dapat terjadi karena DNS hijacking. Aktifkan HTTPDNS untuk mengatasinya. Konfigurasi HTTPDNS untuk Android.

Bilah notifikasi hitam berkedip pada layar bernotch saat pemutaran layar penuh

Anda dapat mengatasi hal ini dengan mengatur status bar imersif.

Gagal memutar video MOV

SDK pemutar mendukung video MOV. Pemutaran dapat gagal jika atom moov terletak setelah atom mdat dalam file sumber. Transkode video untuk memindahkan atom moov sebelum atom mdat. Langkah 2: Pecahkan masalah aliran.

Terjadi error saat inisialisasi atau pemutaran, menunjukkan bahwa library dinamis .so SDK pemutar tidak ditemukan

Pecahkan masalah sebagai berikut:

  1. Periksa apakah arsitektur CPU memenuhi persyaratan.

    SDK pemutar hanya mendukung library dinamis untuk arsitektur arm64-v8a dan armeabi-v7a.

  2. Periksa apakah versi SDK pemutar terlalu lama.

    Jika Anda menggunakan SDK pemutar V5.4.6.0-full atau lebih lama, upgrade ke V5.4.6.0-full-15467853 atau versi lebih baru. Catatan rilis SDK Android.

Terjadi error saat menggunakan AliListPlayer untuk memutar video HLS (m3u8)

Pemutar daftar AliListPlayer mendukung video HLS (m3u8) mulai dari V5.4.5.0, tetapi caching lokal harus diaktifkan. Cache lokal.

Apakah SDK pemutar Android mendukung pemutaran video dari folder assets dan raw dalam proyek Android?

Tidak. Salin video ke penyimpanan perangkat dan gunakan jalur mutlak untuk pemutaran.

Terjadi error 403 dan pemutaran gagal setelah mengonfigurasi caching lokal untuk aliran video HLS

Gejala: Saat Anda memutar aliran video HLS (M3U8) menggunakan metode pemutaran VidAuth dengan caching lokal diaktifkan, pemutaran gagal dan error 403 dilaporkan.

Penyebab: Setelah caching lokal diaktifkan, jika Anda keluar dari pemutaran sebelum video sepenuhnya di-cache, bagian yang belum di-cache akan diminta menggunakan informasi VidAuth yang kedaluwarsa dari sesi sebelumnya saat Anda memulai pemutaran berikutnya. Hal ini menyebabkan kegagalan autentikasi dan error 403.

Solusi: Untuk SDK pemutar V5.5.4.0 dan versi lebih baru, jika URL pemutaran video berisi parameter autentikasi dan protokol pemutaran adalah HLS, Anda dapat mengatur bidang PlayerConfig.mEnableStrictAuthMode untuk memilih mode autentikasi yang berbeda. Nilai default adalah `false`.

  • Autentikasi non-ketat (false): Autentikasi di-cache. Jika hanya sebagian media yang di-cache sebelumnya, pemutar menggunakan autentikasi yang di-cache untuk permintaan berikutnya. Jika autentikasi URL memiliki periode validitas singkat atau pemutaran dilanjutkan setelah jeda panjang, autentikasi mungkin kedaluwarsa. Integrasikan dengan pembaruan otomatis sumber pemutaran untuk menangani kedaluwarsa autentikasi.

  • Autentikasi ketat (true): Autentikasi tidak di-cache. Autentikasi dilakukan setiap kali startup, menyebabkan kegagalan startup tanpa jaringan.

Apakah SDK pemutar Android mendukung play-while-downloading?

Tidak. SDK pemutar melakukan caching dan mengunduh file video selama pemutaran saat caching lokal diaktifkan. File yang di-cache diputar langsung pada pemutaran berikutnya. Memindahkan file yang di-cache dari direktori aslinya tidak didukung.

Apakah SDK pemutar Android mendukung pengambilan kecepatan buffering video?

Ya. SDK pemutar menyediakan kecepatan buffering, laju frame rendering real-time, bitrate audio dan video, serta bitrate unduhan jaringan. Dapatkan informasi pemutaran.

Pemutaran video HDR tidak normal

SDK pemutar saat ini tidak mendukung video HDR dengan sudut rotasi. Error pemutaran mungkin terjadi untuk video jenis ini.

Jika video ditranskode menjadi beberapa definisi, definisi mana yang diputar oleh SDK pemutar secara default?

Urutan pemutaran default adalah FD, LD, SD, HD, 2K, 4K, OD. Definisi. SDK pemutar memutar definisi pertama yang tersedia dalam urutan ini.

Cara menentukan definisi pemutaran default

Contoh:

// Metode pemutaran VidSts digunakan sebagai contoh.
VidSts vidSts = new VidSts();
// Kode untuk mengatur parameter seperti vid, AccessKeyId, AccessKeySecret, dan token dihilangkan. Untuk informasi lebih lanjut, lihat pengaturan pembuatan pemutar di topik Fitur Dasar.
/*
    Parameter 1: Definisi pemutaran yang diinginkan. Nilai yang valid: FD, LD, SD, HD, 2K, 4K, dan OD.
    Parameter 2: Menentukan apakah pemutaran definisi yang diinginkan diberlakukan. false: Tidak memberlakukan pemutaran definisi yang diinginkan. SDK pemutar mencari definisi untuk diputar berdasarkan urutan default. true: Memberlakukan pemutaran definisi yang diinginkan. Jika definisi yang diinginkan tidak ditemukan, video tidak diputar.
*/
vidSts.setQuality("",false);

Jika suatu definisi memiliki beberapa aliran, aliran mana yang diputar oleh SDK pemutar?

Jika suatu definisi memiliki beberapa aliran, SDK pemutar memutar aliran terbaru.

Masalah lainnya

Cara memutar video tanpa Watermark tetapi mengunduhnya dengan Watermark

Mentranskodekan video ke berbagai definisi. Video dalam definisi tersebut dapat diputar tanpa watermark dan diunduh dengan watermark.

Cara mendapatkan log masalah

Kirimkan log masalah untuk membantu dukungan teknis Alibaba Cloud menyelesaikan masalah Anda lebih cepat.

  1. Ambil log masalah.

    Atur tingkat log ke AF_LOG_LEVEL_TRACE sebelum mengumpulkan log. Dapatkan log SDK.

  2. Berikan log yang dihasilkan kepada dukungan teknis Alibaba Cloud.